Java 상속 관계
객체 지향 프로그램의 핵심 요소 중 하나가 상속이다. 기존 클래스의 필드와 메소드를 새로운 클래스로 재사용한다.
기존 클래스의 속성과 기능을 그대로 물려받아 새로운 클래스에도 속성과 기능을 사용할 수 있다.
상속을 사용하려면 extends 키워드를 입력하여 사용한다. extends 대상은 하나만 선택 가능하다.
상속에 사용하는 용어
- 부모 클래스 (슈퍼 클래스): 다른 클래스에게 자신의 필드와 메소드를 제공해주는 클래스.
- 자식 클래스 (서브 클래스): 부모 클래스로부터 필드와 메소드를 상속 받아 사용하는 클래스.
상속 관계를 사용하는 코드 작성하기
그리고 여러 개의 클래스를 동일한 이름으로 생성 할 것이므로 import 와 package 이름을 확인하도록 한다.
src
└Student (+)
└ex2 (+)
├ElectricCar.java (+)
├GasCar.java (+)
├Car.java (+)
└CarMain.java (+)
Car.java
package Student.ex2;
public class Car {
public void move() {
System.out.println("차 이동하기~");
}
}
ElectricCar.java
package Student.ex2;
public class ElectricCar extends Car {
public void charge() {
System.out.println("차 충전하기~");
}
}
GasCar.java
package Student.ex2;
public class GasCar extends Car {
public void charge() {
System.out.println("차 충전하기~");
}
}
CarMain.java
package Student.ex2;
public class CarMain {
public static void main(String[] args) {
System.out.println("*==전기차==*");
ElectricCar electricCar = new ElectricCar();
electricCar.move();
electricCar.charge();
System.out.println("*==가솔린차==*");
GasCar gasCar = new GasCar();
gasCar.move();
gasCar.fillUp();
}
}
실행 결과
*==전기차==*
차 이동하기~
차 충전하기~
*==가솔린차==*
차 이동하기~
기름 주유하기~
전기차와 가솔린 차가 Car 를 상속 받은 덕에 move() 메소드를 직접 사용하지 않았지만, 기능을 사용할 수 있었다. (electricCar.move()
, gasCar.move()
)
상속 구조

이 처럼 부모의 move() 기능을 자식에게 물려준 것을 확인할 수 있었다.
자식 클래스는 extends Car
키워드를 통해서 부모의 기능을 물려 받고 접근할 수 있었다.
하지만 부모 클래스는 자식 클래스를 모른다. 어떤 자식 클래스가 자신의 기능을 사용하는지 알 수 없다.(상속 구조도에서 화살표를 바라보세요.)
단일 상속
자바는 단 하나의 부모 클래스만 상속 가능하다. 여러 개의 부모 클래스를 상속 받을 수 없다. 내가 상속 받을 부모는 하나만 받을 수 있다. 자바는 지원하지 않지만 다중 상속은 다이아몬드 문제가 생기고 클래스 계층 구조가 복잡해진다. 이러한 문제점으로 자바는 클래스의 다중 상속을 지원하지 않고 있다.
대신 인터페이스의 다중 구현으로 문제를 피할 수 있다.
다중 상속 그림

자바는 다중 상속을 지원하지 않는다. c++ 언어에서는 다중 상속을 지원하지만, 앞서 말한대로 클래스 구조가 복잡하다. 그리고 다이아몬드 문제로 AirplaneCar 가 move() 기능을 수행할 때 Airplance 과 Car 의 move() 어떤 것을 쓸지 애매한 문제가 있다.