티스토리 뷰

소프트웨어 프로그램에는 프로그램의 시작과 끝을 책임지는 main 함수가 있다. 객체지향 프로그램에서도 프로그램은 하나의 클래스 객체(메인 클래스)에 의해 실행이 시작된다(이런 것을 driver 클래스라고도 한다). 또한 프로그램이 가져야 할 자료구조 전체를 관리하는 책임을 지는 클래스도 있다. 메인 클래스와 driver 클래스와 전체를 관장하는 클래스가 같을 때도 있고 다를 때도 있다. 그런데 흔히 이러한 클래스의 객체는 하나만 존재해야 한다. 여러 번 new 해서 객체가 만들어지면 안된다. 이런 클래스를 싱글톤 클래스라고 한다.

싱글톤 클래스는 객체가 하나만 존재해야 하는 클래스로 이것을 보장하는 방법으로 싱글톤 패턴이라는 것이 있다. 패턴이란 프로그래밍에서 흔히 발생하는 문제를 구현하는 표준적인 방법을 제시하는 것으로 언어마다 이런 패턴들을 모아서 정리한 사이트나 책들이 있다. 싱글톤 패턴은 자바에서 그런 패턴들 중에 대표적인 것이다. 

자바 싱글톤 패턴의 특징은 다음과 같다.

  • 클래스의 객체(인스턴스)가 하나만 존재하도록 보장하기 위해 생성 방식을 제약한다.
  • 싱글톤 패턴은 프로그램의 다른 부분에서 그 하나의 객체를 접근할 수 있게 해 주어야 한다.
  • 싱글톤 패턴은 관리 클래스 객체, 로깅, 캐싱 등에서 많이 쓰이고 표준 라이브러리 클래스에서도 많이 도입되었다.

이러한 싱글톤 패턴의 개념은 비교적 많은 사람들이 동의하고 있으나 구현에 있어서는 약간씩 차이가 있다. 그러나 다음 사항은 대부분의 구현에서 동일하게 적용된다.  (자바 싱글톤 패턴의 구현 요건)

  1. 다른 클래스에서 이 클래스의 객체를 만들 수 없도록 생성자를 private으로 만든다.
  2. 이 클래스의 유일한 객체를 가리킬 private static 필드가 있어야 한다.
  3. public static인 메소드가 있어서 이 유일한 객체를 프로그램 전체에서 접근할 수 있게 해 주어야 한다.

그럼 여기서 싱글톤 패턴의 간단한 예를 통해 작성법을 살펴보자. 우리가 만드는 프로그램에서는 메인 클래스가 다른 객체들의 ArrayList를 가지고 있고 이러한 클래스는 객체가 하나만 존재해야 한다. 새로운 객체를 만들면 ArrayList가 비어있는 객체가 만들어져서 거기에 추가하거나 거기서 검색하는 경우 오류가 발생할 것이다. 

흔히 이 클래스에서 키값이나 키워드로 객체를 찾거나 하는 메소드를 제공해야 한다. 그러나 우리는 그런 메소드를 static으로 만들고 싶지 않으므로 싱글톤 패턴을 사용하여 밖에서 언제든 그런 메소드를 접근할 수 있게 해주고 싶다. 메인 클래스가 싱글톤 패턴을 따르게 하기 위해서 우리는 위의 세 가지 구현 방식의 요구사항을 적용해야 한다. 다음 코드에서 각각 1, 2, 3번의 요건을 만족하는 부분을 찾을 수 있다.

public class Main { HashMap<Integer, Student> map = new HashMap<>(); HashMap<String, Integer> cntMap = new HashMap(); ArrayList<Team> teams = new ArrayList<>(); Student getStudent(int n) { return map.get(n); } public static Main getInstance() { // 3번 요건 if (main == null) main = new Main(); // 한번만 생성이 보장됨 return main; } private Main() { } // 1번 요건 private static Main main = null; // 2번 요건 public static void main(String[] args) { main = GetInstance(); main.doit(); }

이와 같이 Main 클래스가 싱글톤 패턴을 가지면 우리는 위의 main 필드 이외에 Main 클래스의 다른 인스턴스가 생기지 않을 것임을 확신할 수 있다. 이 때 getInstance() 메소드를 통해 이 객체를 프로그램 어디서든 접근할 수 있게 된다. 그러면 다른 클래스 객체에서 getStudent를 언제든 호출할 수 있게 된다. 

Student st = Main.getInstance().getStudent(id);
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함