1. 메소드 재정의
👩🏻💻 부모 클래스의 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다.
➡️ 이러한 메소드는 자식 클래스에서 재정의해서 사용해야한다. 이것을 메소드 오버라이딩이라고 함
1) 메소드 오버라이딩
👾 상속된 메소드를 자식 클래스에서 재정의하는 것을 말함
👾 메소드가 오버라이딩되었다면 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용됨
💡 오버라이딩 규칙
1. 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개 변수)와 동일해야 한다
2. 접근 제한을 더 강하게 오버라이딩 할 수 없다. ( public → private 변경 불가 )
3. 새로운 예외를 throws 할 수 없다.
public class Calculator {
//메소드 선언
public double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
public class Computer extends Calculator {
//메소드 오버라이딩
@Override
public double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
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));
}
}
// 실행 결과
Calculator 객체의 areaCircle() 실행
원 면적: 314.159
Computer 객체의 areaCircle() 실행
원 면적: 314.1592653589793
📍 자바는 개발자의 실수를 줄여주기 위해 정확히 오버라이딩 되었는지 체크해주는 @Override 어노테이션을 제공한다.
➡️ 문제가 있다면 컴파일 에러를 출력함
2) 부모 메소드 호출
👾 메소드를 재정의하면 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야 한다.
👾 이 문제는 자식 메소드와 부모 메소드의 공동 작업 처리 기법을 이용하면 해결됨
- super.method()의 위치는 작업 처리2 전후에 어디든지 올 수 있다. 우선 처리가 되어야 할 내용을 먼저 작성하면 됨.
- 이 방법은 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 없애는 효과를 가져옴
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 SupersonicAirplaneExample {
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();
}
}
// 실행결과
이륙합니다.
일반 비행합니다.
초음속 비행합니다.
일반 비행합니다.
착륙합니다.
* 내용 참고 - 책 '이것이 자바다'
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 타입 변환 (0) | 2024.08.24 |
---|---|
[Java] final 클래스와 final 메소드 · protected 접근 제한자 (0) | 2024.08.23 |
[Java] 상속 Inheritance (0) | 2024.08.11 |
[Java] Getter와 Setter · 싱글톤 패턴 (0) | 2024.08.11 |
[Java] final 필드와 상수 · 접근 제한자 (0) | 2024.08.11 |