Java 9 프라이빗 인터페이스 메서드: 캡슐화 및 코드 재사용 강화
Java 8 이전에는 인터페이스에 다음 유형의 변수/메서드만 가질 수 있었습니다.
따라서 인터페이스에 메서드 구현, 즉 기본 구현을 가질 수 없었습니다. 예제를 보겠습니다.
Java 7 스타일 (인터페이스에 구현 없음)
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 {
@Override public void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); }
@Override public void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); }
@Override public void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); }
@Override public void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); }
@Override public void getConnection() { System.out.println("Open Database connection"); }
@Override public void closeConnection() { System.out.println("Close Database connection"); }
}
final class LogMySql implements Logging {
@Override public void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); }
@Override public void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); }
@Override public void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); }
@Override public void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); }
@Override public void getConnection() { System.out.println("Open Database connection"); }
@Override public void closeConnection() { System.out.println("Close Database connection"); }
}
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
void logInfo(String message);
void logWarn(String message);
void logError(String message);
void logFatal(String message);
void getConnection();
void closeConnection();
}
출력
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
위 예제에서 각 로그 메서드가 자체 구현을 가집니다. Java 8부터 인터페이스는 다음 유형을 가질 수 있습니다.
- 상수 변수
- 추상 메서드
- 기본 메서드(default methods)
- 정적 메서드
Java 8: 인터페이스에 기본 구현과 정적 메서드 사용
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";
default void logInfo(String message) { getConnection(); System.out.println("Log Message : " + "INFO"); closeConnection(); }
default void logWarn(String message) { getConnection(); System.out.println("Log Message : " + "WARN"); closeConnection(); }
default void logError(String message) { getConnection(); System.out.println("Log Message : " + "ERROR"); closeConnection(); }
default void logFatal(String message) { getConnection(); System.out.println("Log Message : " + "FATAL"); closeConnection(); }
static void getConnection() { System.out.println("Open Database connection"); }
static void closeConnection() { System.out.println("Close Database connection"); }
}
출력
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
위 예제에서도 중복이 있습니다. Java 9부터 인터페이스는 다음 유형을 가질 수 있습니다.
- 상수 변수
- 추상 메서드
- 기본 메서드
- 정적 메서드
- 프라이빗 메서드
- 프라이빗 정적 메서드
Java 9: 프라이빗 메서드 사용으로 중복 제거
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"); }
}
출력
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection