웹사이트 검색

Java 8 인터페이스 변경 사항 - 정적 방법, 기본 방법


Java 8 인터페이스 변경 사항에는 인터페이스의 정적 메서드 및 기본 메서드가 포함됩니다. Java 8 이전에는 인터페이스에 메서드 선언만 있을 수 있었습니다. 그러나 Java 8부터는 인터페이스에 기본 메서드와 정적 메서드를 포함할 수 있습니다.

자바 8 인터페이스

Java 인터페이스 기본 방법

Java 인터페이스에서 기본 메소드를 생성하려면 메소드 서명과 함께 "default\ 키워드를 사용해야 합니다. 예를 들면 다음과 같습니다.

package com.journaldev.java8.defaultmethod;

public interface Interface1 {

	void method1(String str);
	
	default void log(String str){
		System.out.println("I1 logging::"+str);
	}
}

log(String str)는 Interface1의 기본 메서드입니다. 이제 클래스가 Interface1을 구현할 때 인터페이스의 기본 메서드에 대한 구현을 제공하는 것이 필수는 아닙니다. 이 기능은 추가 메서드로 인터페이스를 확장하는 데 도움이 되며 필요한 것은 기본 구현을 제공하는 것뿐입니다. 다음과 같은 메서드가 있는 또 다른 인터페이스가 있다고 가정해 보겠습니다.

package com.journaldev.java8.defaultmethod;

public interface Interface2 {

	void method2();
	
	default void log(String str){
		System.out.println("I2 logging::"+str);
	}

}

컴파일러가 어떤 슈퍼클래스 메서드를 사용할지 결정할 수 없는 \다이아몬드 문제\가 발생하기 때문에 Java에서 여러 클래스를 확장할 수 없다는 것을 알고 있습니다. 기본 메서드를 사용하면 인터페이스에 대해서도 다이아몬드 문제가 발생합니다. 클래스가 Interface1Interface2를 모두 구현하고 공통 기본 메서드를 구현하지 않으면 컴파일러에서 어느 것을 선택할지 결정할 수 없기 때문입니다. Java의 일부인 핵심 Java 클래스와 대부분의 엔터프라이즈 애플리케이션 및 프레임워크에서 찾을 수 있습니다. 따라서 이 문제가 인터페이스에서 발생하지 않도록 하기 위해 일반적인 기본 메서드에 대한 구현을 제공해야 합니다. 따라서 클래스가 위의 두 인터페이스를 모두 구현하는 경우 log() 메서드에 대한 구현을 제공해야 합니다. 그렇지 않으면 컴파일러에서 컴파일 시간 오류가 발생합니다. Interface1을 모두 구현하는 간단한 클래스 인터 face2는 다음과 같습니다.

package com.journaldev.java8.defaultmethod;

public class MyClass implements Interface1, Interface2 {

	@Override
	public void method2() {
	}

	@Override
	public void method1(String str) {
	}

	@Override
	public void log(String str){
		System.out.println("MyClass logging::"+str);
		Interface1.print("abc");
	}
}

Java 인터페이스 기본 메소드에 대한 중요한 사항:

  1. Java 인터페이스 기본 메서드는 구현 클래스를 손상시킬 염려 없이 인터페이스를 확장하는 데 도움이 됩니다.
  2. Java 인터페이스 기본 메서드에는 인터페이스와 추상 클래스 간의 차이점이 있습니다.
  3. Java 8 인터페이스 기본 메소드는 인터페이스 자체에서 모든 Collections 클래스 메소드를 제공할 수 있는 것과 같은 유틸리티 클래스를 피하는 데 도움이 됩니다.
  4. Java 인터페이스 기본 메소드는 기본 구현 클래스를 제거하는 데 도움이 되며 기본 구현을 제공할 수 있으며 구현 클래스는 재정의할 클래스를 선택할 수 있습니다.
  5. 인터페이스에 기본 메서드를 도입하는 주된 이유 중 하나는 람다 식을 지원하도록 Java 8의 Collections API를 향상시키기 위한 것입니다.
  6. 계층 구조의 클래스에 서명이 동일한 메서드가 있는 경우 기본 메서드는 관련이 없습니다. 기본 메서드는 java.lang.Object의 메서드를 재정의할 수 없습니다. 추론은 매우 간단합니다. Object가 모든 Java 클래스의 기본 클래스이기 때문입니다. 따라서 인터페이스에 기본 메서드로 정의된 Object 클래스 메서드가 있더라도 항상 Object 클래스 메서드가 사용되기 때문에 쓸모가 없습니다. 그렇기 때문에 혼동을 피하기 위해 Object 클래스 메서드를 재정의하는 기본 메서드를 사용할 수 없습니다.
  7. Java 인터페이스 기본 방법은 Defender 방법 또는 가상 확장 방법이라고도 합니다.

