상속
OOP의 핵심이라 여겨지는 특성이며, 다형성의 기반이 된다.
이미 존재하는 클래스를 기반으로 새 클래스를 만드는 방법이다.
↘부모 클래스 ↘자식 클래스
새 클래스는 기존 클래스의 동작과 상태를 그대로 물려받는다.
그 외에 새 클래스만의 동작과 상태를 추가를 할 수 있다.
※ JAVA에서 상속은 단일 상속만 허용한다. 다중 상속은 불가능
개, 고양이, 앵무새를 만든다고 했을 때
class dog{
public String name;
public int age;
public String sex;
public void walk(){ }
public void eat() { }
public void shout(){ }
public dog(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
}
class cat{
public String name;
public int age;
public String sex;
public void walk(){ }
public void eat() { }
public void shout(){ }
public cat(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
}
class parrot{
public String name;
public int age;
public String sex;
public void walk() { }
public void fly() { }
public void eat() { }
public void shout() { }
public cat(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
}
이때 개, 고양이, 앵무새의 중복 코드는
public String name;
public int age;
public String sex;
public void walk(){ }
public void eat() { }
public void shout(){ }
개와 고양이, 앵무새는 공통으로 애완동물이기에
이름, 나이, 성별이라는 상태를 가지고
걷기, 먹기, 소리내기라는 동작을 가지기에 공통 분모로 뺄 수 있는 것이다.
따라서 이를 클래스로 만들어주면 된다.
class animal{
public String name;
public int age;
public String sex;
public void walk() { }
public void eat() { }
public void shout() { }
public animal(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
}
상속하는 방법은
extends 부모 클래스
class dog extends animal{
public dog(){
}
}
class cat extends animal{
public cat(){
}
}
class parrot extends animal{
public void fly() { }
public parrot(){
}
}
이때 이 코드를 실행하면 컴파일 오류가 발생하는데
생성자의 호출 순서는 부모 클래스부터 초기화하고 자식 클래스를 초기화한다.
1. 메모리에 개체 생성
2. 부모 생성자 호출
3. 자식 생성자 호출
public dog() {
// 컴파일러가 자동으로 생성자 animal() 호출
}
자동으로 매개변수가 없는 생성자를 컴파일러가 알아서 생성자 animal()를 호출하지만
매개변수가 있는 생성자가 있으면 컴파일 오류가 발생하는 것이다.
public animal(String name, int age, String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
※ 매개변수가 있는 생성자가 있기에 오류가 발생한 것.
이를 해결하기 위해서는 자식 생성자에서 부모 생성자를 호출해 줘야 한다.
class dog extends animal{
public dog(String name, int age, String sex){
super(name, age, sex);
}
}
class cat extends animal{
public cat(String name, int age, String sex){
super(name, age, sex);
}
}
class parrot extends animal{
public void fly() { }
public parrot(String name, int age, String sex){
super(name, age, sex);
}
}
super
super는 현 개체의 부모 부분을 가리킨다.
부모의 생성자 호출, 부모의 멤버 변수나 메소드를 호출 할 때 사용한다.
부모 클래스의 생성자를 호출 할 때 : super(매개변수 목록)
부모 클래스의 멤버 변수, 메서드를 호출할 때 : super.부모의 멤버 변수
super.부모의 메서드
this는 내 객체를 의미하지만, super는 부모의 부분을 의미한다
자식은 부모를 호출할 수 있지만, 부모는 자식을 호출할 수 없다.
그 이유로는 부모는 하나지만 자식은 여럿이기에 특정을 지을 수 없기 때문이다.
'JAVA 공부 > 객체지향 공부' 카테고리의 다른 글
6. 상속(3) (0) | 2023.03.18 |
---|---|
5. 상속 (2) (0) | 2023.03.18 |
4. getter와 setter (0) | 2023.03.13 |
3. 생성자 (0) | 2023.03.13 |
2. 변수, 메서드 (0) | 2023.03.13 |