Programing Language/JAVA

인터페이스와 디폴트, 스태틱 메서드

칼쵸쵸 2021. 2. 22. 21:50

JAVA 8 이후 부터 인터페이스에 default 한정자를 통해서 메서드를 직접 구현할 수 있다.

인터페이스에 구현된 메서드들은 해당 인터페이스를 구현한 클래스에서 공통적으로 사용 가능하다.

 

- 인터페이스

public interface TestInterface {

    //구현해야될 메서드
    String hi();

    /**
     * (@impspec 대문자 변환)
     */
    //default 메서드
   default void uppperString()
    {
        //hi()에 정상적인 값이 들어올지 알수 없음
        System.out.println(hi().toUpperCase());
    }

}

- 구현된 객체

public class TestClass implements TestInterface{

    @Override
    public String hi()
    {
        return "hi";
    }
}

 

1.  인터페이스의 디폴트 메서드는 구현된 hi 의 리턴값 "hi"를 사용함

2.  디폴트 메서드가 사용하는 메서드가 정상적으로 구현되어 있는지 , 값이 정상적으로 리턴되는 메서드인지 확인 할 방법이 없음'

3. @impspec등 주석을 통해서 정확한 구현에 대한 설명을 해야됨

4. equals 나 toString 처럼 최상위 Object 객체가 제공하는 메서드는 디폴트 메서드로 정의 불가

5. 인터페이스를 상속받는 인터페이스에서 다시 추상화 시킬수 있음

6. 다중 인터페이스 상속시 디폴트 메서드가 충돌하여 문제 발생할 여지 있음

 

Ex)

 

인터페이스2

public interface TestInterface2 {
    String hi();

    default void uppperString()
    {
        System.out.println("another");
    }
}

 

위의 인터페이스1과 인터페이스2를 다중 상속 받은 클래스

public class TestClass implements TestInterface , TestInterface2{

    @Override
    public String hi()
    {
        return "hi";
    }

    @Override
    public void uppperString() {
        // upperString overriding 해야됨
        System.out.println("Cant use default method");
    }
}

 

인터페이스 다중 상속시 상속한 인터페이스간의 디폴트 메서드(uppersString) 가 같아 충돌 할 시에는 구현하는 메서드에서 해당 디폴트 메서드를 Overriding하여 새로은 메서드를 직접 지정해야됨

'Programing Language > JAVA' 카테고리의 다른 글

Enumeration과 Iterator  (0) 2021.02.25
JAVA Exception 처리  (0) 2021.02.23
Abstract Class와 Interface의 차이  (0) 2021.02.22
New String 과 Literal String  (0) 2021.02.22
String , StringBuffer , StringBuilder  (0) 2021.02.21