본문 바로가기

안드로이드

싱글톤, 옵저버 패턴 개념 정리

디자인 패턴, 저자 Gang of Four(Gof)

  • Erich Gamma
  • Richard Helm
  • Ralph Johnson
  • John Vlissides

디자인 패턴이란?

객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인 패턴으로 정립한 것이다. 여기서 디자인 패턴이란 여러 가지 문제에 대한 설계 사례를 분석하여 서로 비슷한 문제를 해결하기 위한 설계들을 분류하고, 각 문제 유형별로 가장 적합한 설계를 일반화해 패턴으로 정립한 것을 의미한다.

 

싱글톤 패턴

인스턴스를 오직 한개만 제공하는 클래스

singleton 패턴은 객체의 생성과 관련된 패턴으로서 특정 클래스의 객체가 오직 한 개만 존재하도록 보장한다. 즉 클래스의 객체를 하나로 제한한다.

고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 막을 수 있고 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.

 

<코드 구현>

public class App {

	public static void main(String[] args) {
		Settings settings = Settings.getInstance();
		Settings settings1 = Settings.getInstance();
		
		System.out.println(settings == settings1);
	}
}
public class Settings {

	private static Settings instance;
	
	private Settings() {}
	
	public static Settings getInstance() {
		if(instance == null) {
			instance = new Settings();
		}
		
		return instance;
	}
}

위의 코드는 쓰레드 세이프 하지 않음

A,B 스레드가 있다고 했을 때 getInstance 함수를 A스레드가 if문을 지나고 B스레드도 인스턴스가 생성되기 전에 if문을 통과할 경우 A스레드와 B스레드에서 각각 다른 인스턴스가 생성된다.

 

※ 쓰레드 세이프란?
멀티 쓰레드 프로그래밍에서, 어떤 공유 자원에 여러 쓰레드가 동시에 접근해도, 프로그램 실행에 문제가 없는 상태

 

대처방법

1. synchronized 키워드를 사용하여 한번에 하나의 쓰레드만 접근하게 한다.

public class Settings {

	private static synchronized Settings instance;
	
	private Settings() {}
	
	public static Settings getInstance() {
		if(instance == null) {
			instance = new Settings();
		}
		
		return instance;
	}
}

2. 미리 선언 하기

public class Settings {

	private static final Settings INSTANCE=new Settings();
	
	private Settings() {}
	
	public static Settings getInstance() {
	
		return INSTANCE;
	}
}

 

 

옵저버 패턴

다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴

어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해주는 것이 observer 패턴이다. 그림을 보면 이 패턴은 외부 객체의 상태 변화에 따라(subject 클래스) observer 객체(observer 인터페이스 클래스)는 이에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하고 상속된 객체들은 그에 맞게 기능을 수행하는 형태로 구성된다.

이 패턴에 해당되는 예는 관심 있는 어떤 블로그를 미리 등록해놓으면 그 블로그에 새 글이 올라올 때마다 자동으로 알려주는 것과 같다. 즉 observer 패턴은 어떤 일이 생기면 미리 등록한 객체들에게 상태 변화를 알려주는 역할을 한다.

 

 

 

 

<코드 구현>

public class ChatServer {

	private Map<String, List<Subscriber>> subscribers =new HashMap<>();
	
	public void register(String subject, Subscriber subscriber) {
		if(this.subscribers.containsKey(subject)) {
			this.subscribers.get(subject).add(subscriber);
		}else {
			List<Subscriber> list=new ArrayList<>();
			list.add(subscriber);
			this.subscribers.put(subject,list);
		}
	}
	
	public void unregister(String subject, Subscriber subscriber) {
		if(this.subscribers.containsKey(subject)) {
			this.subscribers.get(subject).remove(subscriber);
		}
	}
	
	public void sendMessage(User user, String subject, String message) {
		if(this.subscribers.containsKey(subject)) {
			String userMessage = user.getName()+": "+message;
			this.subscribers.get(subject).forEach(s-> s.handleMessage(userMessage));
		}
	}
}

 

public interface Subscriber {

	void handleMessage(String message);
}

 

public class User implements Subscriber {

	private String name;
	
	public User(String name) {
		this.name=name;
	}
	
	public String getName() {
		return name;
	}
	
	@Override
	public void handleMessage(String message) {
		 System.out.println(message);
	}
}

 

public class Client {
	public static void main(String[] args) {
		ChatServer chatServer =new ChatServer();
		User user1=new User("1");
		User user2=new User("2");
		
		chatServer.register("오징어", user1);
		
		chatServer.sendMessage(user1, "오징어",  "메시지");
		
	}
}

 

<자바에서 제공하는 클래스로 옵저버 패턴 구현>

 

The type Observer is deprecated since version 9

???.....

 

참조

 

java9 Observer API deprecated 되는 이유-질문글

https://okky.kr/articles/705425

 

인프런 - 코딩으로 학습하는 GoF의 디자인(백기선)

 

[네이버 지식백과] Gof 디자인 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 김치수)

 

[네이버 지식백과] observer 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 김치수)

 

싱글톤 패턴 - 블로그

https://devmoony.tistory.com/43

 

싱글톤 패턴이란?

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/

'안드로이드' 카테고리의 다른 글

안드로이드 webview bridge 실습  (0) 2022.12.20
안드로이드 학습 계획  (0) 2022.11.21
안드로이드 WebView 구현 및 디버깅  (0) 2022.11.13
모바일 앱 종류  (0) 2022.11.04
안드로이드 개념 정리  (0) 2022.11.01