자바 프로그램이 동작할 때 최초 한번만 메모리를 할당하고 할당된 메모리에서만 사용하는 방식을 말한다.
즉, 고정된 메모리영역을 사용하여 메모리 낭비를 줄이고 공통된 객체를 사용할 때 매번 객체를 새로 생성하지 않는 방식을 말한다.
자바에서 객체를 새로 생성할때 new 연산자를 통하여 매번 메모리에 새로 할당을 하는데, 싱글톤 패턴은 기본 생성자 자체를
private으로 생성하여 new 연산자를 통해 생성하지 못하도록 제약을 둔다.
그럼 생성자를 통해 객체를 생성을 못하는데 어떻게 객체를 생성하고 가져올까?
이때 자바의 setter, getter의 느낌인 getIntance() 메소드를 통하여 객체를 반환시킨다.
예제를 보겠다.
SingleTon.java
public class SingleTon {
//전역 객체변수로 사용하기 위해 static 객체변수로 생성
static SingleTon instance;
//생성자를 priavte로 만들어 접근을 막는다
private SingleTon(){}
//getInstance 메소드를 통해 한번만 생성된 객체를 가져온다.
public static SingleTon getInstance(){
if(instance == null){ //최초 한번만 new 연산자를 통하여 메모리에 할당한다.
instance = new SingleTon();
}
return instance;
}
}
SingleTonMain.java
public class SingleTonMain {
public static void main(String[] args) {
SingleTon st = SingleTon.getInstance();
System.out.println(st);
}
}
예제와 같이 SingleTon class에서 생성자를 private로 생성하여 new 연산자로 생성을 방지하고, 객체 변수인 instance를 통하여
최초 null인 경우에만 new SingleTon(); 으로 메모리에 한번 할당시킨다.
main문을 확인해보면 일반적으로 객체를 사용하던 SingleTon st = new SingleTon(); new 연산자 방식이 아닌
getInstance() 메소드를 통해 할당하고 있는것을 볼 수 있다.
이렇게 적어놓은 개념이 이해가 안될 수 있을 것 같다.
그럼 일반적인 new 연산자를 통한 객체 선언과 getInstance() 메소드를 통한 싱글톤 패턴의 차이를 보겠다.
NormalClass.java
public class NormalClass {
public NormalClass(){
}
}
SingleTonMain.java
public class SingleTonMain {
public static void main(String[] args) {
//싱글톤 getInstance() 메소드를 통한 객체 사용
SingleTon st1 = SingleTon.getInstance();
SingleTon st2 = SingleTon.getInstance();
SingleTon st3 = SingleTon.getInstance();
System.out.println(st1);
System.out.println(st2);
System.out.println(st3);
//일반적인 new 연산자를 통한 객체 사용
NormalClass nc1 = new NormalClass();
NormalClass nc2 = new NormalClass();
NormalClass nc3 = new NormalClass();
System.out.println(nc1);
System.out.println(nc2);
System.out.println(nc3);
}
}
기존에 생성해놓은 SingleTon 객체를 3번 선언한것과 새로 만든 NormalClass 객체를 3번 생성한것을 비교한 소스이다.
sysout을 통해 주소값을 확인해보면 확연한 차이를 알 수 있다.
싱글톤 방식은 3번이나 생성한 것 같아보이지만 getInstance() 메소드에 의해 한번만 할당된 객체의 주소값을 참조하는걸 알 수 있다.
반면 new연산자는 객체를 생성할때 마다 메모리에 새로 만들기 때문에 3개 모두 다른 메모리값으로 처리된 걸 볼 수 있다.
'JAVA' 카테고리의 다른 글
JAVA - CSV 파일 읽기(한글 읽기, 한글 깨짐 방지, CSV 인코딩 UTF-8 저장) (0) | 2019.12.11 |
---|---|
Java - 오늘, 어제, 이번달, 올해, 지난해 등 날짜 구하기 (0) | 2019.11.29 |
JAVA - request.getParameter 모든 값 확인하기(key, value 확인) (0) | 2019.11.29 |
JAVA - ajax JSON 데이터 통신하기 (0) | 2019.11.21 |
JSTL - replace 문자열 치환하기 (0) | 2019.11.05 |