생성자는 상속을 할 수 없는데요. 이번 강의에서 상속시에 어떻게 생성자에 대해 처리하는지 배워봅시다.
이전 강의에서 상속을 받을 수 있는 요소는 변수와 메서드라고 설명했는데요. 다시 말하면 생성자는 상속받을 수 없습니다. 부모 클래스에서 생성자가 명시적으로 선언되어 있는 경우는 자식 클래스에서 필수적으로 부모의 생성자를 호출해야 하는 제약조건이 따릅니다.
ㅤ
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)
은 ParentDog(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()
를 명시적으로 선언하여 호출하지 않는다 하더라도, 내부적으로는 부모 생성자를 호출합니다.
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()를 쓰지 않아도 되는 경우에서, 부모의 생성자가 기본생성자인 경우를 말씀해주셨는데 기본생성자는 매개변수와 명령어가 없어야 하지 않나여??
안녕하세요. 코드라떼입니다 :) 기본 생성자는 매개 변수가 없는 생성자입니다. 명령어의 존재 여부는 상관없습니다. public class ParentDog { String name; ParentDog() { // 기본 생성자 this.name = "이쁜 강아지" } } 감사합니다.
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)
은 ParentDog(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()
를 명시적으로 선언하여 호출하지 않는다 하더라도, 내부적으로는 부모 생성자를 호출합니다.
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()를 쓰지 않아도 되는 경우에서, 부모의 생성자가 기본생성자인 경우를 말씀해주셨는데 기본생성자는 매개변수와 명령어가 없어야 하지 않나여??
안녕하세요. 코드라떼입니다 :) 기본 생성자는 매개 변수가 없는 생성자입니다. 명령어의 존재 여부는 상관없습니다. public class ParentDog { String name; ParentDog() { // 기본 생성자 this.name = "이쁜 강아지" } } 감사합니다.
super() 메서드의 쓰임새를 확인해보세요