20 상속(inheritance)
상속(inheritance)
1. 기존의 클래스로 새로운 클래스를 작성하는 것
(기존에 선언된 클래스의 필드를 다른 클래스에서도 사용하고자 할 때 - 코드의 재사용)
2. 두 클래스를 부모와 자식으로 관계를 맺어주는것
상속은 다음과 같이 사용할 수 있다.
class 자식클래스이름 extend 부모클래스이름 { ... }
부모 클래스 A
class A{
// A의 필드
}
자식 클래스 B
class B extends A{
// B의 필드
}
B obj = new B();
이때, obj 객체는 실제로는 A의 필드와 B의 필드 둘다 가지고 있다.
자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않는다.
부모와 자식 외에도 다양하게 불린다.
A | 부모 클래스, 상위클래스, 슈퍼 클래스, 기반클래스 |
B | 자식 클래스, 하위클래스, 서브 클래스, 파생클래스 |
자식 클래스 생성자 호출시
자식 클래스의 객체는 자식 생성자를 호출해서 객체화를 진행한다.
메모리에 자식 클래스의 필드만 올라갔다면 자식 객체로 절대 부모 클래스에 있는 필드에 접근할 수 없다.
따라서 자식 생성자를 호출하게 되면 부모의 생성자가 자동으로 먼저 호출된다.
그 이후에 자식 객체는 부모 필드가 메모리에 먼저 생성되어 있기 때문에 그 필드들에 접근할 수 있게 된다
>> 자식 생성자 첫 줄에는 항상 super 클래스의 생성자가 호출된다.
명시적으로 적지 않을시에는 보이지 않지만 super() 가 호출된다.
아래 예시로 살펴보자 :)
부모클래스 : Car
public class Car {
String brand;
String color;
int price;
Car(String brand, String color, int price) {
this.brand = brand;
this.color = color;
this.price = price;
}
void engineStart() {
System.out.println(brand + " 시동 켜기");
}
void enginStop() {
System.out.println(brand + " 시동 끄기");
}
}
자식클래스 : SuperCar
public class SuperCar extends Car {
String pw;
public SuperCar() {
// super : 부모 클래스 이름, 자동으로 되어서 생략가능하다
// 명시적으로 적지 않을 시에는 부모 클래스의 기본 생성자를 호출한다.
// super(); == Car
}
// 부모클래스에 있는 생성자 받아와 부모 필드 + 자신 필드 세팅하는 생성자 만들기
public SuperCar(String brand, String color, int price, String pw) {
super(brand, color, price);
this.pw = pw;
}
void roofOpen() {
System.out.println(brand + " 뚜껑 열기");
}
void roofClose() {
System.out.println(brand + " 뚜껑 닫기");
}
잠깐 ! 부모 클래스에 있는 생성자 받아 오는 법
1. 자식 클래스에서 단축키 Alt + Shift + S -> O 클릭
2. 맨 위에서 부모 생성자 선택 후 Generate
3. 완성!
다시 예제로 넘어와 위와 같이 만든 Car와 SuperCar 를 사용해 도로를 만들어보자
public class Road {
public static void main(String[] args) {
Car momcar = new Car("K7", "White", 7000);
Car dadcar = new Car("BMW","Blue",35000);
SuperCar mycar = new SuperCar("Ferrari", "Red", 65000, "abcd");
mycar.engineStart();
mycar.roofOpen();
}
}
코드를 살펴보면 mycar는 SuperCar 객체지만 Car의 메소드를 사용한 것을 볼 수 있다.
이것은 위에서 설명했듯이 Car와 SuperCar가 상속관계이기 때문에 가능한 것이다.