Suhee Coding Archive

[๋””์ž์ธ ํŒจํ„ด] ์˜ต์ €๋ฒ„ ํŒจํ„ด ๋ณธ๋ฌธ

CS

[๋””์ž์ธ ํŒจํ„ด] ์˜ต์ €๋ฒ„ ํŒจํ„ด

sueee_y 2022. 10. 12. 13:57

๐Ÿ‘‰ ์˜ต์ €๋ฒ„ ํŒจํ„ด

์ฃผ์ฒด๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋‹ค๊ฐ€ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ๋“ฑ์„ ํ†ตํ•ด ์˜ต์ €๋ฒ„ ๋ชฉ๋ก์— ์žˆ๋Š” ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

 

- ์ฃผ์ฒด๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ๊ด€์ฐฐ์ž์ด๋ฉฐ, ์˜ต์ €๋ฒ„๋“ค์ด๋ž€ ์ด ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ „๋‹ฌ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ '์ถ”๊ฐ€ ๋ณ€ํ™” ์‚ฌํ•ญ'์ด ์ƒ๊ธฐ๋Š” ๊ฐ์ฒด๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.

- ์ฃผ์ฒด์™€ ๊ฐ์ฒด๋ฅผ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๊ณ  ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

ex) ํŠธ์œ„ํ„ฐ -  ์ƒˆ๋กœ์šด ํŠธ์œ—์ด ๋œจ๋ฉด ์ฃผ์ฒด๊ฐ€ ์˜ต์ €๋ฒ„(์ฃผ์ฒด๋ฅผ ํŒ”๋กœ์šฐ ํ•œ ํŒ”๋กœ์›Œ)๋“ค์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

 

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉํ•˜๋ฉฐ MVC ํŒจํ„ด์—๋„ ์‚ฌ์šฉ๋œ๋‹ค.

ex) ์ฃผ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ฒจ update() ๋ฉ”์„œ๋“œ๋กœ ์˜ต์ €๋ฒ„์ธ ๋ทฐ์— ์•Œ๋ ค์ฃผ๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋“ฑ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ

//topic์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ต์ €๋ฒ„ ํŒจํ„ด ๊ตฌํ˜„
//topic์€ ์ฃผ์ฒด์ด์ž ๊ฐ์ฒด

import java.util.ArrayList;
import java.util.List;

interface Subject {
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

interface Observer {
    public void update(); 
}

class Topic implements Subject { //Subject interface๋ฅผ ๊ตฌํ˜„
    private List<Observer> observers;
    private String message; 

    public Topic() {
        this.observers = new ArrayList<>();
        this.message = "";
    }

    @Override
    public void register(Observer obj) {
        if (!observers.contains(obj)) observers.add(obj); 
    }

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj); 
    }

    @Override
    public void notifyObservers() {   
        this.observers.forEach(Observer::update); 
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    } 
    
    public void postMessage(String msg) {
        System.out.println("Message sended to Topic: " + msg);
        this.message = msg; 
        notifyObservers();
    }
}

class TopicSubscriber implements Observer {
    private String name;
    private Subject topic;

    public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
    }

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this); 
        System.out.println(name + ":: got message >> " + msg); 
    } 
}

public class HelloWorld { 
    public static void main(String[] args) {
        Topic topic = new Topic(); 
        //์˜ต์ €๋ฒ„๋ฅผ ์„ ์–ธํ•  ๋–„ ํ•ด๋‹น ์ด๋ฆ„๊ณผ ์–ด๋– ํ•œ ํ† ํ”ฝ์˜ ์˜ต์ €๋ฒ„๊ฐ€ ๋  ๊ฒƒ์ธ์ง€ ์ •ํ•จ
        Observer a = new TopicSubscriber("a", topic); 
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c); 
   
        topic.postMessage("amumu is op champion!!"); 
    }
}
/*
Message sended to Topic: amumu is op champion!!
a:: got message >> amumu is op champion!!
b:: got message >> amumu is op champion!!
c:: got message >> amumu is op champion!!
*/

 

โž• ์ƒ์†๊ณผ ๊ตฌํ˜„

์ƒ์†(extends)์€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋“ฑ์„ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐ ํ™•์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์žฌ์‚ฌ์šฉ์„ฑ, ์ค‘๋ณต์„ฑ์˜ ์ตœ์†Œํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

๊ตฌํ˜„(implements)์€ ๋ถ€๋ชจ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ์ƒ์†๊ณผ ๋‹ฌ๋ฆฌ ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. 

 

์ƒ์†์€ ์ผ๋ฐ˜ ํด๋ž˜์Šค, abstract ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๊ตฌํ˜„์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ๊ตฌํ˜„์€ ๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Comments