언어/Java

메소드 재정의 (오버라이딩)

O_oz 2023. 8. 24. 14:37
반응형

1.  메소드 오버라이딩 : 상속된 메소드의 내용이 자식 클래스에 적합하지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의 하는 것

    - 메소드가 오버라이딩되면 부모 객체의 메소드는 숨겨지고 자식 객체에서 메소드를 호출했을 때 오버라이딩된 자식 메소드가 호출됨

메소드 오버라이딩 규칙
부모의 메소드와 동일한 시그니처 (리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 함
접근 제한을 더 강하게 오버라이딩 할 수 없음
새로운 예외 (Exception)를 throw 할 수 없음

    - 부모 메소드가 public이면 자식 메소드는 default, private 접근 제한으로 수정 불가능

    - 부모 메소드가 default이면 자식 메소드는 default 또는 public 접근 제한을 가질 수 있음

 

2. 부모 메소드 호출 (super)

    - 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super키워드를 붙여서 부모 메소드를 호출 가능

    - super는 부모 객체를 참조하기 때문에 부모 메소드에 접근 가능

public class Airplane {
    public void land() {
        System.out.println("착륙");
    }
    public void fly() {
        System.out.println("일반 비행");
    }
    public void takeOff() {
        System.out.println("이륙");
    }
}
public class SupersonicAirplane extends Airplane {
    public static final int NORMAL = 1;
    public static final int SUPERSONIC = 2;
    
    public int flyMode = NORMAL;
    
    @Override
    public void fly() {
        if (flyMode == SUPERSONIC) {
            System.out.println("초음속 비행");
        } else {
            // Airplane 객체의 fly() 메소드 호출
            super.fly();
        }
    }
}
public class Example {
    public static void main(String[] args) {
        SupersonicAirplane sa = new SupersonicAirplane();
        
        sa.takeOff();		// 이륙
        sa.fly();		// 일반 비행
        sa.flyMode = SupersonicAirplane.SUPERSONIC;
        sa.fly();		// 초음속 비행
        sa.flyMode = SupersonicAirplane.NORMAL;
        sa.fly();		// 일반 비행
        sa.land();		// 착륙
    }
}
반응형

'언어 > Java' 카테고리의 다른 글

인터페이스  (1) 2023.08.27
클래스의 타입 변환과 다형성  (0) 2023.08.27
상속  (0) 2023.08.24
어노테이션  (0) 2023.08.24
Getter와 Setter  (0) 2023.08.23