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();
}
관련글
'백엔드 > 자바' 카테고리의 다른 글
자바 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 |