1. super란?
(1) 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.
(2) 멤버 변수와 지역 변수가 이름이 같을 때 this를 사용하는 것처럼, super 또한 조상 클래스에서의 멤버 변수와
자손 클래스의 멤버 변수와 이름이 같을 때 사용된다.
(3) 모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역 변수로 저장되는데, 이것이 참조변수 this와 super의
값이 된다.
(4) this와 마찬가지로 super는 static 메서드에서 사용할 수 없다. 즉, 인스턴스 메서드에서만 사용이 가능하다.
2. super()
(1) this()와 마찬가지로 super() 역시 생성자이다.
(2) this()는 자신의 클래스에서 다른 생성자를 부르지만, super()는 조상 클래스의 생성자를 부른다.
(3) super()를 하면 최고 조상인 object 클래스의 생성자인 Object()까지 가야 끝이 난다.
(4) 첫 줄에서 super()를 정의해야 한다. 만약 정의하지 않는다면, 컴파일러가 자동적으로 추가해준다.
3. super()를 쓰는 이유
- 조상으로부터 상속받는 자손 클래스를 인스턴스 하나를 생성하면 조상과 자손의 멤버들을 사용할 수 있게 된다.
( 그렇기 때문에 조상의 멤버들 또한 초기화 작업을 자손의 생성자의 첫 줄에서 진행해야 한다. )
4. super()를 첫 줄에서 호출해야 하는 이유
- 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어
있어야 하기 때문이다.
5-1. 컴파일 에러가 왜 발생할까?
( 그 이유는 Circle에 생성자 Circle()이 자동적으로 추가되어지는데, 그러면 super()도 생성된다. )
( 그러나, super()인 Shape()가 없기 때문에 오류가 발생하게 된다. )
( 추가적으로 Circle() 생성자에 super(100); 을 넣어도 해결할 수 있다. )
5-2. 어떠한 것이 출력될까?
- 2가 출력된다.
( 이유는 변수 같은 경우 먼저 자신의 인스턴스부터 찾아보고 없으면 부모로 거슬러 올라가기 때문이다. )
( 단, 메서드 같은 경우는 자신의 인스턴스부터 찾지만 자식에게 존재한다면 반대로 자식으로 내려간다. )
( 답이 1인지 2인지 프로그래머 입장에서 봤을 때는 헷갈릴 수 있으므로, this. 또는 super. 를 앞에 써서 구분하자. )
5-3. 컴파일 에러가 발생하는 이유
- 컴파일러가 자동으로 super()을 넣어주지만, 위 6번째 줄에서는 super()가 아닌 super(x,y)의 형태를
원하기 때문이다.
( 그러므로, 아래와 같이 초기화를 해주면 된다.)
6. super의 활용
( 위 코드처럼 super를 써서 코드의 간결함을 유지해준다. )