생성자가 상속이 되지 않는 이유

김민중·2024년 7월 4일
0

들어가기전,,

java를 사용하면서 문득 다음과 같은 의문이 들었습니다.

생성자도 상속이 되는건가?

클래스를 상속하면 해당 클래스의 멤버(필드,메소드)를 사용할 수 있습니다.
그리고 전 생성자도 일종의 메소드라고 생각을 해서 당연히 생성자도 상속이 될 거라고 생각하였습니다.

하지만 계속 생각을 할수록 생성자는 상속이 되지않는다는 생각이 들었습니다.
그 이유는 상속의 의미와 super()에서 찾았습니다.

그럼 상속이란 무엇일까?

자식 클래스가 부모 클래스의 멤버를 물려받는다.

보통 상속에 대해 이야기 할 때 위와 같은 이야기를 많이 합니다. 좀 더 추가하자면 필요에 따라 추가/편집도 할 수 있게 만듭니다.

저는 여기서 생성자도 멤버이기에 상속을 받지 않을까? 라는 생각을 하였습니다.

그렇지만 아래 코드처럼 자식 클래스에서 super()가 작성되어 있는 걸 볼 수 있습니다.

public class Pig extends Animal {
    public Pig() {
       super();
    }
}

super()는 작성을 하지 않아도 자동으로 호출이 됩니다. 여기서 제 생각이 바뀌었습니다.

생성자가 상속이 안되는 이유

저는 결론적으로 생성자는 상속받는 게 아닌 super()를 통해서 부모클래스의 생성자를 호출하기에 상속받는다고 생각을 하지 않습니다.

왜냐하면 super()를 통해 부모 클래스의 생성자를 호출하는데 상속을 또 받는다라는건 비효율적인 방법이기 때문입니다.

그럼 자바는 왜 생성자를 상속받는 형식이 아닌 super()를 통해 호출하는 형식을 설계를 했을까요? 제가 생각한 건 다음과 같습니다.

  1. 명확성

    생성자는 초반에 객체를 초기화 합니다. 자식 클래스는 부모 클래스와 다른 방식으로 초기화해야 할 수도 있습니다. 따라서 각 클래스가 자신만의 생성자를 가지고 있으면, 클래스의 초기화 로직을 명확하게 제어할 수 있습니다.

  2. 상속의 유연성

    만약 생성자가 상속되면 자식 클래스는 부모 클래스와 동일한 생성자 로직을 유지해야 합니다. 이는 자식 클래스의 유연성을 제한할 수 있습니다. 자식 클래스가 필요에 따라 독자적인 생성자를 정의할 수 있도록 하기 위해 생성자 상속을 제한합니다.

  3. 다양한 생성자 패턴

    클래스마다 초기화 하는 방법은 다를 수 있습니다. 따라서 생성자 상속을 하지 않는다면 자식 클래스가 다양한 생성자 초기회 로직을 가질 수 있도록 할 수 있습니다.

결론

생성자는 상속이 되지 않고 super()로 부모클래스의 생성자를 호출한다. 그 이유는 생성자를 상속한 경우보다 많은 이점이 있기 때문이다.

profile
개발블로그

0개의 댓글