정보처리기사 때 헷갈렸던 개념을 이제서야 정리해본다.
super
- 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
- 조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있지만 서로 구별해야하는 경우에 super를 사용하는 것이 좋다.
super 예제코드1
조상 클래스와 자손 클래스의 멤버 변수가 같은 경우
public class SuperTest {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x= " + x);
System.out.println("this.x= " + this.x);
System.out.println("super.x= " + super.x);
}
}
이 처럼 조상 클래스에 선언된 멤버변수와 같은 이름의 멤버변수를 자손 클래스에서 중복해서 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.
super 예제코드2
오버라이딩에서의 super
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩
//return "x :" + x + ", y : " + y + ", z : " + z;
return super.getLocation() + ", z : " + z;
}
}
조상 클래스의 메서드의 내용에 추가적으로 작업을 덧붙이는 경우라면 이처럼 super를 사용해서 조상 클래스의 메서드를 포함시키는 것이 좋다. 후에 조상 클래스의 메서드가 변경되더라도 변경된 내용이 자손 클래스의 메서드에 자동으로 반영될 것이기 때문이다.
super() - 조상 클래스의 생성자
- 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.
- 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기에 생성자의 첫 줄에서 조상 클래스의 생성자를 호출해야한다.
super 예제코드3
자손 클래스에서의 조상 클래스 생성자 호출
public class SuperTest3 {
public static void main(String[] args) {
Point3D p3 = new Point3D(1,2,3);
}
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getLocation() {
return "x :" + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() { //오버라이딩
return super.getLocation() + ", z : " + z;
}
}
Point3D 클래스의 생성자에서 조상 클래스의 생성자인 Point()를 찾을 수 없어 컴파일 에러가 발생했다.
Point3D 클래스의 생성자 첫 줄이 생성자를 호출하는 문장이 아니기에 컴파일러는 자동으로 'super();'를 Point3D클래스의 생정자의 첫 줄에 넣어준다.
그러나, 조상 클래스에 생성자 Point()가 정의되어 있지 않기 때문에 위와 같은 컴파일 에러가 발생하였다.
이 에러를 수정하려면, Point 클래스에 생성자 Point()를 추가해주던가, 아래와 같이 Point(int x, int y) 생성자를 호출하도록 변경하면 된다.
Point3D(int x, int y, int z) {
super(x, y);
this.x = x;
this.y = y;
this.z = z;
}
조상 클래스의 멤버변수는 이처럼 조상의 생성자에 의해 초기화되도록 해야한다.
'JAVA' 카테고리의 다른 글
[Java] Java의 정석 - JVM의 메모리 구조 (0) | 2024.07.19 |
---|