JavaRush /Java Blog /Random-KO /메소드 재정의 메커니즘 또는 Java의 재정의

메소드 재정의 메커니즘 또는 Java의 재정의

Random-KO 그룹에 게시되었습니다
안녕하세요! 당신은 이미 Java의 메소드를 사용하고 있으며 이에 대해 많은 것을 알고 있습니다. 한 클래스에 이름은 같지만 인수가 다른 여러 메서드가 있는 상황에 직면했을 것입니다. 기억하신다면, 그러한 경우에 우리는 메소드 오버로딩 메커니즘을 사용했습니다. 오늘은 다른 상황을 살펴보겠습니다. 하나의 공통 메서드가 있지만 호출된 클래스에 따라 다른 작업을 수행해야 한다고 상상해 보세요. 이 동작을 구현하는 방법은 무엇입니까? 이를 알아내기 위해 동물을 나타내는 부모 클래스를 가져와 그 안에 " voiceAnimal " 라는 메서드를 만들어 보겠습니다 . voice
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
우리는 방금 프로그램 작성을 시작했지만 잠재적인 문제를 볼 수 있을 것입니다. 세상에는 많은 동물이 있고 그들은 모두 다르게 "말합니다": 고양이 야옹, 오리 꽥꽥거림, 뱀 쉭쉭 소리. 메소드 재정의 메커니즘의 작동 방식 - 2 우리의 목표는 간단합니다. 투표를 위한 여러 가지 방법을 만드는 것을 피하는 것입니다. voiceCat()야옹, 쉭쉭 등의 메서드를 만드는 대신 메서드가 호출될 때 뱀이 쉭쉭, 고양이가 야옹, 개가 짖기를 voiceSnake()원합니다 . 메소드 재정의 메커니즘(Java의 재정의)을voice() 사용하여 이를 쉽게 달성할 수 있습니다 . Wikipedia에서는 "오버라이딩"이라는 용어에 대해 다음과 같이 설명합니다. 객체 지향 프로그래밍 메소드 오버라이딩 은 하위 클래스 또는 하위 클래스가 슈퍼클래스 중 하나에 이미 구현된 메소드의 특정 구현을 제공할 수 있도록 하는 프로그래밍 언어의 기능 중 하나입니다. 또는 부모 수업. 일반적으로 그것은 정확합니다. 재정의를 사용하면 상위 클래스의 메서드를 가져와서 각 하위 클래스에 이 메서드의 구현을 직접 작성할 수 있습니다. 새로운 구현은 하위 클래스의 상위 클래스를 "대체"합니다. 예를 들어 이것이 어떻게 보이는지 살펴보겠습니다. 우리 클래스에 대한 4개의 후속 클래스를 만들어 보겠습니다 . Animal
public class Bear extends Animal {
   @Override
   public void voice() {
       System.out.println("Р-р-р!");
   }
}
public class Cat extends Animal {

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

public class Dog extends Animal {

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


public class Snake extends Animal {

   @Override
   public void voice() {
       System.out.println("Ш-ш-ш!");
   }
}
미래를 위한 작은 꿀팁: 상위 클래스의 메서드를 재정의하려면 Intellij IDE a 에서 하위 클래스의 코드로 이동하여 Ctrl+O를 누르고 메뉴에서 " 메서드 재정의... "를 선택합니다. 처음부터 단축키 사용에 익숙해지면 프로그램 작성 속도가 빨라집니다! 원하는 동작을 설정하기 위해 몇 가지 작업을 수행했습니다.
  1. 부모 클래스의 메서드와 동일한 이름을 가진 각 하위 클래스에 메서드를 만들었습니다.
  2. 우리는 컴파일러에게 부모 클래스와 같은 이름으로 메서드 이름을 지정했다고 말했습니다. 메서드의 동작을 재정의하고 싶었기 때문입니다. 컴파일러에 보내는 이 "메시지"를 위해 메소드에 @Override 주석을 넣습니다 .
    메소드 위에 배치된 @Override 주석은 컴파일러(및 코드를 읽는 프로그래머에게도)에게 다음과 같이 알려줍니다. “모든 것이 정상입니다. 이것은 실수나 건망증이 아닙니다. 그러한 방법이 이미 존재한다는 것을 기억하고 있으며 이를 재정의하고 싶습니다."

  3. 우리는 각 하위 클래스에 필요한 구현을 작성했습니다. 부름을 받으면 뱀은 voice()쉭쉭 소리를 내야 하고, 곰은 으르렁거려야 합니다.
이것이 프로그램에서 어떻게 작동하는지 살펴보겠습니다.
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.voice();
       animal2.voice();
       animal3.voice();
       animal4.voice();
   }
}
콘솔 출력: 으악! 야옹! 으르렁! 쉿! 좋습니다. 모든 것이 정상적으로 작동합니다! 우리는 상위 클래스의 참조 변수 4개를 생성 Animal하고 이를 하위 클래스의 서로 다른 4개 객체에 할당했습니다. 결과적으로 각 개체는 다르게 동작합니다. 각 하위 클래스에 대해 재정의된 메서드는 클래스의 voice()"네이티브" 메서드 (단순히 콘솔에 "Voice!"를 출력함)를 대체했습니다. 재정의에는 다음과 같은 여러 가지 제한 사항이 있습니다. voice()Animal메소드 재정의 메커니즘의 작동 방식 - 3
  1. 재정의된 메서드에는 상위 메서드와 동일한 인수가 있어야 합니다.

    voice상위 클래스의 메서드가 input 으로 허용되는 경우 String하위 클래스의 재정의된 메서드도 input 으로 허용되어야 합니다 String. 그렇지 않으면 컴파일러에서 오류가 발생합니다.

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

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

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

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String voice() {         //error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. 재정의된 메서드의 액세스 한정자는 "원래" 메서드와 다를 수 없습니다.

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void voice() {      //error!
           System.out.println("Meow!");
       }
    }
Java에서 메소드 재정의는 다형성(지난 강의에서 이야기했던 OOP의 원리) 개념을 구현하기 위한 도구 중 하나입니다. 따라서 이를 사용하는 가장 큰 이점은 앞서 이야기한 것과 동일한 유연성이 될 것입니다. 우리는 간단하고 논리적인 클래스 시스템을 구축할 수 있습니다. 각 클래스는 특정 동작(개 짖는 소리, 고양이 야옹 소리)을 가지지만 단일 인터페이스를 사용합니다. voice()여러 메서드 대신 모두를 위한 하나의 메서드 등입니다 voiceDog().voiceCat()
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION