[Java] 상속과 오버라이딩

정석·2024년 1월 24일

Java

목록 보기
30/39
post-thumbnail
  • 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하기 위해 상속을 한다.
  • extends 키워드를 사용한다.

<부모 클래스>

public class Car {
	public void move() {
    	System.out.println("차가 이동합니다.");
    }
}

<자식 클래스>

public class ElectricCar extends Car {
	public void charge() {
    	System.out.println("충전합니다.");
    }
}

Car 클래스를 상속 받았기 때문에 move 란 메서드를 자식클래스에서 사용할 수 있다.

ElectricCar 란 자식클래스로 인스턴스를 생성하면 상속받은 부모 클래스의 인스턴스도 자식 인스턴스의 참조값 위치에 생성된다. 다음 그림과 같다.

자식 클래스의 인스턴스만 생성했는데도 x001 이라는 참조값에 부모 클래스의 인스턴스가 생성됨을 알 수 있다. 하지만 가리키는 것은 생성된 인스턴스의 변수타입인 ElectricCar 를 가리킨다.

생성된 인스턴스에서 메서드를 호출하면 가리키고 있는 클래스의 안에서 메서드를 찾고 없으면, 부모 클래스 내에서 찾게된다.


부모클래스에서 상속받은 메서드를 사용할 때 메서드 이름은 같지만 새로운 기능을 추가하고 싶다면 자식이 새로 재정의 할 수 있다. 이를 오버라이딩이라 한다.

public class ElectricCar extends Car {
	
    @Override
    public void move() {
    	System.out.println("전기차를 빠르게 이동합니다.") // 오버라이딩 하여 출력 내용을 추가함.
    }
    
	public void charge() {
    	System.out.println("충전합니다.");
    }
    
}

오버라이딩의 조건

  • 메서드 이름이 같아야 함
  • 메서드 매개변수의 타입, 순서, 개수가 같아야 함
  • 반환 타입이 같아야 함

만약 다른 패키지의 클래스를 상속한다면, 상속받을 부모 클래스가 public 또는 protected 의 접근 제어자일때만 가능하다.

위 예시를 보면 오버라이딩하여 자식 클래스와 부모 클래스 둘 다 move 란 메서드가 존재한다. 근데 자식 클래스로 인스턴스를 생성했기에 해당 참조값은 자식 클래스의 move 메서드를 가리킨다. 만약 부모 클래스의 move 메서드를 사용하고 싶다면 super 키워드를 사용하면 된다.

Super

public class ElectricCar extends Car {
		
    @Override
    public void move() {
    	System.out.println("전기차를 빠르게 이동합니다.") // 오버라이딩 하여 출력 내용을 추가함.
    }
    
    public void call() {
    	super.move() // 부모의 move 메서드 사용
        move() // 자식 즉, 해당 인스턴스의 메서드 사용

0개의 댓글