본문 바로가기

언어/JAVA

객체 생성, 하나 생성 (enum) / 두개생성 (class) 차이

 
//TodoService 객체가 하나가 생성됨
public enum TodoService {
 
INSTANCE;
 
}
이렇게하면 객체 하나만 생성이라고 하는데 맞아? 맞으면 객체 여러개 생성은 어떻게 해야해 ?
 

INSTANCE 하나만 존재하기 때문에 객체가 하나만 생성돼.
이런 방식은 싱글톤 패턴을 구현하는 방법 중 하나야.

 

 

 


✅ enum을 이용한 싱글톤 패턴

public enum TodoService { INSTANCE; // 유일한 객체 // 서비스 메서드 추가 가능 public void doSomething() { System.out.println("Doing something..."); } }

💡 특징:

  1. INSTANCE라는 유일한 객체가 자동으로 생성됨.
  2. private 생성자가 자동 적용돼서 외부에서 객체를 새로 만들 수 없음.
  3. 자바에서 권장하는 싱글톤 방식(Reflection, 직렬화/역직렬화 문제 해결).

📌 사용법

TodoService service1 = TodoService.INSTANCE;
TodoService service2 = TodoService.INSTANCE;
 
System.out.println(service1 == service2); // true (같은 객체)

❌ 객체 여러 개 생성하는 방법

싱글톤이 아니라 새로운 객체를 여러 개 만들고 싶다면 enum을 사용하면 안 돼.
대신 클래스로 만들고, new 키워드를 허용하면 돼.

✅ 일반 클래스로 여러 객체 생성하기

 
public class TodoService {
public TodoService() {
// 생성자 공개
} public void doSomething() { System.out.println("Doing something...");
   }
}

📌 사용법

TodoService service1 = new TodoService();
TodoService service2 = new TodoService();
 
System.out.println(service1 == service2); // false (다른 객체)
 
  • enum → 싱글톤 (객체 1개만 생성)
  • class → 새로운 객체 여러 개 생성 가능

 

🎯 언제 어떤 걸 써야 할까?

구분enum 싱글톤일반 클래스
객체 개수 1개 (싱글톤) 여러 개 가능
안전성 Reflection, 직렬화 문제 없음 추가적인 싱글톤 처리 필요
Thread-safe 기본적으로 안전 추가 작업 필요 (synchronized 등)
상속 가능 여부 ❌ 불가능 ✅ 가능
사용 사례 - 설정 관리 (ConfigManager)
- 로깅 (Logger)
- 데이터베이스 연결 풀 (DBConnectionPool)
- DAO (Data Access Object)
- 사용자별 서비스 객체
- HTTP 요청마다 새로운 서비스 객체

✅ 결론

  • 객체를 하나만 유지하고 싶다면? → enum 싱글톤 (INSTANCE) 사용
  • 여러 개의 객체가 필요하거나 상속이 필요하다면? → 일반 클래스 사용