생각 두 접시

[java] 메소드 재정의 @Override

NaZZU 2024. 6. 1. 00:06

메소드 재정의는 부모 클래스의 상속 메소드를 수정해 자식 클래스에서 재정의 하는 것이다.

 

메소드 재정의 조건

- 부모 클래스의 메소드와 동일한 시그니처 ( 리턴 타입, 메소드 이름, 매개변수 리스트 ) 를 가져야 한다.

- 접근 제한을 더 강하게 오버라이딩 불가능하다 ( public -> private X | default -> public 가능) 역은 성립.

- 새로운 예외(Exception) throws 불가 {위의 접근제한과 비슷. 부모 클래스보다 더 포괄적인 에러를 throws 불가}

 

@Override 어노테이션

컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시

 

메소드 재정의 효과

부모 메소드는 숨겨지고, 재정의된 자식 메소드 실행 (super.메소드() 사용시 부모 클래스의 메소드 사용 가능)

예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package Practice;
 
public class AirPlane {
    public void land()
    {
        System.out.println("착륙합니다");
    }
    public void Fly()
    {
        System.out.println("일반비행합니다");
    }
    public void takeOff()
    {
        System.out.println("이륙합니다");
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Practice;
 
public class SonicAirplane extends AirPlane {
    public static final int NORMAL = 1;
    public static final int SUPERSONIC = 2;
    
    int flyMode = NORMAL;
    
    @Override
    public void Fly()
    {
        if (flyMode == SUPERSONIC)
            System.out.println("음속비향합니다");
        else
            super.Fly();
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Practice;
 
import week10.SonicAirPlane;
 
public class AirPlaneEx {
    public static void main(String[] args) {
        SonicAirplane sPlane = new SonicAirplane();
        sPlane.takeOff();
        sPlane.Fly();
        sPlane.land();
        
        sPlane.flyMode = SonicAirPlane.SUPERSONIC;
        sPlane.Fly();
        sPlane.flyMode = SonicAirPlane.NORMAL;
        sPlane.Fly();
    }
}
 
cs