본문 바로가기

백엔드/자바

자바8의 인터페이스

1. Default 메소드

등장배경

아래의 인터페이스가 있다.

public interface StaticAndDefault {
    void printName();
}

 

해당 인터페이스를 구현한 구현체 클래스가 1000개 있다고 가정해보자.

만약 해당 인터페이스에 함수가 하나 추가되어야하는 상황이라면? 그리고 추가될 함수는 어떤 구현체든지 동일한 로직이라면? 복붙을 1000번 해야하는 상황이 오게된다.

 

사용방법

public interface StaticAndDefault {
    void hello();
    default void hi() {
        System.out.println("hi");
    }
}

default 키워드를 붙인 함수를 인터페이스에 넣어주면 해당 인터페이스의 모든 구현체는 default 키워드가 붙은 함수들을 갖는다. 

 

주의사항

1. 어떤 구현체에서는 에러가 발생할 수도 있음.

public interface StaticAndDefault {
    void hello();
    default void hi() {
        System.out.println("hi");
        System.out.println(getName().toUpperCase());
    }
    String getName();
}

getName의 리턴값이 null일수도 있음에 유의해야한다. 그래서 default 함수는 문서화를 잘 해야한다.

2. Object가 제공하는 메소드와 동일한 이름은 불가능

Object의 함수를 재정의 할 수 없기 때문이다. abstract 메소드로 하는건 가능하다.

3. 동일한 이름의 default 메소드를 가진 인터페이스를 두개 이상 구현하면 에러.

public interface A {
    default void hi() {
        System.out.println("I'm A");
    }
}

public interface StaticAndDefault {
    default void hi() {
        System.out.println("hi");
    }
}

public class Foo2 implements StaticAndDefault, A{ // 에러.
    public static void main(String[] args) {
        Foo2 f2 = new Foo2();
        f2.hi();
    }
}

충돌하면 오버라이딩을 해야한다.

 

default 메소드 예시

List의 sort, replaceAll 등의 메소드들도 default로 구현되어있다!!

List는 Collection을 상속하고 있는데 Collection에는 생각보다 많이 유용한 메소드가 있었다.

List<String> names = new ArrayList<>();
names.add("aaa");
names.add("bbb");
names.add("cccc");
names.add("abcd");

names.removeIf(s -> s.startsWith("a"));
names.forEach(System.out::println);

// 결과
//bbb
//cccc
//dddd

removeIf는 인자로 넘어온 함수를 각 엔트리를 순회하며 실행해서 참일경우 삭제하는 것이다.

 

 

2. static 메소드

클래스의 static 메소드와 동일하다. 따로 구현체없이 static 메소드는 호출이 가능하다.

public interface StaticAndDefault {
    void hello();
    default void hi() {
        System.out.println("hi");
    }
    static void greeting() {
        System.out.println(" im static !");
    }
}


public static void main(String[] args) {
	StaticAndDefault.greeting();
}

 

 

관련글

https://www.inflearn.com/course/the-java-java8/dashboard

'백엔드 > 자바' 카테고리의 다른 글

자바 Executor  (0) 2021.10.01
자바 Stream과 Optional  (0) 2021.09.27
Ecplise failed while installing Java 1.8 해결  (0) 2021.06.21
스프링 mysql 연동  (0) 2021.04.04
자바 thread 간단 정리  (0) 2021.01.29