모든 새 버전의 Java는 이전 버전과 다릅니다. 다음은 우리가 다룬 자료의 변경 사항에 대한 예입니다. Java 5 이전에는 언어에
마찬가지로 Java 8은 Java 7과 현저하게 다릅니다. 대부분의 수업은 언어의 7번째 버전용으로 작성되었지만 물론 중요한 혁신을 무시하지는 않을 것입니다. 우리는 이미 이 수업에서 인터페이스에 대해 이야기하고 있기 때문에 하나의 업데이트인 인터페이스의 기본 메서드를 고려할 것입니다 . 인터페이스가 동작을 구현하지 않는다는 것을 이미 알고 있습니다 . 그것의 임무는 그것을 구현하는 모든 객체가 가져야 하는 동작을 설명하는 것 입니다.. 그러나 개발자는 메서드 구현이 모든 클래스에서 동일한 상황에 자주 직면했습니다. 오래된 자동차의 예를 살펴보겠습니다.
enum
s가 없었습니다. ![인터페이스의 기본 메서드 - 1](https://cdn.codegym.cc/images/article/34d25d0e-f8da-43f7-ab2b-5333c5a01585/800.jpeg)
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 gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class F1Car implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
"이 코드의 주요 문제가 무엇이라고 생각하십니까? 우리가 반복되는 코드를 많이 작성했다는 것을 눈치채셨을 것입니다! 이 문제는 프로그래밍에서 일반적이며 피해야 합니다. 이전에는 특정 솔루션이 존재하지 않았다는 것은 또 다른 문제입니다. 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 gas() {
System.out.println("This car accelerates differently!");
}
@Override
public void brake() {
System.out.println("This car decelerates differently!");
}
}
다른 99가지 유형의 자동차는 모두 기본 방법을 구현하고UnusualCar
예외인 클래스는 전체 그림을 망치지 않고 침착하게 자체 동작을 정의합니다. 인터페이스의 다중 상속. 이미 알고 있듯이 Java는 다중 상속을 지원하지 않습니다. 여기에는 여러 가지 이유가 있습니다. 별도의 강의에서 자세히 살펴보겠습니다. C++와 같은 다른 언어는 이를 지원합니다. 다중 상속이 없으면 심각한 문제가 발생합니다. 하나의 개체가 여러 가지 특성과 '동작'을 가질 수 있습니다. 다음은 삶의 예입니다. 우리는 부모에게 자녀, 교사에게 학생, 의사에게 환자입니다. 인생에서 우리는 다른 역할을 맡고 그에 따라 다르게 행동합니다. 분명히 우리는 친한 친구에게 말하는 것과 같은 방식으로 교사에게 말하지 않을 것입니다. 이것을 코드로 번역해 봅시다. 두 개의 클래스가 있다고 상상해보십시오. 연못과 새장. 연못에는 물새가 필요합니다. 새장에는 날아 다니는 새가 필요합니다. 이를 위해 두 개의 기본 클래스를 만들었습니다.FlyingBird
그리고 Waterfowl
.
public class Waterfowl {
}
public class FlyingBird {
}
따라서 우리는 조류 사육장에 상속되는 클래스의 새를 보내고 연못에 FlyingBird
상속되는 새를 보냅니다 . Waterfowl
모든 것이 매우 간단해 보입니다. 그러나 우리는 오리를 어디로 보내나요? 그것은 수영하고 날아갑니다. 그리고 우리는 다중 상속이 없습니다. 다행스럽게도 Java는 여러 인터페이스 구현을 지원합니다. 클래스는 여러 부모를 상속할 수 없지만 여러 인터페이스를 쉽게 구현할 수 있습니다! 우리 오리는 날아다니는 새이자 물새가 될 수 있습니다 :) 원하는 결과를 얻으려면 클래스가 아닌 만들고 인터페이스 하기 만 하면 됩니다 .FlyingBird
Waterfowl
public class Duck implements FlyingBird, Waterfowl {
// The methods of both interfaces can be easily combined into one class
@Override
public void fly() {
System.out.println("Fly!");
}
@Override
public void swim() {
System.out.println("Swim!");
}
}
따라서 우리 프로그램은 클래스의 유연성을 유지하고 기본 메서드와 결합하여 개체의 동작을 정의하는 기능이 거의 무제한이 됩니다! :)