참조변수 super
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
- 조상의 멤버를 자신의 멤버와 구별할 때 사용
ex1)
Parent 클래스와 child클래스가 생성되어있다. child클래스는 상위클래스인 Parent 를 상속받고 있으며
각 클래스에는 int x 변수가 들어있다. c.method() 메서드를 호출하면 참조변수 c가 가르키는 child 객체가 생성된다.
이름이 겹칠 때에는 조상의 멤버에는 Super. , 자신의 멤버에는 this.을 사용하여 구별한다.
결과
x = 20
this.x = 20
super.x = 20
ex2)
ex1과 비슷하지만 상위클래스인 Parent2에만 int x 변수가 있다. x가 상위클래스에 하나밖에 없기 때문에 Super.x 와
this.x 둘다 사용이 가능하며 같은 변수 int x = 10; 을 가리킨다.
생성자 super()
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
조상의 멤버를 자손의 생성자가 초기화하는 것보다 자신이 선언한 것만 초기화 하는 것이 바람직하다.
조상의 생성자를 호출하여 초기화할 수 있게 하고 자신의 멤버만 초기화한다.
Point3D(int x, int y , int z){
super(x,y); //조상클래스의 생성자 Point(int x, int y )를 호출
this.z = z; //자산의 멤버를 초기화
}
super() 조상의 생성자
▶생성자의 첫 줄에 반드시 생성자를 호출해야 한다 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super(); 를 삽입
Point() 메서드에는 자기자신의 생성자를 호출하였고 Point(int x , int y) 는 첫줄에 생성자 호출이 되지 않았다.
Point클래스의 조상인 Object의 기본생성자를 호출하는 super() 코드가 들어간다.
위의 코드를 실행하면 컴파일 에러가 발생한다. 에러가 발생하는 이유로는 point() 와 point3D() 에는 생성자가 없고
앞서 모든 생성자는 첫줄 다른 생성자를 호출되어야 하기 떄문에 컴파일러에서 자동으로 super() 생성자를 호출한다. point() 에 super()가 자동추가되며 이것은 object 클래스의 생성자가 된다. 또 point3D 에도 super() 가 자동호출이 되고 point() 생성자를 가르키게 된다
Poing3D(int x, int y , int z) 에는 1,2,3 의 값이 들어가며 super()생성자로 인해 Point()를 호출하게 된다. Point()에는 기본생성자가 존재하지 않기 때문에 컴파일에러가 발생하게 된다.
'객체지향' 카테고리의 다른 글
다형성 (0) | 2021.11.08 |
---|---|
[상속] 제어자, static , final (0) | 2021.11.06 |
[상속] 오버라이딩 (0) | 2021.11.05 |
[상속] 단일상속 , Object클래스 (0) | 2021.11.05 |
[상속] 클래스간의 관계, 상속과 포함 (0) | 2021.11.04 |