7-10 참조변수 super
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에서만 존재
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
this와 비슷하다 (this: iv와 lv를 구별하는데 사용)
static메서드 내에 사용 불가
조상 멤버에 super, 자신의 멤버 this
이름이 x로 같아도, 따로 만들어진다.
("x=" + x) < 여기서 x는 가까운 20이다.
x가 하나밖에 없어서 다 10이다.
조상 멤버긴 한데 상속을 받아서
super.x와 this.x 둘 다 가능하다.
super, this 둘 다 같은 주소를 갖는 참조변수가 된다.
중복되지 않은 경우 super.x와 this.x가 같은 변수를 가리킨다.
super.x와 this.x는 거의 같다.
멤버를 구별할 때는 다르지만
7-11 super() - 조상의 생성자
-조상의 생성자를 호출할 때 사용
-조상의 멤버는 조상의 생성자를 호출해서 초기화
-생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
super와 연관x
this()처럼 생성자다.
생성자와 초기화 블럭은 상속 X
자손의 생성자는 자기가 선언한 것(자신의 멤버)만 초기화해야 한다.
조상의 멤버를 초기화하면 안 된다.
맨 아래와 같이 super(x, y)로 조상 클래스의 생성자를 호출해야 된다.
super()는 조상의 생성자인데 자손 클래스에서 조상 생성자를 호출할 때 쓴다.
조상이 선언한 멤버들을 초기화하려면 내가 직접 하지 말고
조상의 생성자를 호출해서 조상의 생성자가 조상 멤버들을 초기화하게 해야 한다.
추가 조건 - 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다.
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
super(); < 조상의 기본 생성자 호출
super(); 생성자 호출의 의미는
Point클래스의 조상 Object클래스의 기본 생성자를 호출하는 코드가 들어간다.
javac: 컴파일러 에러
Point3D 객체를 만드는데 왜 Point 생성자가 없다고 나오는 거지?
Point(int x, int y){} 첫 줄에 다른 생성자 호출이 없음
그래서 컴파일러가 Object클래스의 기본 생성자를 호출하는 super(); 추가해준다.
Point3D(int x, int y, inz ){} 첫 줄에 다른 생성자 호출이 없음
그래서 컴파일러가 Point클래스의 생성자 super(); 추가해준다.
이 상태에서 main메서드에서 Point3D(1, 2, 3);을 호출하면
인수가 Point3D(int x, int y, int z){}로 넘어간다.
여기서 첫 줄에 Point클래스의 생성자를 호출하는 super();가 있다.
그런데 Point클래스의 생성자 Point(){}가 없다. (Point클래스의 기본 생성자)
Point클래스의 기본 생성자가 없는 이유는
이미 Point(int x, int y){}가 있어서 컴파일러가 기본 생성자를 안 넣어주는 것이다
그래서 기본 생성자 작성은 필수다.
에러 해결 방법
1. Point(){} 생성자 추가
2. 기본 생성자 호출 안 하게 맨 아래 그림처럼 코드 추가
Point3D(){
super(x, y);
}
(그래도 기본 생성자는 추가해주는 것이 좋다.)
6,7장 조건들을 무조건 암기하자
예제 7-2
public class Ex11 {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent { int x = 10; /*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);
}
}
결과
x=20
this.x=20
super.x=10
예제 7-3
public class Ex11 {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent { int x = 10; }
class Child extends Parent{
void method() {
System.out.println("x="+x);
System.out.println("this.x="+this.x);
System.out.println("super.x="+super.x);
}
}
결과
x=10
this.x=10
super.x=10
7-11 조상의 생성자 코드
class Ex6 {
public static void main(String[] args) {
Point3D p = new Point3D(1, 2, 3);
System.out.println(p.getLocation());
}
}
class Point extends Object{
int x, y;
Point(int x, int y){
super();
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){
super(x, y);
this.z = z;
}
String getLocation() {
return "x :" + x + ", y :"+ y + ", z :" + z;
}
}
'프로그래밍 언어 > 자바의 정석 기초편' 카테고리의 다른 글
자바의 정석 기초편 ch7-15, 16 import문, static import문 (0) | 2022.08.25 |
---|---|
자바의 정석 기초편 ch7-12~14 패키지, 클래스 패스 (0) | 2022.08.23 |
자바의 정석 기초편 ch7-7~9 오버라이딩 (0) | 2022.08.17 |
자바의 정석 기초편 ch7-5,6 단일 상속, Object클래스 (0) | 2022.08.17 |
자바의 정석 기초편 ch7-3,4 클래스 간의 관계, 상속과 포함 (0) | 2022.08.17 |