https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4#
용어 정리
객체 : 속성과 기능을 갖춘 것
클래스 : 속성과 기능을 정의한 것
인스턴스 : 속성과 기능을 가진 것 중 실체 하는 것(메모리 상에 올라간 것)
싱글톤 패턴이란?
객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
예를 들면, 데이터베이스 접속을 위한 객체를 생성해야 하는데 쿼리를 작성할 때마다 객체를 계속 생성하면
메모리 낭비가 발생하므로 하나의 객체를 생성 후 그 객체를 계속 이용하면 메모리를 효율적으로 이용할 수 있다.
싱글톤 패턴의 문제점
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)
따라서 수정이 어려워지고 테스트하기 어려워진다.
또한 멀티스레드 환경에서 동기화 처리를 안 하면 인스턴스가 두 개가 생성된다든지 하는 경우가 발생할 수 있음
학습목표
싱글톤 패턴을 통해서 하나의 인스턴스만 생성하도록 구현
요구사항
개발 중인 시스템에서 스피커에 접근할 수 있는 클래스를 만들어 주세요.
SystemSpeaker.java
public class SystemSpeaker {
static private SystemSpeaker instance;
private int volume; // 볼륨값
private SystemSpeaker() {
volume = 5; // 기본값 5로 설정
}
public static SystemSpeaker getInstance() {
if(instance == null) {
// 시스템 스피커
instance = new SystemSpeaker();
System.out.println("새로 생성");
} else {
System.out.println("이미 생성");
}
return instance;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
}
Main.java
public class Main {
public static void main(String[] args) {
SystemSpeaker speaker1 = SystemSpeaker.getInstance(); // 새로 생성 이라고 나옴
SystemSpeaker speaker2 = SystemSpeaker.getInstance(); // 이미 생성이라고 나옴
// 5, 5
System.out.println(speaker1.getVolume());
System.out.println(speaker2.getVolume());
//11, 11
speaker1.setVolume(11);
System.out.println(speaker1.getVolume());
System.out.println(speaker2.getVolume());
// 22, 22
speaker2.setVolume(22);
System.out.println(speaker1.getVolume());
System.out.println(speaker2.getVolume());
}
}
참고
https://gmlwjd9405.github.io/2018/07/06/singleton-pattern.html
https://jeong-pro.tistory.com/86
소스코드
https://github.com/garam-park/java-designpattern
'Java > design pattern' 카테고리의 다른 글
[java] 7강 빌더 패턴(Builder Pattern) (0) | 2020.02.03 |
---|---|
[java] 6강 프로토 타입 패턴(Prototype Pattern) (2) | 2020.01.22 |
[java] 4강 팩토리 메소드 패턴(Factory Pattern) (0) | 2020.01.22 |
[java] 3강 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.01.13 |
[java] 2강 어댑터 패턴(adapter pattern) (0) | 2020.01.13 |