티스토리 뷰
08 : 인터페이스의 정적 메서드
일반적으로 인터페이스를 동반하는 클래스들에 정적 메서드를 두었다. 자바 표준 라이브러리에서 Collection/Collections 또는 Path/Paths 같은 인터페이스와 유티리티 클래스 쌍이 대표적이다.
Paths 클래스를 살펴보자. 이 클래스는 몇 가지 팩토리 메서드(Factory method)만 포함하고 있다. Paths.get("jdk1.8.0", "jre", "bin")처럼 일련의 문자열로부터 경로(Path)를 만들 수 있다. 자바 8에서는 Path 인터페이스에 이 메서드를 추가할 수도 있었다.
1 2 3 4 5 6 | public interface Path{ public static Path get(String first, String ... more){ return FileSystem.getDefault().getPath(first, more); } ... } |
이렇게 하면 Paths 클래스가 더는 필요 없다.
Collections 클래스를 살펴보면 두 종류의 메서드를 찾을 수 있다.
1 | public static void shuffle(List<?> list) |
이러한 메서드는 다음과 같은 List 인터페이스의 디폴트 메서드로 잘 동작할 것이다.
1 | public default void shuffle() |
이 경우 모든 리스트들 대상으로 list.shuffle()을 호출 할 수 있다.
팩토리 메서드인 경우 메서드를 호출할 대상 객체가 없으므로 동작하지 않는다. 바로 이 부분이 정적 인터페이스 메서드가 등장할 곳이다.
1 2 | public static <T> List<T> nCopies(int n, T o) //o 인스턴스 n개로 구성된 리스르 |
이 경우 Collections.nCopies(10, "Fred") 대신 List.nCopies(10, "Fred")를 호출할 수 있고, 코드 읽는 사람은 결과가 List 임을 분명히 알수 있다.
Comparator 인터페이스는 키 추출 함수를 받아서 추출된 키들을 비교하는 비교자를 돌려주는 아주 유용한 정적 comparing 메서드를 제공한다.
Person 객체를 이름으로 비교하려면 Comparator.comparing(Person::name)을 사용 하면 된다.
<소스코드>
https://github.com/JayStevency/Java8/blob/master/src/com/java8/staticmethod/StaticMethod.java
'Language > Java' 카테고리의 다른 글
[JAVA8] 스트림 API (0) | 2017.01.31 |
---|---|
[JAVA8] 람다 표현식 (0) | 2017.01.29 |
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
[JAVA8] 람다 표현식 (0) | 2017.01.24 |
[JAVA8] 람다 표현식 (0) | 2017.01.18 |