ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] λ””μžμΈ νŒ¨ν„΄(Strategy νŒ¨ν„΄)
    Android/Java 2021. 5. 11. 23:31
    λ°˜μ‘ν˜•
    • 이 글은 "μΈν”„λŸ° Java λ””μžμΈ νŒ¨ν„΄" κ°•μ˜λ₯Ό λ“£κ³  κ³΅λΆ€ν•œ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ 글을 μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    Strategy νŒ¨ν„΄

    • 클래슀 역할을 뚜렷히 ν•˜μ—¬ λͺ¨λ“ˆν™”λœ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 도움을 μ£ΌλŠ” νŒ¨ν„΄μœΌλ‘œ μ—¬λŸ¬ 가지 κΈ°λŠ₯듀에 λŒ€ν•΄ ꡬ체적인 클래슀둜 κ΅¬ν˜„ν•˜μ—¬ ν‘œν˜„ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.

    • 각 κΈ°λŠ₯듀에 λŒ€ν•΄μ„œ If, else if, else 와 같은 쑰건문으둜 ν•˜λ“œμ½”λ”©ν•˜μ—¬ λ‹€λ₯΄κ²Œ μž‘μ„±ν•˜λ©΄ κΈ°λŠ₯적인 μΈ‘λ©΄μ—μ„œλŠ” 같을지 λͺ°λΌλ„ 객체지ν–₯ 원칙이 μ–΄κΈ‹λ‚˜κ²Œ λ©λ‹ˆλ‹€.

    • μ›ν•˜λŠ” λ™μž‘μ΄ μžˆμ„ λ•Œ ν•΄λ‹Ή κΈ°λŠ₯을 κ΅¬ν˜„ν•œ 클래슀둜 λ°”κΎΈκΈ° λ•Œλ¬Έμ— μΆ”ν›„ μœ μ§€λ³΄μˆ˜μ™€ μˆ˜μ •μ— μš©μ΄ν•©λ‹ˆλ‹€.


    Strategy νŒ¨ν„΄ μ‚¬μš©

    public class DeviceOS {
        public String type;
    
        public DeviceOS(String type) {
            this.type = type;
        }
    }

    λ¨Όμ € DeviceOS λΌλŠ” 클래슀λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. 각쒅 Device에 ν¬ν•¨μ‹œν‚¬ 수 μžˆλŠ” 운영체제둜 Window, Mac, Linux, Android ..이 type이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    public class Device {
        private DeviceOS deviceOS;
    
        public Device(DeviceOS deviceOS) {
            this.deviceOS = deviceOS;
        }
    
        public void execute(){
            switch (deviceOS.type){
                case "Mac":
                    System.out.println("Mac OS booting");
                    break;
                case "Linux":
                    System.out.println("Linux booting");
                    break;
                case "Android":
                    System.out.println("Android booting");
                    break;
                case "Window":
                    System.out.println("Window booting");
                    break;
                default:
                    break;
            }
        }
    }
    
    public class Main{
        public static void main(String[] args) {
            DeviceOS deviceOS = new DeviceOS("Linux");
            Device device = new Device(deviceOS);
    
            device.execute();
               // Linux booting
        }
    }

    DeviceOSλ₯Ό 가지고 μžˆλŠ” μ‹€μ œ Device에 ν•΄λ‹Ήν•˜λŠ” 클래슀둜 execute ν•¨μˆ˜λŠ” 각 운영체제의 μ’…λ₯˜μ— 따라 λ‹€λ₯΄κ²Œ μž‘λ™ν•˜λŠ” κ±Έ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.μ΄λ ‡κ²Œ κ΅¬ν˜„μ„ ν•˜μ—¬λ„ 사싀상 κΈ°λŠ₯ μΈ‘λ©΄μ—μ„œλŠ” λ¬Έμ œμ—†μ΄ μž‘λ™ν•©λ‹ˆλ‹€. μ‹€μ œ ν˜„μ—…μ—μ„œλ„ μ‹œκ°„μ μΈ μš”μ†Œλ‘œ 인해 case λ§ˆλ‹€ ν•˜λ“œμ½”λ”©ν•˜μ—¬ κ΅¬ν˜„ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.
    ν•˜μ§€λ§Œ 개발자라면 객체지ν–₯의 원칙을 ν†΅ν•œ λͺ¨λ“ˆν™”μ˜ 뢄리λ₯Ό 톡해 미래 μœ μ§€λ³΄μˆ˜μ™€ μˆ˜μ •μ„ μš©μ΄ν•  수 μžˆλ„λ‘ μ„€κ³„ν•˜λŠ” 것도 μ€‘μš”ν•œ λŠ₯λ ₯이라고 μƒκ°ν•©λ‹ˆλ‹€.

    public interface OperatingSystem {
        void execute();
    }

    Strategy νŒ¨ν„΄μ„ μ‚¬μš©ν•˜κΈ° 전에 OperatingSystemμ΄λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 각 OS ꡬ체적인 νƒ€μž… ν΄λž˜μŠ€μ— λ©”μ†Œλ“œλ₯Ό κ°•μ œμ μœΌλ‘œ κ΅¬ν˜„ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

    public class Android implements OperatingSystem {
        @Override
        public void execute() {
            System.out.println("Android booting");
        }
    }
    
    public class Linux implements OperatingSystem{
        @Override
        public void execute() {
            System.out.println("Linux booting");
        }
    }
    
    public class Mac implements OperatingSystem {
        @Override
        public void execute() {
            System.out.println("Mac booting");
        }
    }
    
    public class Window implements OperatingSystem {
        @Override
        public void execute() {
            System.out.println("Window");
        }
    }
    
    public class Device {
        private OperatingSystem operatingSystem;
    
        public Device(OperatingSystem operatingSystem) {
            this.operatingSystem = operatingSystem;
        }
    
        public void execute(){
            operatingSystem.execute();
        }
    }

    각 κΈ°λŠ₯별 클래슀λ₯Ό κ΅¬ν˜„ν•˜μ—¬ OperatingSystemμ—μ„œ κ°•μ œ 받은 λ©”μ†Œλ“œλ‘œ μ›ν•˜λŠ” λ™μž‘μ„ ν•˜λ„λ‘ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 Deviceμ—μ„œλŠ” OperatingSystemμ΄λΌλŠ” μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έν•˜μ—¬ μƒμ„±μžμ—μ„œ 받을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

    public class Main{
        public static void main(String[] args) {
            OperatingSystem operatingSystem = new Linux();
            Device device = new Device(operatingSystem);
    
            device.execute();
            // Linux booting
        }
    }

    λ‹€μŒκ³Ό 같이 Main λ©”μ†Œλ“œλ₯Ό μž‘μ„±ν•  경우 κ²°κ³ΌλŠ” λ™μΌν•˜κ²Œ λ‚˜μ˜¨λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°κΉŒμ§€ 봀을 λ•Œ 큰 차이가 μžˆμ„κΉŒ λΌλŠ” 의문이 λ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 객체지ν–₯ μ›μΉ™μœΌλ‘œ 큰 μ†Œν”„νŠΈμ›¨μ–΄μΌμˆ˜λ‘ μž‘μ€ λͺ¨λ“ˆ λ‹¨μœ„λ‘œ μͺΌκ°œκ³  ꡬ체적인 κΈ°λŠ₯을 가진 클래슀둜 κ΅¬ν˜„ν•˜λŠ” ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 원칙을 ν†΅ν•΄μ„œ μœ μ§€λ³΄μˆ˜μ™€ μΆ”κ°€ μˆ˜μ •μ΄ κ°„νŽΈν•΄μ§€κ³  였λ₯˜κ°€ λ°œμƒν–ˆμ„ 경우 μ •ν™•ν•œ λͺ¨λ“ˆμ˜ 클래슀만 보면 되기 λ•Œλ¬Έμ— λΉ λ₯΄κ²Œ λŒ€μ‘μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

    λ°˜μ‘ν˜•

    'Android > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    [Java] λ””μžμΈ νŒ¨ν„΄(Template νŒ¨ν„΄)  (0) 2021.05.17
    [Java] λ””μžμΈ νŒ¨ν„΄(Proxy νŒ¨ν„΄)  (0) 2021.05.14
    [Java] λžŒλ‹€μ‹μ΄λž€?  (0) 2021.03.21
    [Java] Java Generic(μ œλ„€λ¦­)  (0) 2021.03.01
    [Java] Java IO, NIO  (0) 2021.02.22
Designed by Tistory.