λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Java/Java 이둠

μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄

μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄

객체의 μƒνƒœμ—κ²Œ 역할을 μœ„μž„ν•˜λŠ” μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄μ„ μ•Œμ•„λ³΄μž.

객체의 μƒνƒœ

κ°μ²΄μ—μ„œμ˜ μƒνƒœλž€ 객체가 생쑴 μ£ΌκΈ° λ™μ•ˆ κ°€μ§ˆ 수 μžˆλŠ” μ‘°κ±΄μ΄λ‚˜ 상황을 λœ»ν•œλ‹€.

μ‚¬λžŒμ΄λ‚˜ 사물도 ν˜„μž¬μ— μƒνƒœμ— 따라 λ‹€λ₯΄λ“―이, 객체지ν–₯도 ν˜„μ‹€ 세계λ₯Ό λ°˜μ˜ν•œ 것이기 λ•Œλ¬Έμ— κ°μ²΄λ§ˆλ‹€ μƒνƒœκ°€ μ‘΄μž¬ν•œλ‹€.

Switch & Client

Switch

public class Switch {
    private int ON = 1;
    private int OFF = 0;

    private int state;
    public Switch(){
        state =  OFF;
    }

    public void getOnSwich(){
        if(state==ON) System.out.println("이미 ON μƒνƒœμž…λ‹ˆλ‹€.");
        else{
            state=ON;
            System.out.println("μŠ€μœ„μΉ˜κ°€ μΌœμ‘ŒμŠ΅λ‹ˆλ‹€.");
        }
    }

    public void getOffSwitch(){
        if(state==OFF) System.out.println("이미 OFF μƒνƒœμž…λ‹ˆλ‹€.");
        else{
            state=ON;
            System.out.println("μŠ€μœ„μΉ˜κ°€ κΊΌμ‘ŒμŠ΅λ‹ˆλ‹€.");
        }
    }
}

SwichλΌλŠ” 객체λ₯Ό λ§Œλ“€μ–΄μ„œ 예λ₯Ό λ“€μ–΄λ³΄μž.

ONκ³Ό OFFλΌλŠ” μƒνƒœλ₯Ό 가지고, ν˜„μž¬ μƒνƒœλ₯Ό stateλΌλŠ” λ³€μˆ˜μ— μ €μž₯ν•œλ‹€.

그리고 ON λ²„νŠΌμ„ λˆ„λ₯΄λŠ” ν–‰μœ„(getOnSwich() λ©”μ„œλ“œ), OFF λ²„νŠΌμ„ λˆ„λ₯΄λŠ” ν–‰μœ„(getOFFSwich() λ©”μ„œλ“œ)λ₯Ό 톡해 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΏ€ 수 μžˆλ‹€.

Client

public class Clinent {
    public static void main(String[] args) {
        Switch test = new Switch();
        test.getONSwich();
        test.getOFFSwitch();
    }
}

ν–‰μœ„λ₯Ό ν•˜λŠ” client 객체둜 swichλ₯Ό λ§Œλ“€κ³  μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

λ‹€μŒκ³Ό 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

μŠ€μœ„μΉ˜κ°€ μΌœμ‘ŒμŠ΅λ‹ˆλ‹€.
μŠ€μœ„μΉ˜κ°€ κΊΌμ‘ŒμŠ΅λ‹ˆλ‹€.

μƒνƒœκ°€ μΆ”κ°€λœλ‹€λ©΄?

ONκ³Ό OFF 외에 WAITING(λŒ€κΈ°)μ΄λΌλŠ” μƒνƒœκ°€ μΆ”κ°€λœλ‹€κ³  μƒκ°ν•΄λ³΄μž.

κ·Έλ ‡κ²Œ 되면 swich 객체의 getOnSwich() λ©”μ„œλ“œμ™€ getOFFSwich() λ©”μ„œλ“œμ— 쑰건문을 μΆ”κ°€ν•΄μ„œ ν˜„μž¬ stateκ°€ WAITING인 경우λ₯Ό μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

μ΄λŸ¬ν•œ 방식은 쑰건문을 μ°Ύμ•„κ°€λ©° ν˜„μž¬μ˜ μƒνƒœκ°€ μ–΄λ–»κ²Œ λ³€ν•˜λŠ”μ§€ νŒŒμ•…ν•΄μ•Ό ν•˜λ―€λ‘œ μƒνƒœμ˜ λ³€ν™”λ₯Ό νŒŒμ•…ν•˜κΈ° μ–΄λ ΅κ³ , μƒˆλ‘œμš΄ μƒνƒœκ°€ μΆ”κ°€λ˜λ©΄ λͺ¨λ“  ν–‰μœ„ λ©”μ„œλ“œμ— μƒˆλ‘œμš΄ λ³€ν™”μ˜ λ‚΄μš©μ„ μΆ”κ°€ν•΄ μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μœ μ§€ λ³΄μˆ˜μ— 쒋지 μ•Šλ‹€.

μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄μ˜ λ„μž…

μœ„μ™€ 같은 문제 상황을 μœ„ν•΄ μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄μ„ λ„μž…ν•œλ‹€.

μŠ€ν…Œμ΄νŠΈ νŒ¨ν„΄μ€ 기쑴의 λ°©μ‹κ³ΌλŠ” λ‹€λ₯΄κ²Œ μƒνƒœμ— κ΄€ν•œ μΈν„°νŽ˜μ΄μŠ€μ— κ³΅λ™μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•  ν–‰μœ„ λ©”μ„œλ“œλ₯Ό μ§€μ •ν•˜κ³ , μƒνƒœμ—κ²Œ κ·Έ ν–‰μœ„ λ©”μ„œλ“œμ˜ 싀체화λ₯Ό μœ„μž„ν•˜λŠ” 방식이닀.

State

public interface State {
    public void getONSwich(Switch testSwitch);
    public void getOFFSwitch(Switch testSwitch);
}

λ‹€μŒκ³Ό 같은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€κ³  이λ₯Ό μ‹€μ²΄ν™”ν•˜λŠ” ONκ³Ό OFF λ©”μ„œλ“œλ₯Ό λ§Œλ“€μž.

ON

public class ON implements State{
    @Override
    public void getONSwich(Switch testSwitch) {
        System.out.println("이미 ON μƒνƒœμž…λ‹ˆλ‹€.");
    }

    @Override
    public void getOFFSwitch(Switch testSwitch) {
        testSwitch.setState(new OFF());
        System.out.println("μŠ€μœ„μΉ˜κ°€ κΊΌμ‘ŒμŠ΅λ‹ˆλ‹€.");
    }
}

OFF

public class OFF implements State{
    @Override
    public void getONSwich(Switch testSwitch) {
        testSwitch.setState(new ON());
        System.out.println("μŠ€μœ„μΉ˜κ°€ μΌœμ‘ŒμŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void getOFFSwitch(Switch testSwitch) {
        System.out.println("이미 OFF μƒνƒœμž…λ‹ˆλ‹€.");
    }
}

μ΄λ ‡κ²Œ μƒνƒœμ— ν–‰μœ„ λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ„ μœ„μž„ν–ˆλ‹€.

그러면 Switch 객체도 λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄μ•Ό 보자.

Switch

public class Switch {

    public void setState(State state) {
        this.state = state;
    }

    private State state;

    public Switch(){
        state = new OFF();
    }

    public void getONSwich(){
        state.getONSwich(this);
    }

    public void getOFFSwitch(){
        state.getOFFSwitch(this);
    }
}

μœ„μ™€ 같이 μ‹€μ²΄ν™”λœ μƒνƒœκ°€ Switch의 객체의 μƒνƒœλ₯Ό λ³€κ²½ν•΄ μ£ΌλŠ” set λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜κ³ , ꡬ체적인 ν–‰μœ„λŠ” μ‹€μ²΄ν™”λœ μƒνƒœ 객체에 μœ„μž„ν•œλ‹€.

μž₯점

  • μƒνƒœλ³€ν™”λ₯Ό 비ꡐ적 μ‰½κ²Œ 확인할 수 μžˆλ‹€.
  • μƒˆλ‘œμš΄ μƒνƒœκ°€ μΆ”κ°€λ˜λ©΄ λ©”μ„œλ“œμ— 쑰건문으둜 μΆ”κ°€ν•˜λŠ” 것이 μ•„λ‹ˆλΌ stateλ₯Ό μ‹€μ²΄ν™”ν•˜λŠ” 객체λ₯Ό λ§Œλ“€μ–΄μ£Όλ©΄ λœλ‹€.
  • κ·ΈλŸ¬λ―€λ‘œ μƒνƒœκ°€ μΆ”κ°€λœλ‹€ ν•΄μ„œ Switch의 μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•  ν•„μš”κ°€ μ—†λ‹€.
  • clientλŠ” μƒνƒœ 객체에 λŒ€ν•œ 지식이 없어도 μ‚¬μš©ν•  수 μžˆλ‹€.