Contents
The Java8(인터페이스 - Default 메소드와 Static 메소드)
   Jul 16, 2022     2 min read

인터페이스 Default 메소드와 Static 메소드

인터페이스 기본 메소드와 스태틱 메소드

자바 8 이전에는 ..

public interface Hi{
		void printName();
}

Hi 라는 인터페이스 생성

public class DefaultHi implement Hi{
	@Override
	public void printName(){
		System.out.println("DefaultHi");
	}
}

Hi라는 인터페이스를 구현한 DefaultHi 클래스

이런식으로 구현하고 사용하는 중 인터페이스에 또 다른 기능을 추가하고 싶다..

어떻게 해야할까 ?

public interface Hi{

		void printName();

		void printNameUpperCase(); // 추가
}

무작정 인터페이스에 메소드(printNameUpperCase() )를 추가해 보았다.

해당 인터페이스를 구현하는 모든 클래스들은 Error가 뜬다. (컴파일 에러)

에러 내용 : 대충 인터페이스 구현을 다 안했다는 내용

Class ‘DefautlHi’ must either be declared abstract or implement abstract method ‘printNameUpperCase()’ in ‘Hi’

해결법 ?

Java 8에서 업데이트된 “default” 키워드가 해결해 줄 수 있다.

기본 메소드 (Default Methods) 특징

  1. 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법
  2. 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
public interface Hi{

		void printName();

		//defautlt 키워드를 사용하면 인터페이스에서도 구현체를 작성할 수 있다.
		default void printNameUpperCase(){
			System.out.println(getName.)
		}
}

  1. 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.
    • 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
    • 반드시 문서화 할 것. (@implSpec 자바독 태그 사용)
  2. Object가 제공하는 기능(toString,equals, hasCode)은 기본 메소드로 제공할 수 없음
    • 구현체는 재정의해야 한다.
//toString
default String toString() {
}

Tip. 선언은 가능하다.

String toString();

참고 : 백기선 - The Java8