티스토리 뷰
자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 네 번째는 default 메서드와 static 메서드다.
자바 8부터 인터페이스의 추가할 수 있는 새로운 기능이다.
API이나 스프링 코드가 이 기능 덕분에 많은 변화가 있었다고 한다.
간단한 예시 인터페이스(GreetingInterface)와 그를 구현한 클래스를 살펴보자.
public interface GreetingInterface {
void printName();
}
import java.util.Arrays;
public class App implements GreetingInterface {
@Override
public void printName() {
}
}
GreetingInterface를 구현했을 때 제공해주는 공통 인스턴스를 추가하고 있을 때에는 어떻게 할까?
GreetingInterface에 하나를 추가해보자.
public interface GreetingInterface {
void printName();
void upperPrintName();
}
이렇게 됐을 경우 GreetingInterface을 구현한 모든 클래스에서도 오버라이딩을 해야하기 때문에 전체 에러가 나버린다.
🐻 이 때 사용되는 것이 디폴트 메서드다.
디폴트 메서드
- 인터페이스에 메서드 선언이 아닌 구현체를 제공해주는 메서드다.
- 이 덕분에 해당 인터페이스를 구현한 클래스를 깨뜨리지 않고 새 기능을 추가할 수 있다.
public interface GreetingInterface {
void printName();
default void upperPrintName() {
System.out.println("GREETINGINTERFACE");
}
}
- 하지만 구현한 클래스에서는 모르는 기능이 추가되는거므로 리스크가 존재한다.
- 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
- 문서화는 필수(@implSpec 자바독 태그를 사용한다.)
- Object에서 제공하는 메서드(toString, equals)는 기본 메서드로 제공할 수 없다.
- 인터페이스를 상속받는 인터페이스에서 다시 추상 메서드로 변경할 수 있다.
- ⇒ 추상 메서드로 변경하는 이유는 디폴트 메서드를 다시 정의하고 싶어서
- 인터페이스 구현체가 이 디폴트 메서드도 재정의할 수도 있다.
🐻 인터페이스는 다중 상속이 가능한데 두 개의 인터페이스에서 같은 디폴트 메서드를 제공한다면?
자바는 둘 중 어떤걸 써야하는지 판단을 못하므로 컴파일 에러가 발생한다.
이 경우에는 충돌하는 디폴트 메서드를 직접 오버라이딩해줘야 한다.
스태틱 메서드
디폴트 메서드들은 인스턴스가 사용하는 거고, 핼퍼 또는 유틸리티 메서드를 제공할 때에는 스태틱 메서드를 제공한다.
인터페이스와 구현한 클래스 예제 코드를 살펴보자.
public interface GreetingInterface {
void printName();
default void upperPrintName() {
System.out.println("GREETINGINTERFACE");
}
static void printEric() {
System.out.println("Eric");
}
}
import java.util.Arrays;
import java.util.Comparator;
public class App implements GreetingInterface {
@Override
public void printName() {
}
public static void main(String[] args) {
GreetingInterface.printEric();
}
}
'JAVA > JAVA8' 카테고리의 다른 글
자바 8에 추가된 기술 [6] Optional (0) | 2022.02.05 |
---|---|
자바 8에 추가된 기술 [5] Stream (0) | 2022.01.23 |
자바 8에 추가된 기술 [3] 메서드 레퍼런스 (0) | 2022.01.22 |
자바 8에 추가된 기술 [2] 람다 표현식 (0) | 2022.01.21 |
자바 8에 추가된 기술 [1] 함수형 인터페이스 (0) | 2022.01.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- programmers
- kotest
- 정규표현식
- Java
- 테라폼
- 객체지향
- 프로그래머스
- 백준
- Algorithm
- MSA
- BOJ
- Kotlin
- Spring
- Olympiad
- 알고리즘
- 이펙티브 자바
- 이팩티브 자바
- AWS
- 클린 코드
- BAEKJOON
- Effective Java
- 클린 아키텍처
- 디자인패턴
- C++
- 코테
- kkoon9
- 디자인 패턴
- node.js
- Spring Boot
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함