[작성일: 2023. 01. 26]
목차
super
- 객체 자신을 가리키는 참조변수.
- 인스턴스 메서드(생성자) 내에서만 존재.
- lv와 iv 구별에 사용하는 this와 거의 비슷함.
- static 메서드 내에서 사용 불가
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
연습예제 1
class Ex7_2 {
public static void main(String args[]) {
Child c = new Child(); // 객체 생성
c.method();
}
}
class Parent { int x = 10l /* super.x */ }
class Child extends Parent {
int x = 20; //this.x
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
연습예제 2
class Ex7_3 {
public static void main(String args[]) {
Child2 c = new Child2();
c.method();
}
}
class Parent2 { int x = 10; /* super.x와 this.x 둘 다 가능 */}
// 조상에만 멤버 존재
class Child2 extends Parent2 {
void method() {
System.out.println("x=" + x); // 조상의 x
System.out.println("this.x=" + this.x); // 조상의 x
System.out.println("super.x=" + super.x); // 조상의 x
// 중복되지 않는 경우엔 this와 super가 같은 값을 가리킴.
}
}
super()
- 조상의 생성자를 호출할 때 사용
- 생성자와 초기화블럭은 상속되지 않음.
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
- 자손의 생성자는 본인이 선언한 것만 초기화해야 함.
- 생성자의 첫 줄에 반드시 생성자를 호출해야 함. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super(); 를 삽입함.
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
int r;
Point3D(int x, int y, int r) {
super(x, y);
// 조상 클래스의 생성자 Point(int x, int y)를 호출
this.r = r;
// 자신의 멤버를 초기화
}
}
연습예제 3
class PointTest {
public static void main(String args[]) {
Point3D p = new Point3D(1, 2, 3);
}
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x; // 첫 줄에 super(); 컴파일러가 자동추가 해줌.
this.y = y;
}
String getLocation() {
return "x: " + x + ", y: " + y;
}
}
class Point3D extends Point {
int r;
Point3D(int x, int y, int r) {
// 조상의 생성자 Point(int x, int y)를 호출
super(x, y);
this.r = r;
}
String getLocation() { // 오버라이딩
return "x: " + x + ", y: " + y + ", r: " + r;
}
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.