JavaRush /Java Blog /Random-KO /인터페이스의 기본 메소드

인터페이스의 기본 메소드

Random-KO 그룹에 게시되었습니다
각각의 새로운 Java 버전은 이전 버전과 다릅니다. 다음은 우리가 다룬 내용의 변경 사항에 대한 예입니다. Java 5 이전에는 enum언어에 '가 없었습니다.
인터페이스의 기본 메소드 - 1
마찬가지로 Java 8은 Java 7과 눈에 띄게 다릅니다. 대부분의 강의는 Java 7 버전으로 작성되었지만 물론 중요한 혁신을 무시하지는 않을 것입니다. 이번 강의에서는 인터페이스에 대해 이야기하고 있으므로 업데이트 중 하나인 인터페이스의 기본 메서드를 살펴보겠습니다 . 인터페이스가 를 구현하지 않는다는 것을 이미 알고 있습니다 . 그것의 임무는 그것을 구현하는 모든 객체가 어떤 행동을 가져야 하는지를 설명하는 것 입니다 . 그러나 개발자는 모든 클래스에서 메서드 구현이 동일한 상황에 자주 직면했습니다. 오래된 자동차의 예를 살펴보겠습니다.
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
이 코드의 주요 문제점은 무엇이라고 생각하시나요? 아마도 우리가 동일한 코드를 여러 개 작성했다는 것을 눈치챘을 것입니다! 이 문제는 프로그래밍에서 흔히 발생하므로 피해야 합니다. 또 다른 점은 Java 8이 출시되기 전에는 특별한 솔루션 옵션이 없었다는 것입니다. 이 버전이 나오자 기본 메소드를 정의 하고 인터페이스 내에서 바로 구현하는 것이 가능해졌습니다! 수행 방법은 다음과 같습니다.
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
이제 모든 머신에 동일했던 메소드 gas()와 가 인터페이스에 포함되어 중복 코드가 필요하지 않습니다. brake()게다가, 각 클래스마다 메소드가 제공됩니다!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
메소드가 포함된 클래스가 100개 있는데 gas()그 중 99개만 동일한 동작을 하는 경우 어떻게 되나요? 이로 인해 모든 것이 망가지고 이 경우 기본 방법이 작동하지 않습니까? 물론 아닙니다 :) 인터페이스의 기본 메서드를 재정의할 수 있습니다.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
다른 99개 유형의 기계는 모두 기본 방법을 구현하며 클래스 UnusualCar(예외)는 전체 그림을 망치지 않고 해당 동작을 침착하게 결정합니다. 인터페이스의 다중 상속 이미 알고 있듯이 Java에는 다중 상속이 없습니다. 그 이유는 여러가지가 있는데, 이에 대해서는 별도의 강의에서 자세히 살펴보도록 하겠습니다. 예를 들어 C++와 같은 다른 언어에서는 그 반대입니다. 다중 상속이 없으면 심각한 문제가 발생합니다. 동일한 개체가 다양한 특성과 "동작"을 가질 수 있습니다. 삶의 예: 부모에게 우리는 어린이이고, 교사에게 우리는 학생이며, 의사에게 우리는 환자입니다. 인생에서 우리는 다른 역할을 하고 그에 따라 다르게 행동합니다. 분명히 우리는 친한 친구와는 다르게 교사와 대화할 것입니다. 이 상황을 코드로 변환해 보겠습니다. Pond와 Aviary라는 두 가지 클래스가 있다고 가정해 보겠습니다. 연못에는 헤엄치는 새가 필요하고 새장에는 날아다니는 새가 필요합니다. 이를 위해 우리는 두 개의 기본 클래스인 FlyingBird및 를 만들었습니다 Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
따라서 우리는 에서 클래스를 물려받은 새를 새장으로 보내고 에서 FlyingBird내려온 새를 연못으로 보낼 것입니다 Waterfowl. 모든 것이 단순해 보입니다. 하지만 어딘가에 있는 오리의 신원을 확인해야 한다면 어떻게 해야 할까요? 그녀는 수영도 하고 날기도 합니다. 하지만 우리에겐 다중 상속이 없습니다. 다행히 Java는 다양한 인터페이스 구현을 제공합니다. 클래스가 여러 부모로부터 상속받을 수 없는 경우 여러 인터페이스를 구현하는 것은 쉽습니다! 우리 오리는 날 수도 있고 헤엄칠 수도 있습니다 :) 원하는 결과를 얻으려면 클래스보다는 FlyingBird인터페이스 를 사용하는 것으로 충분합니다.Waterfowl
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
덕분에 우리 프로그램은 유연한 클래스 관리를 유지하고 기본 메소드 구현과 결합하여 객체의 동작을 정의하는 능력이 거의 무한해집니다! :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION