상속은 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다. 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받은 것이다. 이때 extends
키워드를 사용하면 되고, extends
대상은 하나만 선택할 수 있다. 아래의 예제를 살펴보자.
public class Car {
public void move() {
System.out.println("차가 이동합니다.");
}
}
Car
이라는 클래스를 상속받은 자식 클래스들은 move
메서드에 접근할 수 있다.public class ElectricCar extends Car{
public void charge() {
System.out.println("충전합니다.");
}
}
ElectricCar
클래스는 Car
을 상속받았으므로 Car
의 기능인 move
를 사용할 수 있다.메인 클래스에서 아래 코드를 실행했을 때 메모리 구조를 살펴보자.
ElectricCar electricCar = new ElectricCar();
new ElectricCar()
을 호출하면 상속 관계에 있는 Car
까지 포함해서 인스턴스를 생성한다.
electricCar.move()
을 호출하면 먼저 본인 타입에서 move()
메서드가 있는지 확인한다. 만약에 존재하지 않는다면 상위 부모에서 필요한 기능을 찾아본다. 참고로 상위 부모로 계속 올라갔음에도 불구하고 기능이 없다면 컴파일 오류가 발생한다.
오버라이딩은 하위 클래스에서 상위 클래스의 메서드를 재정의하는 과정을 의미한다. 이는 "electricCar.move()
을 호출하면 먼저 본인 타입에서 move()
메서드가 있는지 확인" 한다의 원리가 그대로 적용된다. 아래 예제를 살펴보자.
public class Car {
public void move() {
System.out.println("차를 이동합니다.");
}
public void openDoor() {
System.out.println("문을 엽니다.");
}
}
public class ElectricCar extends Car {
@Override
public void move() {
System.out.println("전기차를 빠르게 이동합니다.");
}
}
move
메서드를 재정의, 즉 오버라이딩 했다.electricCar.move()
를 실행했을 때 Car
의 move()
가 아닌 ElectricCar
의 move()
가 우선 실행된다.