각 새 버전의 Java는 이전 버전과 다릅니다. 우리가 다룬 자료에서 이러한 변경의 예로 enumsJava 5 이전에는 언어가 없었습니다.
인터페이스의 기본 메서드 - 1
마찬가지로 Java 8은 Java 7과 눈에 띄게 다릅니다. 물론 우리는 중요한 혁신을 무시하지 않을 것입니다. 이 단원에서 인터페이스에 대해 이야기하고 있으므로 언어에 대한 한 가지 업데이트인 인터페이스의 기본 메서드를 살펴보겠습니다 . 인터페이스가 동작을 구현하지 않는다는 것을 이미 알고 있습니다 . 그 목적은 인터페이스를 구현하는 모든 개체에 어떤 동작이 있어야 하는지 설명하는 것입니다 . 그러나 개발자는 메서드 구현이 모든 클래스에서 동일한 상황에 자주 직면했습니다. 오래된 자동차의 예를 살펴보겠습니다.
public interface Car {

   public void gas();

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

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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

   @Override
   public void go() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void go() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
이 코드의 주요 문제는 무엇이라고 생각하십니까? 당신은 아마도 우리가 많은 중복 코드를 작성했다는 것을 알아차렸을 것입니다! 이것은 프로그래밍에서 흔히 발생하는 문제이며 피해야 합니다. Java 8이 출시되기 전에는 특별한 솔루션이 없었다는 것은 또 다른 문제입니다. Java 8이 출시되었을 때 기본 메서드를 정의 하고 인터페이스 내에서 바로 구현할 수 있게 되었습니다! 방법은 다음과 같습니다.
public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

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 go() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car slows down differently!");
   }
}
다른 99개 유형의 자동차는 모두 기본 방법을 사용하지만UnusualCar클래스는 예외입니다. 큰 그림을 망치지 않고 침착하게 자신의 행동을 정의합니다. 인터페이스의 다중 상속. 이미 알고 있듯이 Java에는 다중 상속이 없습니다. 여기에는 여러 가지 이유가 있습니다. 별도의 강의에서 자세히 살펴볼 것입니다. C++와 같은 다른 언어에서는 상황이 반대입니다. 동일한 개체가 여러 가지 다른 특성과 동작을 가질 수 있으므로 다중 상속은 심각한 문제를 제시하지 않습니다. 예를 들어, 우리는 부모에게 자녀, 교사에게 학생, 의사에게 환자입니다. 실생활에서 우리는 다양한 역할을 수행하고 그에 따라 다르게 행동합니다. 분명히 우리는 친한 친구와 다르게 교사와 상호 작용합니다. 이 상황을 코드로 변환해 봅시다. Pond와 Aviary라는 두 개의 클래스가 있다고 상상해 봅시다. 연못에는 헤엄치는 새가 필요하고 새장에는 날아다니는 새가 필요합니다. 이를 나타내기 위해 두 개의 기본 클래스를 만들었습니다.FlyingBird그리고 Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
따라서 물려받은 새는 조류 사육장으로 보내고 FlyingBird파생된 새는 Waterfowl연못으로 갑니다. 모든 것이 간단 해 보입니다. 하지만 어디선가 오리를 정의해야 한다면 어떻게 해야 할까요? 오리는 헤엄치고 날기도 합니다. 그러나 우리는 다중 상속이 없습니다. 다행스럽게도 Java는 여러 인터페이스 구현을 지원합니다. 클래스가 여러 부모를 상속할 수 없는 경우 여러 인터페이스를 구현하는 것은 쉽습니다! 우리 오리는 날아다니는 새일 수도 있고 헤엄치는 새일 수도 있습니다 :) 원하는 결과를 얻으려면 클래스가 아닌 make FlyingBird와 인터페이스만 있으면 됩니다.Waterfowl
public class Duck implements FlyingBird, Waterfowl {

   // Methods of both interfaces combine easily into one class

   @Override
   public void fly() {
       System.out.println("Flying!");
   }

   @Override
   public void swim() {

       System.out.println("Swimming!");
   }
}
이것은 우리 프로그램이 수업을 유연하게 관리할 수 있는 능력을 유지한다는 것을 의미합니다. 이를 기본 방법과 결합하면 개체의 동작을 결정하는 능력이 거의 무한해집니다! :)