728x90
Method Overriding
자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속 받는다. 상속 받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의 후 사용할 수도 있다. 즉, Method Overriding이란 상속된 메소드를 자식 클래스에서 직접 재정의하는 것이다. Method Overriding이 되면 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
Overriding 규칙
- 메소드의 동작만 재정의하는 것으로, 자식 메소드의 선언부가 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
- 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.
예제 코드
더보기
package ch07.sec04.exam01;
public class Calculator {
public double areaCircle(double r) {
// 메소드 선언
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
package ch07.sec04.exam01;
public class Computer extends Calculator {
// 메소드 오버라이딩
@Override
public double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
package ch07.sec04.exam01;
public class ComputerExample {
public static void main(String[] args) {
int r = 10;
Calculator calculator = new Calculator();
System.out.println("원 면적 : " + calculator.areaCircle(r));
System.out.println();
Computer computer = new Computer();
System.out.println("원 면적 : " + computer.areaCircle(r));
}
}
super
메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야 한다. 숨겨진 메소드를 사용하려면 자식 메소드 내에서 부모 메소드를 호출하여 사용해야 하는데 super는 숨겨진 부모 메소드를 호출할 때 사용할 수 있다.
예제 코드
더보기
package ch07.sec04.exam02;
public class Airplane {
// 메소드 선언
public void land() {
System.out.println("착륙");
}
public void fly() {
System.out.println("비행");
}
public void takeOff() {
System.out.println("이륙");
}
}
package ch07.sec04.exam02;
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();
}
}
}
package ch07.sec04.exam02;
public class SupersonicAirplaneExample {
public static void main(String[] args) {
SupersonicAirplane sa = new SupersonicAirplane();
sa.takeOff(); // 이륙
sa.fly(); // 비행
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly(); // 초음속 비행(method overriding)
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly(); // 비행(parent class)
sa.land(); // 착륙
}
}
Airplane의 fly() 메소드를 자식 클래스인 SupersonicAirplane에서 오버라이딩했다. 일반 비행일때는 Airplane의 fly()를 사용하고, 초음속 비행일때는 오버라이딩된 fly()를 사용한다.
참고 링크
728x90
'IT > Java' 카테고리의 다른 글
[Java] 다형성(Polymorphism) (0) | 2024.03.08 |
---|---|
[Java] 자동 타입 변환 & 강제 타입 변환 (0) | 2024.03.08 |
[Java] 상속(Inheritance) (1) | 2024.03.07 |
[Java] 접근 제한자 (0) | 2024.03.05 |
[Java] final 필드와 상수 (0) | 2024.03.05 |