오늘은 인터페이스 디폴트 메소드와 스태틱 메소드를 알아 보도록 하겠습니다.
먼저, 이 글은 백기선님 자바 8 강의를 듣고 스터디하는 글 임을 미리 알려드립니다!
1. 인터페이스 디폴트 메소드와 스태틱 메소드란?
2. 인터페이스 디폴트 메소드와 스태틱 메소드 구현해보기
3. Java 8에서 디폴트 메소드와 스태틱 메소드 활용 되는 곳
인터페이스 디폴트 메소드와 스태틱 메소드란?
Default Method(디폴트 메소드)
인터페이스의 디폴트 메소드(default method)는 Java 8에서 추가된 기능으로,
인터페이스 내에서 구현을 가지는 메소드를 의미합니다.
이를 통해, 인터페이스를 구현하는 클래스에서 디폴트 메소드를 오버라이딩하지 않고도, 해당 메소드를 사용할 수 있습니다.
디폴트 메소드는 기본적으로 public이며, 인터페이스의 다른 메소드와 동일하게 호출할 수 있습니다.
- Chat GPT -
Default Method(디폴트 메소드) 설명에서 중요한 점은
- Java8에서 추가 되었다.
- 인터페이스 내에서 구현하는 메소드이다.
- 오버라이딩 하지 않고 해당 메소드를 사용할 수 있다.
- 다른 메소드와 동일하게 호출 할 수 있다.
디폴트 메소드는 인터페이스 내에서 구현하는 메소드인데 처음에 이게 무슨의미 인지 잘 몰랐었다.
인터페이스를 오버라이딩하지 않고 사용할 수 있다는게,,, 신기했던 부분중 하나다.
인터페이스에서 구현하면 장점은 해당 인터페이스를 구현한 구현체에서 해당 메소드를 추가 하지 않고 사용할 수 있다는 점이다.
물론 이 부분에서 디폴트 메소드의 대한 정의와 설명을 잘 해놓아야 점도 있다. 하지만 매우 유용하게 쓰일것 같은 기능으로 보인다.
Static Method(정적 메소드)
인터페이스의 스태틱 메소드(static method)는 Java 8에서 추가된 기능으로,
인터페이스 내에서 구현을 가지는 정적 메소드를 의미합니다.
이를 통해, 인터페이스를 구현하는 클래스에서 해당 메소드를 오버라이딩하지 않고도,
인터페이스 이름을 통해 해당 메소드를 직접 호출할 수 있습니다.
스태틱 메소드는 기본적으로 public이며, 인터페이스의 다른 메소드와 동일하게 호출할 수 있습니다.
- Chat GPT -
Static Method(정적 메소드) 설명에서 중요한 점은
- Java8에서 추가 되었고
- 인터페이스 내에서 구현을 가지는 정적메소드
- 구현하지 않고 인터페이스 이름을 통해 직접 호출 가능
- 기본적으로 Public 다른 메소드와 동이랗게 호출 가능
처음에 디폴트 메소드하고 정적 메소드하고 다른게 무엇일까?
왜냐하면 오버라이딩 하지 않고 사용할 수 있다는 점에서 좀 많이 헷갈렸습니다...
구현하는 클래스에서 오버라이딩 하지 않고 사용할 수 있다는 점은 같지만
정적 메소드는 인터페이스 이름을 통해 호출 할 수 있다는 (인스턴스 생성 시 호출이 안됩니다) 정적 메소드라는 점을 생각해 본다면
디폴트 메소드보다 하위 버전이라고 생각이 되어진다는 느낌도 듭니다.
인터페이스 디폴트 메소드와 스태틱 메소드 구현해보기
Book (인스턴스)
public interface Book {
//책 읽기
void readBookName();
//디폴트 메소드
default void defaultUpperCaseBook(String bookName) {
System.out.println(bookName.toUpperCase());
}
//정적 메소드
static String staticUpperCaseBook(String bookName) {
return bookName.toUpperCase();
}
//책 이름 가져오기
String getBookName();
}
DefaultBook (구현 클래스)
public class DefaultBook implements Book {
//객체
private String bookName;
//생성자
public DefaultBook(String bookName) {
this.bookName = bookName;
}
@Override
public void readBookName() {
//정적 메소드 사용
System.out.println(Book.staticUpperCaseBook(this.bookName));
}
@Override
public String getBookName() {
return this.bookName;
}
}
InterFaceMethodTest 테스트
public class InterFaceMethodTest {
@Test
public void bookTest(){
DefaultBook defaultBook = new DefaultBook("Hello");
//스테틱 메소드를 사용한 책 이름 가져오기
defaultBook.readBookName();
//디폴트 메소드
defaultBook.defaultUpperCaseBook(defaultBook.getBookName());
}
}
해당 코드를 보면 디폴트 메소드가 어떻게 쓰이는지 정적 메소드가 어떻게 쓰이는지 알 수 있다.
디폴트 메소드는 인터페이스에 구현하고 인스턴스에서 사용하는데 반면
정적 메소드는 구현체에서 인터페이스를 통해 사용하는 걸 볼 수 있다.
Java 8에서 디폴트 메소드와 스태틱 메소드 활용 되는 곳
디폴트 메소드와 스태틱 메소드가 활용 되는 곳은 되게 많은데 몇가지만 살펴 보겠습니다.
Default Method(디폴트 메소드);
Iterable forEach()
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Iterable spliterator()
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
Comparator reversed()
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
Comparator thenComparing()
default Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
}
Static Method(정적 메소드)
Comparator reverseOrder()
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder() {
return Collections.reverseOrder();
}
Comparator naturalOrder()
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
}
생각보다 기본 메소드는 많은 곳에서 이용된다.
이제 forEach나 stream 이용할 때마다 기본메소드가 생각 날 것 같습니다. 크크크
이번에는 기본 메소드 및 정적 메소드를 알아보았습니다.
많이 쓰이는 만큼 알아두면 유익할거라 생각됩니다. 감사합니다.
출처 : 백기선 Java 8 https://www.inflearn.com/course/the-java-java8/dashboard
더 자바, Java 8 - 인프런 | 강의
자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이
www.inflearn.com
'Java > 더 자바, Java 8' 카테고리의 다른 글
Optional (0) | 2023.03.07 |
---|---|
Stream 스트림 (0) | 2023.02.28 |
Method Reference, 메소드 레퍼런스 (0) | 2023.02.10 |
Lambda , 람다 표현식 (0) | 2023.02.08 |
함수형 인터페이스, Functional Interface (0) | 2023.02.02 |