IT/기타

Java9 - Private Interface Methods

K.Nero 2019. 3. 12. 23:54

Java8 이전 까지의 인터페이스는 variable/methods 에 대해서 다음 두 가지의 형태를 갖고 있었습니다.

- Constant variables (상수)
- Abstract methods (추상메소드)

그래서 우리는 인터페이스 안에서 메소드를 구현할 수 없고 더 정밀한 기본 구현을 할 수  없었습니다. 하지만 Java8 부터 인터페이스는 다음과 같은 형태를 갖을 수 있게 되었습니다.

- Constant variables
- Abstract methods
- Default methods (기본 메소드)
- Static methods (정적 메소드)

이제 기본 구현과 정적 메소드를 통해서 인터페이스 자체를 사용할 수 있게 되었습니다. (난 반댈세...)

Java9 부터는 (이제 그만~!!) 다음 타입들이 늘어났습니다.

- Constant variables
- Abstract methods
- Default methods
- Static methods
- Private methods (큰일...)
- Private Static methdos (더 이상 막을 수 없다..)

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");
      
      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}
final class LogOracle implements Logging { 
}
final class LogMySql implements Logging { 
}
interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   private void log(String message, String prefix) {
      getConnection();
      System.out.println("Log Message : " + prefix);
      closeConnection();
   }
   default void logInfo(String message) {
      log(message, "INFO");
   }
   default void logWarn(String message) {
      log(message, "WARN");
   }
   default void logError(String message) {
      log(message, "ERROR");
   }
   default void logFatal(String message) {
      log(message, "FATAL");
   }
   private static void getConnection() {
      System.out.println("Open Database connection");
   }
   private static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

난 이쯤에서 객체지향에서의 인터페이스 역할이 무엇이었나를 깊게 고민해봐야 했다.. 객체지향의 인터페이스는 사용방법을 노출하는 수단이라고 생각했다. 사용하는 쪽에서 내부 구현을 신경쓰지 않고 사용방법만 숙지하고 사용할 수 있는. (getConnection 이라는 메소드를 갖고 있는 예제마저도 무섭다...)

자동차의 핸들을 돌리면 바퀴까지 힘이 어떻게 전달이 되는지 몰라도 핸들을 돌리면 바퀴가 돌아간다는 사실만 알고 사용하면 되는 것 처럼... 인터페이스에 구현코드가 들어가는 것은 편의성 때문일까 내가 인터페이스를 잘 못 알고 있던 것일까...