English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 흐름 제어

Java 배열

Java 방향 대상(I)

Java 방향 대상(II)

Java 방향 대상(III)

Java 예외 처리

Java 리스트(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 8 기본 메서드

Java 8 새로운 기능

Java 8 인터페이스의 기본 메서드가 추가되었습니다.

간단히 말해서, 기본 메서드는 인터페이스가 구현 메서드를 가질 수 있으며, 구현 클래스가 메서드를 구현하지 않아도 됩니다.

기본 메서드를 구현하려면 메서드 이름 앞에 default 키워드를 추가하면 됩니다.

이 특성이 필요한 이유는 무엇인가요?

먼저, 이전 인터페이스는 양면의 날카로운 도구였습니다. 장점은 추상화에 대한 방향이 아니라 구체화에 대한 방향이었으며, 단점은 인터페이스를 수정할 때에는 모든 인터페이스를 구현한 클래스를 수정해야 했습니다. 현재의 java 8 이전의 컬렉션 프레임워크에는 foreach 메서드가 없었으며, 일반적으로 JDK에 관련 인터페이스에 새로운 메서드와 구현을 추가하는 방법을 생각할 수 있습니다. 그러나, 이미 출시된 버전에서는 인터페이스에 새로운 메서드를 추가하면서 기존 구현에 영향을 미치지 않도록 할 수 없기 때문에 기본 메서드가 도입되었습니다. 그들의 목적은 인터페이스의 수정과 기존 구현 간의 불일치 문제를 해결하는 것입니다.

문법

기본 메서드 문법 형식은 다음과 같습니다:

public interface Vehicle {
   default void print(){
      System.out.println("저는 차량입니다!");
   }
}

여러 기본 메서드

인터페이스에 기본 메서드가 있을 때, 하나의 클래스가 여러 인터페이스를 구현하며 이 인터페이스들이 같은 기본 메서드를 가지고 있다면, 다음 예제는 이러한 상황의 해결책을 설명합니다:

public interface Vehicle {
   default void print(){
      System.out.println("저는 차량입니다!");
   }
}
 
public interface FourWheeler {
   default void print(){
      System.out.println("저는 네륜차입니다!");
   }
}

첫 번째 해결책은 자신의 기본 메서드를 생성하여 인터페이스의 기본 메서드를 덮어쓸 수 있습니다:

public class Car implements Vehicle, FourWheeler {
   default void print(){
      System.out.println("저는 네륜차입니다!");
   }
}

두 번째 해결책은 super를 사용하여 지정된 인터페이스의 기본 메서드를 호출할 수 있습니다:

public class Car implements Vehicle, FourWheeler {
   public void print(){
      Vehicle.super.print();
   }
}

정적 기본 메서드

Java 8 또한 인터페이스는 선언할 수 있으며 (또는 구현할 수 있습니다). 예를 들어:

public interface Vehicle {
   default void print(){
      System.out.println("저는 차량입니다!");
   }
    // 정적 메서드
   static void blowHorn(){
      System.out.println("빵소리!!!");
   }
}

기본 메서드 예제

다음 코드를 통해 기본 메서드의 사용에 대해 이해할 수 있습니다. 코드를 Java에 넣을 수 있습니다.8Tester.java 파일에서:

public class Java8Tester {
   public static void main(String args[]){
      Vehicle vehicle = new Car();
      vehicle.print();
   }
}
 
interface Vehicle {
   default void print(){
      System.out.println("저는 차량입니다!");
   }
    
   static void blowHorn(){
      System.out.println("빵소리!!!");
   }
}
 
interface FourWheeler {
   default void print(){
      System.out.println("저는 네륜차입니다!");
   }
}
 
class Car implements Vehicle, FourWheeler {
   public void print(){
      Vehicle.super.print();
      FourWheeler.super.print();
      Vehicle.blowHorn();
      System.out.println("저는 차량입니다!");
   }
}

위의 스크립트를 실행하면, 출력 결과는 다음과 같습니다:

$ javac Java8Tester.java 
$ java Java8Tester
저는 차량입니다!
저는 네륜차입니다!
빵소리!!!
저는 차량입니다!

Java 8 새로운 기능