본문 바로가기
Java/이론 및 용어

디폴트 생성자의 super() 의미

by tokkiC 2022. 8. 1.

이클립스 등의 IDE에서 서블릿을 생성시 아래 처럼 디폴트 생성자를 만들어주며, 그 안에는 super()가 있다

@WebServlet("/today")
public class TodayServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TodayServlet() {
        super();
    }
자바에서는 명시적으로 생성자를 작성하지 않을 시, 자동으로 디폴트 생성자를 만들어준다 

라고 알고 있다. 그러나 써도 코드의 수행에는 아무 문제가 없기에 냅두고 있었다

하지만! 부스트코스 코드 리뷰에서 리뷰어 moons님의 답변을 보면

"불필요한 또는 잘못된 주석은 같이 협업하는 개발자로 하여금 혼란을 야기 시킬 수 있습니다."

그렇다. 굳이 필요없는 코드를 쓰면 혹시 어떤 의미를 전달하고자 쓴것인가 헷갈릴 수 있기에 

암시적으로 생성되는 경우는 굳이 명시적으로 작성하면 오히려 마이너스가 될 수 있다

그런데 한가지 추가로 궁금한점은

디폴트 생성자 안에 왜 super() 가 있을까?

확실하게는 모르니까 제대로 알아보자

왜냐면, 어느 서브 클래스의 디폴트 생성자를 실행하려면

그 서브 클래스의 상위 클래스(super)를 실행해야 하기때문이다

이는 마치 사자를 말하려면 사자의 상위 클래스인 동물을 말해야하고

동물을 말하려면 동물의 상위클래스인 생물을 말해야하는 것과 같다

객체지향의 특성을 생각해서 가장 상위의 클래스부터 설명해야만 구체적인 것을 설명가능 한 것이다

위 코드에서는 TodayServlet의 생성자를 실행하여 Heap에서 인스턴스화하려면

먼저 상위 클래스인 HttpServlet를 인스턴스화 해야하고, 그걸 위해서

HttpServlet의 상위 클래스를 먼저 인스턴스화 하는 과정을 반복하고, 결국 최상위 클래스인

Java.lang.Object 까지 올라가서 Java.lang.Object를 생성자로 인스턴스화(실체화) 시켜서

Heap에 올려 다시 아까의 아래의 것들을 생성자로 실행해서 인스턴스화 시키게 되는 과정이 생략되어있다

java IED에서 디폴트 생성자를 만들면 하지만 super()는 따로 명시적으로 쓰지 않아도 생성해주게된다

그러므로 그냥 디폴트 생성자 내의 super() 도 같이 지워도 아무문제 없다는 말이다!

아래는 서브 클래스의 디폴트 생성자를 실행해서 인스턴스화 시키기 위해

그 서브클래스의 슈퍼 클래스로 계속 타고 올라가는 과정을 그림으로 나타낸 것이니 참고하자 

이미지 출처 : http://www.smhrd.or.kr/    https://journey322.tistory.com/entry/%EC%8A%A4%EB%A7%88%ED%8A%B8%EC%9D%B8%EC%9E%AC%EA%B0%9C%EB%B0%9C%EC%9B%90-JAVA-%EC%83%81%EC%86%8D

 

댓글