Java의 enum과 싱글톤

LeeYulhee·2024년 5월 30일

👉 enum이란?


  • enum은 여러 값을 묶어서 그 중 하나만 선택할 수 있도록 만드는 특별한 종류의 클래스
  • 서로 관련이 있는 상수들의 집합을 정의할 수 있음
    • ⇒ 각 상수는 해당 enum 클래스의 인스턴스
  • 컴파일 시점에 타입 검사를 통해, 잘못된 값이 할당되지 않도록 방지할 수 있음
    • ⇒ 코드의 안정성을 높여 줌
  • 메서드와 필드를 추가할 수 있어, 상수와 관련된 동작이나 데이터를 캡슐화할 수 있음
  • enum 상수는 switch문에서 사용할 수 있음



👉 enum 객체의 특징


  • enum 타입의 객체는 enum 선언 시, 정의된 인스턴스로 제한
    • 미리 정의된 몇 가지 값들 중에서만 선택할 수 있다는 의미
    • ⇒ 외부에서 추가적인 객체를 생성할 수 없음(new 키워드 사용 불가)
  • enum 인스턴스는 Java에서 자동으로 직렬화가 가능
    • Java의 모든 enum 인스턴스는 Serializable 인터페이스를 구현
    • 이는 네트워크 전송이나 파일 저장 시 객체 상태를 유지할 수 있게 함
  • enum은 clone() 메소드를 통한 복제를 방지하여 객체의 유일성을 보장



👉 enum 예시


  • 일반적인 예시
    public enum DaysOfWeek {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }
  • 필드와 메서드가 있는 예시
    public enum Coin {
        PENNY(1), NICKEL(5), DIME(10), QUARTER(25); // 동전의 이름과 가치
        
        private final int value;
        
        Coin(int value) {
            this.value = value;
        }
        
        public int getValue() {
            return this.value;
        }
    }
  • 추상 메서드 선언과 구현
    public enum Operation {
        PLUS {
            public double apply(double x, double y) { return x + y; }
        },
        MINUS {
            public double apply(double x, double y) { return x - y; }
        };
        
        public abstract double apply(double x, double y);
    }
    
    • enum 안에 추상 메서드를 선언하면, 이 enum의 모든 상수는 해당 메서드를 구현해야 함



👉 enum을 활용한 싱글톤 패턴 구현


  • enum을 사용해서 싱글톤을 구현하는 이유
    • enum은 생성자가 private이기 때문에 외부에서 인스턴스를 생성할 수 없음
    • Java가 enum의 초기화 과정에서 스레드 안전성을 보장
    • 별도의 코드 (예를 들어, private 생성자나 인스턴스 관리 코드) 없이 간단하게 싱글톤 인스턴스를 선언하고 사용할 수 있음
    • enum은 기본적으로 직렬화가 가능하며, 직렬화와 관련된 일반적인 문제들을 자동으로 처리해 줌
    • 멀티스레딩 환경에서도 인스턴스의 유일성이 보장되고, 추가적인 동기화 처리 없이 안전하게 객체를 사용할 수 있dma
  • 예시
    public enum PostService {
        INSTANCE; // 자기 자신의 객체를 자동으로 생성
        
        public PostDTO writePost() {
    	    System.out.println("Write Post");
        }
    }
    PostService service = PostService .INSTANCE;
    PostDTO post = service.writePost();
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글