ch7-10. 참조변수 super
super는 객체 자신을 가리키는 참조변수이다. 인스턴스 메서드, 생성자에서만 사용가능하다. static 메서드에서는 사용 불가능하다. 이는 this와 비슷하다. this는 lv, iv를 구별할 때 사용했다. super는 조상 멤버와 자신 멤버를 구별할 때 사용한다.
Child는 멤버가 Parent의 멤버 x 1개, 자신의 멤버 x, method 2개 해서 총 3개이다. 이를 객체로 그려보면 위와 같은데 같은 x이지만 하나는 조상의 것이어서 super.x이고 다른 하나는 this.x이다. 이름이 같더라도 객체는 따로 만들어진다. 이를 구분하기 위해서 super, this를 사용한다.
c.method( )가 실행되면 첫 문장의 x는 가까운 20이 출력된다. this.x는 20, super.x는 10이 출력된다.
중요한 포인트는 이름이 같은 멤버를 상속받아도 둘 다 객체가 존재한다. 이를 구분하기 위해서 super를 사용한다.
Child2는 x가 없기 때문에 모든 호출 결과가 10이 나온다. 조상 멤버를 상속받으면 위와 같이 객체가 생성되므로 super와 this 둘 다 사용 가능하다.
super, this 둘 다 참조변수이다. 같은 주소값이 들어가기 때문에 같은 값이 나오게 된다.
ch7-11. super( ) - 조상의 생성자
⭐ super( )는 super와 전혀 관계 없다. super( )는 조상의 생성자를 호출할 때 사용한다. 상속에서 모든 멤버를 상속받을 수 있지만 생성자, 초기화 블록은 상속이 불가능하다. 조상의 멤버는 조상의 생성자를 호출해서 초기화해야 한다. 따라서 오른쪽과 같이 자손에서 직접 조상의 멤버를 초기화하면 안 된다. 자신의 멤버만 초기화해야 한다.(this.z = z;)
아래와 같이 super(x, y); 조상의 클래스 생성자를 호출해서 초기화한다. super를 쓰는 이유는 조상임을 명시하기 위해 class 이름인 Point 대신에 사용한다.
Point class의 생성자는 2개가 있다. 첫 번째 생성자는 this(0, 0)이 있어 첫 줄에 생성자를 호출해야 하는 규칙을 만족한다. 두 번째 생성자는 생성자 호출이 없기 때문에 컴파일 할 때 컴파일러가 조상 기본 생성자를 호출해서 super( );를 넣어서 오른쪽과 같이 만들어준다.
⭐⭐⭐
main 메서드에서 Point3D를 생성하면, javac error가 난다. javac error는 컴파일 에러이다. constructor Point( )의 뜻은 생성자가 없다는 말이다. Point3D를 생성했는데 왜 Point( )의 생성자가 없다고 나올까?
모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 super( );를 넣는다.
Point class의 생성자 첫 줄에 다른 생성자가 없어 컴파일러가 super( );를 자동추가한다. super( );의 의미는 Point의 조상인 Object 클래스의 생성자이다. Point3D도 마찬가지로 생성자 첫 줄에 생성자가 없어 super( );를 컴파일러가 자동 생성해준다. 이 super( );는 조상인 Point의 기본 생성자이다. 하지만 Point에는 생성자가 있기 때문에 기본 생성자를 컴파일러가 따로 넣지 않는다. 따라서 constructor Point( )에 생성자 error가 나는 이유이다.
error를 해결하는 방법은 Point에 기본 생성자를 만들거나, Point3D 생성자 첫 줄에 super(x, y);를 적는다. super(x, y);는 조상 생성자 Point(int x, int y); 이므로 호출 가능하다. 조상의 맴버는 조상이 초기화 하는 super(x, y);가 맞긴 하지만 그래도 기본 생성자는 항상 추가하자.
'자바 > 자바의 정석 Ch.7 객체지향 프로그래밍 II' 카테고리의 다른 글
ch7-15, 16 import문, static import문 (0) | 2023.04.16 |
---|---|
ch7-12~14 패키지, 클래스 패스 (1) | 2023.04.16 |
ch7-7~9 오버라이딩(overriding) (0) | 2023.04.13 |
ch7-5,6 단일상속 (0) | 2023.04.13 |
ch7-3,4 클래스 간의 관계, 상속과 포함 (0) | 2023.04.13 |