자바 프로그램을 개발할때 가장 중요한 기술적인 요소 중 하나인 메소드 재정의 이다.
메소드 재정의(오버라이딩 overriding)
부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 클래스에서 수정하여 사용 한는 것이다.
메소드 재정의 방법
- 부모의 메소드와 동일한 시그니처(리턴타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
- 접근 제한을 더 강하게 재정의할 수 없다.(접근제한자)
- 새로운 예외(Exception)를 throws할 수 없다.
메소드가 재정의될 경우 부모 객체 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출 된다.
예시1) 부모 클래스
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
}
}
자식 클래스
public class Computer extends Calculator{
//재정의
@Override
double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
메소드 재정의 테스트
public class ComputerEx {
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.부모메소드();
예시2) super변수
public class Airplane {
public void land() {
System.out.println("착륙");
}
public void fly() {
System.out.println("일반 비행");
}
public void takeoff() {
System.out.println("이륙");
}
}
super변수
public class SupersonicAirplane extends Airplane{ //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 {
super.fly(); //Airplane 객체의 fly()메소드 호출
}
}
}
super변수
public class SupersonicAirplaneEx {
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();
}
}
final 클래스와 final 메소드
-
final 키워드는 클래스, 필드, 메소드를 선언할 때 사용한다.
-
해당 선언이 최종 상태이며 수정될 수 없음을 의미 한다.
-
클래스 및 메소드 선언에 사용할 경우 상속과 관련이 있다는 의미이다.
상속할 수 없는 final 클래스
클래스를 선언할 때 final을 클래스 앞에 붙이면 이클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.
final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다는 것을 의미
public final class 클래스 { ... }
public final class String { ... }
//자식 클래스에서 만들 수 없다.
public class NewString extends String { ... } //오류
재정의할 수 없는 final 메소드
메소드를 선언할때 final을 메소드 앞에 붙이면 이 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드가 된다.
부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final메소드는 자식 클래스에서 재정의할 수 없다는 것이다.
public final 리턴타입 메소드([매개변수, ...]) { ... }
예시3) 재정의할 수 없는 final 메소드
public class Car {
// 필드
public int speed;
// 생성자
public void speedUp() {
speed += 1;
}
// final 메소드
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
재정의할 수 없는 final 메소드
public class SportsCar extends Car {
@Override
public void speedUp() {
speed += 10;
}
//재정의 할 수 없음
@Override
public void stop() {
System.out.println("스포츠가를 멈춤");
speed = 0;
}
}
※용어 정리
-
메소드 재정의: 부모 메소드를 자식 클래스에서 다시 정의하는 것을 말한다.
-
final 클래스: final키워드로 선언된 클래스는 부모 클래스로 사용할 수 없는 final 클래스 이다.
-
final 메소드: final키워드로 선언된 메소드는 자식 클래스에서 재정의할 수 없는 final메소드 이다.
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 필드의 다형성 (0) | 2020.11.05 |
---|---|
자바(Java) - 타입 변환과 다형성 (0) | 2020.11.02 |
자바(Java) - 상속2 (부모 생성자 호출) (0) | 2020.10.28 |
자바(Java) - 상속1 (클래스 상속) (0) | 2020.10.26 |
자바(Java) - 패키지와 접근 제한자3 (Getter & Setter 메소드) (0) | 2020.10.20 |