Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
싱글톤은 디자인 패턴 중에 하나로 단 하나의 객체만을 사용하도록 강제하는 기법이다.
자바에서 이는 static 키워드로 간단히 구현 가능하다.
static 변수와 static 메서드
일단 자바에서 static은 클래스의 변수, 메서드에 자주 사용이 된다.
static 변수의 경우 해당 클래스의 객체에서는 메모리 할당이 단 한번만 진행되기 때문에, 모든 객체가 같은 값이 이용된다.
위의 코드에서 Memory class 의 static 변수 memory는 객체 mem1과 mem2에서 공유된다.
따라서 mem1에서 save를 한 값을 mem2에서도 찾아올 수 있다.
static 메서드는 객체의 생성이 없이도 클래스를 통해 직접 호출이 가능하다.
위의 코드에서는 getMemorySize()가 static 메서드로 선언되어 Memory.getMemorySize()로도 호출이 가능해진다.
그렇다면 이제 이 두가지를 이용해서 객체를 싱글톤으로 만들어보자.
싱글톤 패턴 만들기
일단 생성자는 private로 선언해준다.
이러면 외부에서는 객체를 생성할 수 없으므로 내부에서만 객체를 생성할 수 있다.
따라서 객체가 필요하다면 내부에서 생성하여 메서드를 통해 전달해준다.
이때 싱글톤은 모두 같은 객체 단 하나만을 사용하므로 인스턴스 반환자인 getInstance()는
내부의 static 객체 변수, static Memory object를 검사하여 null인 경우에만 새로운 객체를 생성해 object에 저장해준다.
이외의 경우는 이미 생성해둔 objcet객체를 반환하여 모두 같은 객체만 사용하도록 강제할 수 있다.
사실 아래와 같이 선언을 해주면 JVM에 로딩 시에 바로 인스턴스를 생성해 주어 생성이 되었는지 체크할 필요가 없다.
private static Memory objcet = new Memory();
하지만 위와같이 생성 여부를 체크한 이유는 이 인스턴스가 정말 필요할때 생성하는 lazy 방식을 적용했기 때문이다.
위와 같은 패턴은 필요 시에만 인스턴스가 생성되기 때문에 오버헤드가 적다.
이러한 싱글톤 패턴은 항상 새로운 객체를 생성하지 않기 때문에 메모리 낭비를 줄이고, 데이터 공유가 쉬워진다.
단, 여러 쓰레드나 프로세서가 이 객체에 접근할때 동시성 문제를 해결하지 않으면 변경전에 값을 읽어가는 문제들이 발생하기 쉽다.
따라서 특별한 경우가 아니라면 사용을 지양하는 패턴이다.