English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 프로세스 제어

Java 배열

Java 대상 지향(I)

Java 대상 지향(II)

Java 대상 지향(III)

Java 예외 처리

Java 리스트(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 메서드 재정의

이 강의에서는 예제를 통해 Java의 메서드 오버라이드를 배우게 됩니다.

이전 강의에서 상속에 대해 배웠습니다. 상속은 OOP 특성으로, 기존 클래스(상위 클래스)에서 새로운 클래스(서브클래스)를 파생할 수 있게 해줍니다. 서브클래스는 상위 클래스의 속성과 메서드를 상속받습니다.

이제, 상위 클래스와 서브클래스에서 동일한 메서드가 정의되어 있으면 서브클래스의 메서드가 상위 클래스의 메서드를 대체합니다. 이를 메서드 대체(메서드 오버라이드)라고 합니다.

예제1:메서드 대체

class Animal {
   public void displayInfo() {
      System.out.println("저는 동물입니다.");
   }
}
class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("저는 개입니다.");
   }
}
class Main {}}
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

출력:

저는 개입니다.

이 프로그램에서 displayInfo() 메서드는 Animal 상위 클래스와 Dog 서브클래스에 모두 존재합니다.

当我们使用d1Dog 서브클래스의 메서드를 호출할 때, 객체(서브클래스의 객체)는 displayInfo() 메서드를 호출하면 Dog 서브클래스의 메서드가 호출됩니다. 서브클래스의 displayInfo() 메서드는 상위 클래스의 동일한 메서드를 대체합니다.

이 예제에서 @Override 주석을 사용했습니다. Java에서 주석은 컴파일러에 정보를 제공하는 메타데이터입니다. 여기서 @Override 주석은 컴파일러에 주석 이후의 메서드가 상위 클래스의 메서드를 대체한다고 알려줍니다.

@Override를 사용하지 않는 것은 필수적이지 않지만, 이 메서드를 사용할 때는 재정의의 모든 규칙을 따르는 것이 좋습니다. 그렇지 않으면 컴파일러는 오류를 생성합니다.

Java 재정의 규칙

  • 부모 클래스와 자식 클래스는 같은 메서드 이름, 같은 반환 타입, 같은 파라미터 목록을 가져야 합니다.

  • final과 static으로 선언된 메서드는 재정의할 수 없습니다.

  • 우리는 항상 상위 클래스의 추상 메서드를 재정의해야 합니다(앞의 강의에서 논의될 것입니다).

Java 재정의에서 super 키워드

Java에서 재정의를 수행할 때 일반적으로 발생하는 문제는:

 재정의 후 상위 클래스의 메서드에 접근할 수 있을까요?

답은AFFIRMATIVE. 자식 클래스에서 상위 클래스의 메서드에 접근하려면 super 키워드를 사용합니다.

예제2접근 지시자 super를 사용하여

class Animal {
   public void displayInfo() {
      System.out.println("저는 동물입니다.");
   }
}
class Dog extends Animal {
   public void displayInfo() {
      super.displayInfo();
      System.out.println("저는 개입니다.");
   }
}
class Main {}}
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

출력:

저는 동물입니다.
저는 개입니다.

위의 예제에서 자식 클래스 Dog이 상위 클래스 Animal의 displayInfo() 메서드를 덮어씁니다.

Dog 자식 클래스의 d1displayInfo() 메서드를 호출하는 객체는 Dog 자식 클래스 내의 메서드를 호출합니다. 부모 클래스 내의 메서드를 호출하지 않습니다.

Dog 자식 클래스의 displayInfo() 내에서 우리는 super.displayInfo()를 사용하여 부모 클래스의 displayInfo()를 호출합니다.

이미 알고 있듯이, Java의 생성자는 상속되지 않습니다. 따라서 Java에서 생성자 재정의와 같은 문제가 없습니다.

그러나 우리는 그의 자식 클래스에서 상위 클래스의 생성자를 호출할 수 있습니다. 이를 위해 super()를 사용합니다. 더 많은 정보를 얻으려면,Java super 키워드.

메서드 재정의 중 접근 지시자

부모 클래스와 자식 클래스에서 동일한 메서드가 다른 접근 지시자를 가질 수 있습니다. 하지만 한 가지 제한이 있습니다.

우리는 부모 클래스의 접근 지시자보다 더 큰 접근 권한을 제공하는 자식 클래스에서 사용할 수 있는 접근 지시자만 사용할 수 있습니다. 예를 들어,

부모 클래스에서 메서드 myClass()가 protected로 선언되어 있다면, myClass()의 자식 클래스에서 동일한 메서드는 public 또는 protected일 수 있지만 private는 될 수 없습니다.

예제3접근 지시자를 다시 작성하는 중

class Animal {
   protected void displayInfo() {
      System.out.println("저는 동물입니다.");
   }
}
class Dog extends Animal {
   public void displayInfo() {
      System.out.println("저는 개입니다.");
   }
}
class Main {}}
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

출력:

저는 개입니다.

위의 예제에서, 자식 클래스 Dog은 부모 클래스 Animal의 displayInfo() 메서드를 오버라이드했습니다.

매우 자주 사용되는 d1자식 클래스의 객체가 displayInfo()를 호출할 때, 자식 클래스 내부의 메서드가 호출됩니다.

참고하세요, displayInfo()는 Animal 부모 클래스에서 보호된(protected)로 선언되었습니다. 이 메서드는 Dog 자식 클래스에서 공개적인(public) 접근 지시자를 가지고 있습니다. 이는 public이 보호된보다 큰 접근 권한을 제공하기 때문에 허용됩니다.

추상 메서드 오버라이드

Java에서 추상 클래스는 다른 클래스의 부모 클래스(기본 클래스)로 생성됩니다. 그리고 클래스가 추상 메서드를 포함하면, 그것을 오버라이드해야 합니다.

이후의 강의에서는 추상 클래스와 추상 메서드의 오버라이드에 대해 더 많은 정보를 배울 것입니다.