자바 - 싱글톤

YAMAMAMO·2022년 1월 4일
0

디자인패턴

목록 보기
1/1

싱글톤 패턴은 특정 클래스에 대한 인스턴스를 단 한 번만 static 메모리 영역에 할당하고 해당 클래스에 대한 생성자를 여러 번 호출하더라도 최초에 생성된 객체를 반환하는 디자인 패턴입니다. 즉 어플의 특정 클래스에 대한 유일 객체를 보장하는 디자인 형태라고 볼 수 있습니다.

일반적으로 싱글톤 패턴이 적용된 클래스에 대한 new 연산을 수행하더라도 이미 한 번 할당된 메모리 영역의 인스턴스를 사용하기 때문에 무분별한 new 연산으로 인한 메모리 낭비를 방지할 수 있습니다.

장단점

장점

-한 번의 객체 생성으로 여러 클래스가 공유할 수 있기 때문에 메모리 낭비를 방지할 수 있으며, 다른 객체와 공유할 수 있다는 장점이 있습니다. 또한 두번째 호출부터는 객체 로딩 시간이 줄어들어 성능이 향상됩니다.

단점

-싱글톤을 남용하면 쓸데없이 자원을 차지하고, GC가 자원을 회수하지 못해 메모리 자원이 줄어든다. 또한 싱글톤 클래스에 과도한 데이터를 집어넣고 여러 클래스들이 공유하게 될 경우 결합도는 높아지게 되고, 객체지향의 원칙인 ‘개방,폐쇄의 원칙’을 위배하게 됩니다. 결합도가 높아진 싱글톤은 유닛 테스트에도 좋지 않습니다.

언제 사용하나?

여러 객체를 관리하는 역할의 객체를 하나의 인스턴스로 생성 후 사용하는 것이 좋습니다. ex) Connection Pool, Logging, Thread Pool 등....

예제

간단한 예제입니다. 싱글톤 클래스를 만들고 객체가 같은지 비교하는 예제입니다.

public class Singleton {
	private String name;
	
	private static Singleton instance;
	public static Singleton getInstance() {
		if(instance==null) {
			instance = new Singleton();
		}
		return instance;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name=name;
	}

}
public class Main {

	public static void main(String[] args) {
		Singleton singleton1 = Singleton.getInstance();
		Singleton singleton2 = Singleton.getInstance();
		
		//주소
		System.out.println(singleton1);
		System.out.println(singleton2);
		
		if(singleton1==singleton2) System.out.println("같은 객체입니다.");
		else System.out.println("다른객체입니다.");
		
		//singleton1에서 setName으로 name을 변경하고
		//singleton2 getName으로 name을 불러왔을 때 
		//싱글톤으로 출력된 것을 확인할 수 있습니다.
		singleton1.setName("싱글톤");
		System.out.println(singleton2.getName());
	}

}

결과

싱글톤.Singleton@52cc8049
싱글톤.Singleton@52cc8049
같은 객체입니다.
싱글톤

참고

https://ikkison.tistory.com/29

https://lktprogrammer.tistory.com/187

https://lanicc.medium.com/싱글톤-패턴이란-4bdf9f1cf765

profile
안드로이드 개발자

0개의 댓글