상속은 객체 지향 프로그래밍의 핵심 요소 중 하나로, 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다. 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받은 것이다.
상속을 사용하려면 extends
키워드를 사용하면 된다. 그리고 extends
대상은 하나만 선택할 수 있다.
package extends1.ex2;
public class Car {
public void move() {
System.out.println("차를 이동합니다.");
}
}
Car
는 부모 클래스가 된다. 여기에는 자동차의 공통 기능인 move()
가 포함되어 있다.
package extends1.ex2;
public class ElectricCar extends Car{
public void charge() {
System.out.println("충전합니다.");
}
}
전기차는 extends Car
를 사용해서 부모 클래스인 Car
를 상속받는다. 상속 덕분에 ElectricCar
에서도 move()
를 사용할 수 있다.
package extends1.ex2;
public class GasCar extends Car {
public void fillUp() {
System.out.println("기름을 주유합니다.");
}
}
가솔린차도 전기차와 마찬가지로 extends Car
를 사용해서 부모 클래스인 Car
를 상속받는다. 상속 덕분에 여기서도 move()
를 사용할 수 있다.
package extends1.ex2;
public class CarMain {
public static void main(String[] args) {
ElectricCar electricCar = new ElectricCar();
electricCar.move();
electricCar.charge();
GasCar gasCar = new GasCar();
gasCar.move();
gasCar.fillUp();
}
}
전기차와 가솔린차가 Car
를 상속 받은 덕분에 electricCar.move()
, gasCar.move()
를 사용할 수 있다.
✓ 참고
상속은 부모의 기능을 자식이 물려 받는 것이다. 따라서 자식이 부모의 기능을 물려 받아서 사용할 수 있다. 반대로 부모 클래스는 자식 클래스에 접근할 수 없다. 자식 클래스는 부모 클래스의 기능을 물려 받기 때문에 접근할 수 있지만, 그 반대는 아니다.
부모 코드를 보면 자식에 대한 정보가 하나도 없지만 자식 코드는extends Car
를 통해서 부모를 알고 있다.
자바는 다중 상속을 지원하지 않는다. 그래서 extend
대상은 하나만 선택할 수 있다. 부모를 하나만 선택 할 수 있다는 뜻이다. 물론 부모가 또 다른 부모를 하나 가지는 것은 괜찮다.
만약 비행기와 자동차를 상속 받아서 하늘을 나는 자동차를 만든다고 가정해보자. 만약 그림과 같이 다중 상속을 사용하게 되면 AirplaneCar
입장에서 move()
를 호출할 때 어떤 부모의 move()
를 사용해야 할 지 애매한 문제가 발생한다. 이것을 다이아몬드 문제라 한다.
그리고 다중 상속을 사용하면 클래스 계층 구조가 매우 복잡해질 수 있다. 이런 문제점 때문에 자바는 클래스의 다중 상속을 허용하지 않는다.