JAVA

[JAVA]상속과 생성자

당고개 2023. 10. 18. 15:56

생성자는 상속받을 수 없습니다. 부모 클래스에서 생성자가 명시적으로 선언되어 있는 경우는 자식 클래스에서 필수적으로 부모의 생성자를 호출해야 하는 제약조건이 따릅니다.

super() 메서드를 이용한 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 ParentDog 클래스의 생성자 호출
    }
}

부모의 생성자가 명시적으로 선언되어 있는 경우 자식 클래스에서 부모의 생성자 중 하나를 반드시 호출해야 합니다.
그리고 부모의 생성자는 super() 를 이용하여 호출할 수 있습니다.
super(name)ParentDod(String name)에 매칭됩니다.

case 최소 하나 이상의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }
}

서로 다른 부모의 생성자가 두 개가 선언되어 있어도 최소한 하나 이상의 부모 생성자를 호출해야만 합니다.
즉, super(name)이나, super(name1, name2) 둘 중 하나를 자식 생성자 내에서 호출해야 합니다. 부모 생성자를 호출하려면 자식 생성자를 명시적으로 선언과 정의를 할 수 밖에 없습니다. 주의할 점은 super() 메서드는 자식 생성자 내부에서만 호출 가능하며 메서드에서 호출이 불가능합니다.

case 같은 형태의 부모 생성자 호출

public class ParentDog {
    String name;

    ParentDog(String name) {
        this.name = name;
    }

    ParentDog(String name1, String name2) {

    }
}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        super(name); // 부모 클래스의 ParentDog(String name)생성자 호출
    }

    ChildDog(String name1, String name2) {
        super(name1, name2); // 부모 클래스의 ParentDog(String name1, String name2)생성자 호출
    }
}

꼭 자식 생성자가 부모 생성자의 형태를 따라갈 필요는 없지만, 특별한 이유가 없다면 부모 생성자의 형태를 따라가는 것이 좋습니다.

super() 메서드를 명시적으로 호출하지 않아도 되는 예외

유일하게 super()를 명시적으로 호출하지 않아도 되는 경우가 존재합니다.

1. 부모 클래스의 생성자가 명시적으로 선언되어 있지 않은 경우
2. 부모 클래스의 생성자가 명시적으로 선언되어 있어도 기본 생성자만 명시되어 있는 경우

super() 를 명시적으로 선언하여 호출하지 않는다 하더라도, 내부적으로는 부모 생성자를 호출합니다.

case 기본 생성자만 명시적으로 선언되어 있는 경우

public class ParentDog {
    String name;

    ParentDog() {
        this.name = "이쁜 강아지"
    }

}
public class ChildDog extends ParentDog {
    ChildDog(String name) {
        // super(); 생략 가능
   }

    ChildDog(String name1, String name2) {
       // super(); 생략 가능
   }
}

NOTE! 매개변수가 없는 생성자를 기본 생성자라고 합니다. 명령어의 존재여부와 상관 없습니다.

super의 엄밀한 의미

super를 키워드라고 얘기했지만, 좀 더 깊에 들어가면 슈퍼 클래스의 인스턴스에 접근할 수 있도록 하는 포인터를 뜻합니다. 즉 super()는 super라는 포인터를 통하여 슈퍼 클래스의 생성자를 호출할 수 있도록 합니다.

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/P7ZPSAYTKJA1CV0N

'JAVA' 카테고리의 다른 글

[JAVA]오버라이드(Override)  (0) 2023.10.23
[JAVA]다형성  (0) 2023.10.19
[JAVA]상속  (0) 2023.09.21
[JAVA]String 메서드  (0) 2023.09.21
[JAVA]String 객체와 문자열 상수  (0) 2023.09.20