자바의 기본적인 문법을 익히고 나서 개발을 하다 보면 조금 더 높은 수준을 갈망하게 되는데, 그때쯤 뭘 더 배워야 할지 고민하다 보면 정말 많은 것들을 공부해야 된다는 것을 알고 절망에 빠지게 된다.
정말 행복한 고민이 아닌가? 올라갈 수 있는 길이 있다는 사실에 기뻐하며 오늘도 공부해보자.
그중에 하나는 바로 디자인 패턴이다.
내가 만나본 자바 고수들은 모두 디자인 패턴을 중요하게 생각했다.
그들은 이러쿵저러쿵 설명하기보다는 '이 패턴을 사용해 보세요...' 같은 전문가 같은 대화를 나눌 수 있는 사람을 선호했다. 물론 나의 수준은 팩토리 메서드 패턴이요? 들어는 봤는데...? 헤헿..ㅎ
1. 싱글톤 패턴(Singleton Pattern)이란?
싱글톤 패턴은 자바와 같은 객체 지향 프로그래밍 언어에서 사용되는 디자인 패턴 중 하나이다. 어떤 클래스에 대해 단 하나의 인스턴스만 생성되도록 보장한다. 싱글톤 패턴은 특정 클래스의 인스턴스가 전역적으로 접근 가능하면서도 오직 하나만 존재함을 보장한다.
2. 예시 코드
public class Singleton{
private static Singleton instance;
// 생성자를 private으로 선언하여 외부에서의 인스턴스 생성 방지
private Singleton(){}
// 인스턴스에 접근할 수 있는 public static 메소드
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
3. 코드 설명
1) private static Singleton instance;
클래스 내부에 유일한 private 인스턴스를 생성한다. 접근제한자가 private이기 때문에 외부에서 바로 접근 불가하다.
2) private Singleton(){}
생성자이다. 마찬가지로 접근제한자가 private이기 때문에 외부에서 인스턴스를 생성할 수 없다.
생성을 시도하면 java: Singleton() has private access in Singleton이라는 에러를 만나게 된다.
3) public static Singleton getInstance(){}
getInstance() 메서드는 public static으로 선언되었기 때문에 외부에서도 객체 생성 없이 자유롭게 호출이 가능하다.
getInstance()를 호출하면 if문을 통해 instance가 null인지 체크하고 null이라면 새로 인스턴스를 생성해 반환하고, null이 아니라면 기존의 instance를 반환하게 된다.
4. 싱글톤 패턴은 왜 사용하는가?
1) 메모리 효율 증가
2) 공유 자원 접근의 일관성
인스턴스가 1개만 있어도 잘 작동하는 상황에서는 굳이 여러 개의 인스턴스를 만들 필요가 없다. 하지만 인스턴스를 생성할 때마다 기존의 인스턴스를 조회하는 등의 행동은 매우 번거롭다. 싱글톤 패턴을 사용하면 인스턴스를 한 개만 유지할 수 있도록 해주기 때문에 유용하다.
인스턴스가 많아지면 발생할 수 있는 문제로는 예상치 못한 오류 발생, 불필요한 자원소모, 일관성 감소등이 있다.
그러니까 관리해야 할 요소가 많아질수록 에너지가 많이 소모되기 때문에 개체수를 조절해 주는 것이다.
하지만 그것을 수동적으로 조절하면 또 에너지가 소모되기에 자동적으로 그 일을 해줄 패턴을 사용하는 것이다.
5. 싱글톤의 사용처
그렇다면 싱글톤 패턴은 좋은 거니까 모든 클래스를 싱글톤 패턴으로 구현하면 좋은 걸까?
절대 안 된다.
오남용은 언제나 나쁘다.
그것은 객체 지향 프로그래밍의 장점을 모두 내다 버리는 행동이기 때문이다.
하나의 클래스로 하나의 인스턴스 밖에 만들지 못한다면 객체 지향 프로그래밍의 장점인 재사용성, 확장성, 다형성, 상속성등을 모두 누릴 수 없게 된다.
필요할 때만 사용하도록 하자.
그럼 그때가 언제인가?
책에서는 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체, 디바이스 드라이버가 그 예라고 한다.
하지만 보통 자바로 개발을 하면 스프링 같은 프레임워크를 사용하게 될텐데 스프링이 알아서 해준다.
그래서 배울 필요가 없다는 게 아니라, 스프링의 원리를 더 잘 이해하고 더 잘 사용하기 위해서는 이것도 알아두면 도움이 된다는 것이다.
참고
- 헤드퍼스트 디자인 패턴 - 에릭 프리먼, 엘리자베스롭슨, 케이시 시에라, 버트 베이츠 지음 ; 서환수 옮김 ; 한빛 미디어
- chat gpt
'JAVA' 카테고리의 다른 글
[Java] JVM(Java Virtual Machine)은 무엇이며 왜 좋은가? (0) | 2025.02.15 |
---|---|
[Java] diamond operator is not supported 에러 (0) | 2025.02.14 |
[Java] Math.random()의 취약성과 시큐어 코딩 (0) | 2024.11.19 |
[Java] replaceAll() - 자바 특정 문자 변경 함수 (4) | 2024.07.23 |
[JAVA] VO(DTO) LIST를 특정 필드값으로 정렬하기 + 형변환 (0) | 2023.08.10 |