인터페이스는 메소드의 시그니처만 정의한다
자바 8 부터는 default method를 지원한다. 활용할 경우
인터페이스에서 메소드 시그니처만 정하는 것이 아닌 기본적인 구현을 할 수 있따.
interface MyInterface {
void myMethod();
default void myDefaultMethod() {
System.out.println("This is a default method.");
}
}
상수
유일성
메소드
타입 안정성
@Getter
public enum Week {
MONDAY(1, "Monday", "Mon"),
TUESDAY(2, "Tuesday", "Tue"),
WEDNESDAY(3, "Wednesday", "Wed"),
THURSDAY(4, "Thursday", "Thu"),
FRIDAY(5, "Friday", "Fri"),
SATURDAY(6, "Saturday", "Sat"),
SUNDAY(7, "Sunday", "Sun");
private final int dayNumber;
private final String fullName;
private final String shortName;
private Week(int dayNumber, String fullName, String shortName) {
this.dayNumber = dayNumber;
this.fullName = fullName;
this.shortName = shortName;
}
}
// 실행 환경
public class WeekRun {
public static void main(String[] args) {
Week sunday = Week.SUNDAY;
System.out.println(sunday.getDayNumber());
System.out.println(sunday.getFullName());
System.out.println(sunday.toString());
}
}
//결과
7
Sunday
Week{dayNumber=7, fullName='Sunday', shortName='Sun'}
public boolean isWeekend() {
return this == SATURDAY || this == SUNDAY;
}
만약 이런 코드를 사용하면 이 값이 주말인지 아닌지 확인할 수 있다.
이런식으로 코드의 유연성과 가독성을 향상 할 수 있다
외에도 대표적으로 활용할만한 곳이 많다.
입력 값에 대한 검증을 수행할 수 있다.
public class DayOfWeekValidator {
public static boolean isValidDayOfWeek(String input) {
try {
DayOfWeek.valueOf(input.toUpperCase());
return true;
} catch (IllegalArgumentException e) {
return false;
}
}}
public class Main {
public static void main(String[] args) {
String input = "Monday";
boolean isValid = DayOfWeekValidator.isValidDayOfWeek(input);
if (isValid) {
System.out.println("Valid day of week!");
} else {
System.out.println("Invalid day of week!");
}}}
입력된 값이 enum으로 바로 들어가 검증된다.
public class MessageMapExample {
public static void main(String[] args) {
Map<DayOfWeek, String> messageMap = new HashMap<>();
messageMap.put(DayOfWeek.MONDAY, "Happy Monday!");
messageMap.put(DayOfWeek.FRIDAY, "Thank God It's Friday!");
messageMap.put(DayOfWeek.SUNDAY, "Lazy Sunday!");
System.out.println( messageMap.get(DayOfWeek.MONDAY) );
}
}
싱글톤은 프로그램 내에서 객체가 유일 하도록 보장하는 디자인 패턴이다.
멀티스레드 환경에서는 인스턴스가 동시에 여러개 생성되서 문제가 발생할 수 있지만
enum 객체들은 컴파일이 정의되어 있어 메모리에 로드될때 인스턴스가 생겨 문제가 발생하니 않는다.
또한 enum은 일관성에 대한 문제는 없지만 싱글톤 패턴에서 다중 스레드환경에서 여러개의 인스턴스가 생기는 걸 막기 위해 동기화 처리가 필요하다 하지만 enum은 jvm이 인스턴스 생성을 보장하기 때문에 이러한 문제가 발생하지 않는다.
직렬화는 객체가 이진 데이터로 변환하는 과정을 의미한다.
객체를 파일, 네트워크 전송 등에서 사용하기 쉽도록 변환할 수 있다.
반대의 경우에는 역직렬화로 복원된다 ( 하지만 성능을 노려해야한다 )
public enum SingletonExample {
INSTANCE;
private SingletonExample() {
// 초기화 코드
}
public void doSomething() {
// 기능 구현
}
}
public class Main {
public static void main(String[] args) {
SingletonExample instance1 = SingletonExample.INSTANCE;
SingletonExample instance2 = SingletonExample.INSTANCE;
if (instance1 == instance2) {
System.out.println("Same instance!");
} else {
System.out.println("Different instances!");
}
instance1.doSomething();
}
}
이게 어떻게 되느냐
상수 풀 (Constant pool)
상수풀은 JVM에서 관리하는 특별한 메모리 영역으로 상수값들만 저장하는 공간이다.
String의 리터럴, final 변수 , enum 상수의 상수 값들이 저장되는 영역이다.
상수풀의 값들은 GC의 대상이 아니다
그 말은 메모리에서 해제되지 않는다.
다만 너무 많은 양의 상수값이 저장되면 메모리 사용량이 늘어나는 문제가 발생한다.