CodeGym/Java Blog/무작위의/Java에서 메서드 재정의
John Squirrels
레벨 41
San Francisco

Java에서 메서드 재정의

무작위의 그룹에 게시되었습니다
회원
안녕! 이미 Java 메소드를 사용하고 있으며 이에 대해 많이 알고 있습니다. 한 클래스에 이름은 같지만 매개 변수가 다른 여러 메서드가 있는 상황에 직면했을 것입니다. 이러한 경우에 메서드 오버로딩을 사용했음을 기억할 것입니다. 오늘 우리는 다른 상황을 고려하고 있습니다. 단일 공유 메서드가 있지만 다른 클래스에서 다른 작업을 수행해야 한다고 상상해 보십시오. 이 동작을 어떻게 구현합니까? 이해를 돕기 위해 동물을 나타내는 Animal 부모 클래스를 살펴보고 그 안에 speak 메서드 를 만들어 보겠습니다 .
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
이제 막 프로그램 작성을 시작했지만 아마도 잠재적인 문제를 발견했을 것입니다. 세상에는 많은 동물이 있고 모두 다르게 '말'합니다. 메서드 재정의 작동 방식 - 2우리의 목표는 간단합니다. 많은 말하기 방법을 만들지 않는 것입니다. 야옹을 위한 catSpeak() 메서드, 히싱을 위한 snakeSpeak() 메서드 등을 만드는 대신 speak()뱀이 쉭쉭 거리고, 고양이가 야옹하고, 개가 짖는다. 메서드 재정의를 사용하여 쉽게 이를 달성할 수 있습니다. Wikipedia는 '오버라이딩'이라는 용어에 대해 다음과 같이 설명합니다. 객체 지향 프로그래밍에서 메서드 오버라이딩은 하위 클래스 또는 자식 클래스가 해당 슈퍼클래스 또는 하위 클래스 중 하나에서 이미 제공한 메서드의 특정 구현을 제공할 수 있도록 하는 언어 기능입니다. 부모 클래스 기본적으로 맞습니다. 메서드 재정의를 사용하면 부모 클래스의 일부 메서드를 가져와 각 자식 클래스에 고유한 구현을 작성할 수 있습니다. 새 구현은 자식 클래스에서 부모의 구현을 '대체'합니다. 예제에서 이것이 어떻게 보이는지 봅시다. Animal 클래스 를 상속하는 4개의 클래스를 만듭니다 .
public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
"다음은 미래를 위한 작은 생활 꿀팁입니다. 상위 클래스의 메서드를 재정의하려면 IntelliJ IDE에서 하위 클래스의 코드로 이동하고 Ctrl+O를 클릭한 다음 메뉴에서 "Override methods..."를 선택합니다. 단축키 사용에 익숙해지세요. 처음부터 — 프로그램을 더 빨리 작성하는 데 도움이 됩니다!필요한 동작을 지정하기 위해 몇 가지 작업을 수행했습니다.
  1. 각 자식 클래스에서 부모 클래스의 메서드와 같은 이름으로 메서드를 만들었습니다.

  2. 우리는 컴파일러에게 메서드 이름을 부모 클래스와 동일하게 지정하는 것이 우연이 아니라고 말했습니다. 우리는 메서드의 동작을 재정의하고 싶습니다. 이를 컴파일러에 전달하기 위해 메서드 위에 @Override 주석을 설정합니다.
    메서드 위에 @Override 주석을 배치하면 컴파일러(및 코드를 읽는 프로그래머)에게 다음과 같이 알립니다. '모든 것이 정상입니다. 이것은 실수가 아닙니다. 나는 잊고 있지 않다. 나는 그러한 방법이 이미 존재한다는 것을 알고 있으며 그것을 재정의하고 싶습니다.'

  3. 우리는 각 하위 클래스에 필요한 구현을 작성했습니다. speak() 메서드가 호출 되면 뱀은 쉭쉭거리고 곰은 으르렁거립니다.
이것이 프로그램에서 어떻게 작동하는지 봅시다:
public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
콘솔 출력:
Woof!
Meow!
Growl!
Hiss!
훌륭한! 모든 것이 제대로 작동합니다! 우리는 Animal 부모 클래스 의 개체를 저장하는 4개의 참조 변수를 만들고 여기에 4개의 서로 다른 자식 클래스의 인스턴스를 할당했습니다. 결과적으로 각 개체는 고유한 동작을 나타냅니다. 각 자식 클래스에 대해 재정의된 speak() 메서드는 Animal 클래스 의 '네이티브' speak() 메서드 (단순히 'Hello!'를 표시함)를 대체했습니다. 재정의에는 몇 가지 제한 사항이 있습니다. 메서드 재정의 작동 방식 - 3
  1. 재정의된 메서드는 부모 메서드와 동일한 매개 변수를 가져야 합니다.

    부모 클래스의 speak 메서드에 String 매개변수가 있는 경우 자식 클래스의 재정의된 메서드에도 String 매개변수가 있어야 합니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다.

    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Hello! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }

  2. 재정의된 메서드는 부모 메서드와 동일한 반환 형식을 가져야 합니다.

    그렇지 않으면 컴파일러 오류가 발생합니다.

    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. 재정의된 메서드의 액세스 한정자도 '원본' 메서드와 동일해야 합니다.

    public class Animal {
    
          public void speak() {
    
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
Java에서 메서드 오버라이딩은 다형성(지난 수업에서 설명한 OOP의 원칙)을 구현하는 한 가지 방법입니다. 즉, 주요 이점은 이전에 논의한 것과 동일한 유연성입니다. 우리는 단순하고 논리적인 클래스 시스템을 구축할 수 있습니다. 각 클래스는 특정 동작(개 짖는 소리, 고양이 야옹)을 가지며 공통 인터페이스를 사용합니다. 예를 들어 dogSpeak() , speakCat과 같은 많은 메서드가 아닌 하나의 speak ( ) 메서드입니다 . ()
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다