본문 바로가기
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 클래스를 상속받아, 지불 방식을 카드 지불로 재정의합니다. "카드로 지불합니다."라는 메시지를 출력합니다.

'Back-End > JAVA' 카테고리의 다른 글

[JAVA]Generic 명명 관례  (0) 2024.05.23
[EffectiveJava]생성자 대신 정적 팩터리 메서드를 고민하라.  (0) 2022.05.04
[JAVA]오버로딩  (0) 2022.05.04
[JAVA]데이터 타입  (0) 2022.04.25
[JAVA] NaN, Infinity  (0) 2022.04.25