Back-End/JAVA
[JAVA]메소드 재정의
by codeZeroMan
2024. 9. 5.
- 메소드 재정의를 통해 객체 지향 프로그래밍의 다형성(Polymorphism) 을 실현할 수 있으며, 자식 클래스가 부모 클래스의 기능을 확장하거나 변경할 수 있게 합니다.
메소드 재정의의 특징
- 메소드 시그니처가 동일해야 합니다: 재정의하는 메소드의 이름, 매개변수의 타입과 개수가 부모 클래스의 메소드와 동일해야 합니다.
- 접근 제한자를 더 강하게 할 수 없습니다: 자식 클래스에서 재정의된 메소드의 접근 제한자는 부모 클래스의 메소드보다 더 강하게 설정할 수 없습니다. 예를 들어, 부모 클래스의 메소드가 public이라면, 자식 클래스에서 protected나 private으로 재정의할 수 없습니다.
- 예외(Exception)의 제한: 자식 클래스의 메소드는 부모 클래스의 메소드에서 던질 수 있는 예외와 동일하거나 더 적은 범위의 예외만을 던질 수 있습니다.
- @Override 어노테이션: 자바에서는 메소드 재정의 시 @Override 어노테이션을 사용하여 컴파일러가 재정의 여부를 검증하도록 할 수 있습니다. 이 어노테이션을 사용하면 실수로 메소드 이름을 잘못 쓰거나 시그니처가 다를 때 컴파일러가 이를 알려줍니다.
예시
// 부모 클래스: Payment
class Payment {
// 기본 지불 메소드
public void pay() {
System.out.println("기본 지불 방법을 사용합니다.");
}
}
// 자식 클래스: CashPayment
class CashPayment extends Payment {
// 현금 지불 방식으로 메소드 재정의
@Override
public void pay() {
System.out.println("현금으로 지불합니다.");
}
}
// 자식 클래스: CardPayment
class CardPayment extends Payment {
// 카드 지불 방식으로 메소드 재정의
@Override
public void pay() {
System.out.println("카드로 지불합니다.");
}
}
// 실행 클래스: Main
public class Main {
public static void main(String[] args) {
Payment payment = new Payment();
payment.pay(); // "기본 지불 방법을 사용합니다." 출력
Payment cash = new CashPayment();
cash.pay(); // "현금으로 지불합니다." 출력
Payment card = new CardPayment();
card.pay(); // "카드로 지불합니다." 출력
}
}
설명
- Payment 클래스: 기본적인 지불 방법을 정의합니다. 특별한 지불 방식 없이 "기본 지불 방법을 사용합니다."라는 메시지를 출력합니다.
- CashPayment 클래스: Payment 클래스를 상속받아, 지불 방식을 현금 지불로 재정의합니다. "현금으로 지불합니다."라는 메시지를 출력합니다.
- CardPayment 클래스: Payment 클래스를 상속받아, 지불 방식을 카드 지불로 재정의합니다. "카드로 지불합니다."라는 메시지를 출력합니다.