개발놀이터

상속과 super 그리고 super() 본문

Java

상속과 super 그리고 super()

마늘냄새폴폴 2022. 9. 15. 14:46

구글링을 통해 많은 코드들을 보다보니 문득 궁금증이 생겼습니다. 

 

super, super() 이런게 뭘까? 스프링을 공부한다는 사람이 자바의 기본적인 문법도 모르는게 조금 부끄럽긴 하지만 그래도 모르니까 배우지 라는 마인드로 한번 포스팅 해보도록 하겠습니다. 

 

super


super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버 변수와 지역 변수의 이름이 같을 때 this를 사용해서 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있다.

조상클래스로부터 상속받은 멤버도 자손클래스 자신이 멤버이므로 super대신 this를 사용할 수 있다. 그래도 조상클래스의 멤버와 자손클래스의 멤버가 중복 정의되어 서로 구별해야하는 경우에만 super를 사용하는 것이 좋다.

조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 super와 this는 근본적으로 같다.

모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조변수인 this와 super의 값이 된다. 

static메서드는 인스턴스와 관련이 없다. 그래서 this와 마찬가지로 super역시 static메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다. 

 

super()


this()와 마찬가지로 super()역시 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 조상클래스의 생성자를 호출하는데 사용된다. 

자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손클래스의 인스턴스가 조상클래스의 멤버들을 사용할 수 있는 것이다. 

이 때 조상클래스 멤버의 생성과 초기화 작업ㅇ ㅣ수행되어야 하기 때문에 자손클래스의 생성자에서 조상클래스의 생성자가 호출되어야 한다.

생성자의 첫 줄에서 조상클래스의 생성자를 호출해야 하는 이유는 자손클래스의 멤버가 조상클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.

이와 같은 조상클래스 생성자의 호출은 클래스의 상속관계를 거슬러 올라가면서 계속 반복된다. 마지막으로 모든 클래스의 최고 조상인 Object 클래스의 생성자인 Object()까지 가서야 끝이 난다.

그래서 Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다. 그렇지 않으면 컴파일러는 생성자의 첫 줄에 super();를 자동적으로 추가할 것이다.

 

 

마치며

이렇게 super, super()에 대해서 알아봤습니다. 개인적으로 super를 한번도 사용해보지 않아서 지금까지 배우는 것을 미루고 미뤘던 것 같습니다.

 

지금에서나마 공부했으니 다행이라고 생각합니다. 다음에도 더 질 좋은 포스팅으로 찾아뵙도록 하겠습니다. 

 

 

Reference

플래시로 배우는 자바 (책)

'Java' 카테고리의 다른 글

Java8 StreamAPI  (1) 2024.04.28
ConcurrentMap, ConcurrentHashMap  (0) 2023.02.18
final 키워드  (0) 2022.08.04
try-with-resouce  (0) 2022.08.04
Optional  (0) 2022.08.04