BackEnd/Java

Java8. 기본 메소드 (Default Method)와 스태틱 메소드 (Static Method)

hanseom 2022. 1. 22. 04:10
반응형

기본 메소드 (Default Method)

  기본 메소드란 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법으로 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있습니다. 단, Object가 제공하는 기능 (equals, hashCode)는 기본 메소드로 제공할 수 없습니다.

 

  아래 Default 인터페이스와 Default 인터페이스를 구현한 DefaultClass가 있습니다.

public class Application {

  public static void main(String[] args) {
    Default defaultClass = new DefaultClass();
    defaultClass.printJava();
  }

}
public interface Default {
  void printJava();
}
public class DefaultClass implements Default{

  @Override
  public void printJava() {
    System.out.println("Hello, Java!");
  }

}

 

  Default 인터페이스에 새로운 메소드 정의 시 Default 인터페이스를 구현한 모든 클래스에 해당 메소드를 재정의 해주어야 합니다. 이러한 경우, Default 메서드를 사용할 수 있습니다.

public class Application {

  public static void main(String[] args) {
    Default defaultClass = new DefaultClass();
    defaultClass.printJava(); // [결과]: Hello, Java!
    defaultClass.printDefaultMethod(); // [결과]: Default Method!
  }

}
public interface Default {
  void printJava();

  // void printDefaultMethod() 추가 시 DefaultClass.java에서 해당 메소드를 재정의 해주어야 합니다.
  // 메소드 선언이 아니라 구현체입니다.
  default void printDefaultMethod() {
    System.out.println("Default Method!");
  };
}
public class DefaultClass implements Default{

  @Override
  public void printJava() {
    System.out.println("Hello, Java!");
  }

}

 

  인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있으며, 인터페이스 구현체가 재정의 할 수도 있습니다.

public class Application {

  public static void main(String[] args) {
    Default defaultClass = new DefaultClass();
    defaultClass.printJava(); // [결과]: Hello, Java!
    defaultClass.printDefaultMethod(); // [결과]: Overriding!
  }

}
public interface Default {
  void printJava();

  // void printDefaultMethod() 추가 시 DefaultClass.java에서 해당 메서드를 재정의 해주어야 합니다.
  // 메서드 선언이 아니라 구현체입니다.
  default void printDefaultMethod() {
    System.out.println("Default Method!");
  };
}
public class DefaultClass implements Default{

  @Override
  public void printJava() {
    System.out.println("Hello, Java!");
  }

  // Default 인터페이스에 있는 printDefaultMethod 메서드를 재정의합니다.
  @Override
  public void printDefaultMethod() {
    System.out.println("Overriding!");
  }

}

 

스태틱 메소드 (Static Method)

  유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있습니다.

public class Application {

  public static void main(String[] args) {
    Default defaultClass = new DefaultClass();
    defaultClass.printJava(); // [결과]: Hello, Java!
    defaultClass.printDefaultMethod(); // [결과]: Overriding!

    Default.printStaticMethod(); // [결과]: Static Method!
  }

}
public interface Default {
  void printJava();

  // void printDefaultMethod() 추가 시 DefaultClass.java에서 해당 메서드를 재정의 해주어야 합니다.
  // 메서드 선언이 아니라 구현체입니다.
  default void printDefaultMethod() {
    System.out.println("Default Method!");
  }

  // Static Method
  static void printStaticMethod() {
    System.out.println("Static Method!");
  }
}

 

Java8 API의 기본 메소드와 스태틱 메소드

  • Iterable의 기본 메소드: forEach() / spliterator()
  • Collection의 기본 메소드: stream() / parallelStream() / removeIf(Predicate) / spliterator()
  • Comparator의 기본 메소드 및 스태틱 메소드: reversed() / thenComparing() / static reverseOrder() / naturalOrder() / static nullsFirst() / nullsLast() / static comparing()

 

[참고]

https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html
https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

반응형