Java

[Java] Java 8의 특징(2) - 기본 메서드와 스태틱 메서드

재담 2022. 2. 22. 23:51

인터페이스의 기본 메서드와 스태틱 메서드

자바 8부터 인터페이스에 메서드 선언이 아니라 다음과 같이 구현체를 정의할 수 있게 되었다.

public interface Animal {
    void move();
    
    default void sleep() {
        System.out.println("Sleep...");
    }
}

default 키워드를 이용해 기본 메서드를 정의할 수 있다. 재정의를 강제했던 추상 메서드와는 달리 기본 메서드는 구현 클래스에서 재정의를 할 필요가 없다. 물론 필요에 따라 재정의도 가능하다.

 

기본 메서드의 장점은 구현 클래스를 건드리지 않고 새로운 기능을 추가할 수 있다는 점이다. 해당 인터페이스를 구현한 모든 클래스에 공통된 기능이 생겨야 한다면 인터페이스에 기본 메서드를 정의하면 된다. 

 

기본 메서드를 사용할 때에 주의할 점도 있다. 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다. 또한 다른 인터페이스에서 같은 기본 메서드를 정의하고 구현 클래스에서 두 인터페이스를 모두 상속받는다면 컴파일 에러가 발생한다. 이럴 때는 해당 클래스에서 기본 메서드를 재정의 해야 한다.

 

또 다른 특징으로는 Object가 제공하는 기능(equals, hashCode 등)은 기본 메서드로 정의할 수 없고 구현체가 재정의해야 한다.

 

스태틱 메서드는 해당 타입 관련 유틸리티 메서드를 제공할 때 인터페이스에 스태틱 메서드를 정의할 수 있다.

 

기본 메서드가 생기면서 추상 클래스와의 차이가 모호해졌는데, 인터페이스는 다중 상속이 가능하고 추상 클래스는 상속을 받으면 다른 클래스를 상속받지 못하게 된다는 게 큰 차이점이다.

 

 

자바 8에서 추가된 기본 메서드와 스태틱 메서드

자바 8에서 추가된 기본 메서드와 스태틱 메서드는 다음과 같은 것들이 있다.

 

Iterable의 기본 메서드

  • forEach()
  • spliterator()

 

Collection의 기본 메서드

  • stream() / parallelStream()
  • removeIf(Predicate<? super E> filter)
  • spliterator()

 

Comparator의 기본 메서드 및 스태틱 메서드

  • reversed()
  • thenComparing
  • static reverseOrder() / naturalOrder()
  • static nullsFirst() / nullsLast()
  • static comparing()

 

이밖에도 기본 메서드들이 많이 있지만 일일이 외우기보다는 쓰면서 익숙해지는 것이 좋다고 생각한다.


Reference

'Java' 카테고리의 다른 글

[Java] Java 8의 특징(4) - Optional  (0) 2022.02.25
[Java] Java 8의 특징(3) - Stream  (0) 2022.02.23
[Java] Java 8의 특징(1) - 함수형 인터페이스와 람다  (0) 2022.02.21
[Java] 클래스 로더  (0) 2022.02.15
[Java] JVM 구조  (0) 2022.02.15