[Java] 클래스 상속
상속
Java에서 상속은 현실에서 부모가 자식에게 물려주는 상속이랑 매우 유사하다.
상송을 통해 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다.
클래스를 재사용해서 새로운 클래스를 만들기 때문에 시간과 코드의 중복을 줄여주기 때문에 보다 효율적이다.
class Product{
int count;
String color;
}
class CellPhone extends Product{
String name;
}
CellPhone클래스는 Product 클래스를 상속 받는다.
따라서 CellPhone의 멤버로는 Product클래스의 멤버인 count와 color를 기본적으로 가지면서,
추가적으로 따로 선언해주었기 때문에 name 필드도 가진다.
class CellPhone extends Product, Item{
} //절대 안됨
다음과 같이 하나의 클래스가 둘 이상의 여러 클래스로부터 상속받는 것은 안된다.
즉 다중 상속은 지원하지 않는다.
super()
상속을 했을 경우 자식 객체를 생성하면 부모 객체가 먼저 생성된다. 그리고 객체는 생성자를 통해 생성된다.
즉. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다.
class CellPhone extends Product{
CellPhone(){
super();
}
}
super()는 부모 클래스의 생성자를 호출한다.
이는 생성자를 선언하지 않았을 때 자동으로 호출되기도 하고, 내가 직접 부모 생성자를 호출하고 싶다면
명시적으로 호출할 수 있다.
class Product {
String name;
int price;
Product(String name ,int price){
this.name = name;
this.price = price;
}
}
class CellPhone extends Product{
CellPhone(String n, int p){
super(n,p);
}
}
CellPhone( )생성자에 매개변수로 name 정보의 n과 price p를 주고 생성자 안에서 super를 호출했다.
그리고 super를 호출하면서 n과 p를 매개변수로 넘겨주었다.
이는 곧 부모 Product()생성자에 n과 p를 매개변수로 넘긴 것과 같은 것이다.
따라서 Product의 생성자에 따라 이 객체의 name = n; price = p; 가 된다.
만약 부모 클래스에 매개변수를 가진 생성자만 정의되어있는 상태에서 자식 클래스에서 디폴트 생성자를 호출하면?
class Product {
String name;
int price;
Product(String name ,int price){ //매개변수 있는 생성자만 정의
this.name = name;
this.price = price;
}
}
class CellPhone extends Product{
CellPhone(){ //디폴트 생성자 - > 부모의 디폴트 생성자 호출.
}
}
이 경우에는 부모에 디폴트 생성자가 명시적으로 정의되어 있지 않아 오류가 발생한다.
만약에 부모 클래스에 어떠한 생성자도 정의 되어있지 않았다면 자동으로 디폴트 생성자.
즉, 기본 생성자를 만들어 호출 했을 것이다.