Java 인터페이스 정적 메서드

Java 인터페이스 정적 메서드는 구현 클래스에서 재정의할 수 없다는 점을 제외하면 기본 메서드와 유사합니다. 이 기능은 구현 클래스에서 구현이 불량한 경우 원하지 않는 결과를 피하는 데 도움이 됩니다. 간단한 예를 들어 살펴보겠습니다.

package com.journaldev.java8.staticmethod;

public interface MyData {

	default void print(String str) {
		if (!isNull(str))
			System.out.println("MyData Print::" + str);
	}

	static boolean isNull(String str) {
		System.out.println("Interface Null Check");

		return str == null ? true : "".equals(str) ? true : false;
	}
}

이제 구현이 좋지 않은 isNull() 메서드가 있는 구현 클래스를 살펴보겠습니다.

package com.journaldev.java8.staticmethod;

public class MyDataImpl implements MyData {

	public boolean isNull(String str) {
		System.out.println("Impl Null Check");

		return str == null ? true : false;
	}
	
	public static void main(String args[]){
		MyDataImpl obj = new MyDataImpl();
		obj.print("");
		obj.isNull("abc");
	}
}

isNull(String str)은 간단한 클래스 메서드이며 인터페이스 메서드를 재정의하지 않습니다. 예를 들어 isNull() 메서드에 @Override 주석을 추가하면 컴파일러 오류가 발생합니다. 이제 응용 프로그램을 실행하면 다음과 같은 결과가 나타납니다.

Interface Null Check
Impl Null Check

인터페이스 메서드를 정적에서 기본값으로 만들면 다음과 같은 결과가 나타납니다.

Impl Null Check
MyData Print::
Impl Null Check

Java 인터페이스 정적 메서드는 인터페이스 메서드에서만 볼 수 있습니다. MyDataImpl 클래스에서 isNull() 메서드를 제거하면 MyDataImpl에 사용할 수 없습니다. 물체. 그러나 다른 정적 메서드와 마찬가지로 클래스 이름을 사용하여 인터페이스 정적 메서드를 사용할 수 있습니다. 예를 들어 유효한 진술은 다음과 같습니다.

boolean result = MyData.isNull("abc");

자바 인터페이스 정적 메서드에 대한 중요한 사항:

  1. Java 인터페이스 정적 메서드는 인터페이스의 일부이므로 구현 클래스 개체에 사용할 수 없습니다.
  2. Java 인터페이스 정적 메서드는 null 검사, 컬렉션 정렬 등과 같은 유틸리티 메서드를 제공하는 데 적합합니다.
  3. 자바 인터페이스 정적 메서드는 구현 클래스가 재정의하지 않도록 하여 보안을 제공하는 데 도움이 됩니다.
  4. 객체 클래스 메서드에 대한 인터페이스 정적 메서드를 정의할 수 없습니다. "이 정적 메서드는 객체에서 인스턴스 메서드를 숨길 수 없습니다”라는 컴파일러 오류가 발생합니다. 이는 객체가 기본이기 때문에 자바에서 허용되지 않기 때문입니다. 모든 클래스에 대한 클래스이며 하나의 클래스 수준 정적 메서드와 동일한 서명을 가진 다른 인스턴스 메서드를 가질 수 없습니다.
  5. Java 인터페이스 정적 메소드를 사용하여 컬렉션과 같은 유틸리티 클래스를 제거하고 모든 정적 메소드를 찾고 사용하기 쉬운 해당 인터페이스로 이동할 수 있습니다.

자바 기능 인터페이스

포스팅을 마치기 전에 기능적 인터페이스에 대해 간략하게 소개하고자 합니다. 정확히 하나의 추상 메서드가 있는 인터페이스를 기능 인터페이스라고 합니다. 새로운 어노테이션 @FunctionalInterface 어노테이션은 기능적 인터페이스에 추상 메소드가 실수로 추가되는 것을 방지하는 기능입니다. 선택 사항이지만 사용하는 것이 좋습니다. 기능적 인터페이스는 람다 식을 사용하여 인스턴스화할 수 있기 때문에 오랫동안 기다려온 Java 8의 기능입니다. 람다 식 및 메서드 참조에 대한 대상 유형을 제공하기 위해 여러 기능 인터페이스가 포함된 새 패키지 java.util.function이 추가되었습니다. 향후 게시물에서 기능적 인터페이스와 람다 식을 살펴보겠습니다.