생각 두 접시
[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 |