inblog logo
|
parangdajavous
    Design pattern

    Design pattern 1. Strategy Pattern

    김미숙's avatar
    김미숙
    Jul 22, 2025
    Design pattern 1. Strategy Pattern
    Contents
    ✅ SOLID 5대 원칙 - 객체지향 설계 5대 원칙

    ✅ SOLID 5대 원칙 - 객체지향 설계 5대 원칙

    💡
    OCP (개방-폐쇄 원칙)와 DIP (의존 역전 원칙)을 기억하자
    약자
    원칙 이름
    의미 요약
    S
    SRP (단일 책임 원칙)
    클래스는 하나의 책임만 가져야 함
    O
    OCP (개방-폐쇄 원칙)
    확장에 열려 있고, 변경에는 닫혀 있어야 함
    L
    LSP (리스코프 치환 원칙)
    자식 클래스는 부모 클래스를 대체할 수 있어야 함
    I
    ISP (인터페이스 분리 원칙)
    큰 인터페이스보다는 여러 개의 작은 인터페이스로 분리
    D
    DIP (의존 역전 원칙)
    구체적인 것보다 추상적인 것에 의존해야 함

    1️⃣ SRP – 단일 책임 원칙 (Single Responsibility Principle)

    • 클래스는 하나의 역할만 담당해야 함
    // ❌: 계산 + 출력 둘 다 함 public class Report { void calculate() {} void print() {} }
    → Calculator, Printer로 분리하는 게 SRP

    2️⃣ OCP – 개방-폐쇄 원칙 (Open/Closed Principle)

    • 기능은 확장 가능하게 하되, 기존 코드는 수정하지 말 것
    // ✅: 인터페이스 기반 설계로 확장 가능 interface Shape { double area(); } class Circle implements Shape { ... } class Square implements Shape { ... }

    3️⃣ LSP – 리스코프 치환 원칙 (Liskov Substitution Principle)

    • 자식 클래스는 언제나 부모 클래스의 역할을 대체할 수 있어야 함
    // ✅: 부모 클래스 Animal을 대체해도 동작 유지 Animal a = new Dog(); // OK a.speak();

    4️⃣ ISP – 인터페이스 분리 원칙 (Interface Segregation Principle)

    • 필요하지 않은 기능이 포함된 큰 인터페이스보다는
      • 작고 구체적인 인터페이스 여러 개로 나누는 것이 좋음
    // ❌: 모든 클래스가 print(), scan()을 구현해야 함 interface Machine { void print(); void scan(); void fax(); }
    → Printable, Scannable, Faxable로 나누는 게 ISP

    5️⃣ DIP – 의존 역전 원칙 (Dependency Inversion Principle)

    • 상위 모듈은 하위 모듈에 의존하면 안 되고
      • 둘 다 추상화에 의존해야 함
    // ✅: 인터페이스 기반 의존 class Service { Repository repo; Service(Repository repo) { this.repo = repo; } }

    ✅ 요약 표

    원칙
    핵심 메시지
    SRP
    하나의 책임만 가져라
    OCP
    확장에는 열려 있고, 변경에는 닫혀라
    LSP
    자식은 부모를 대체할 수 있어야 한다
    ISP
    인터페이스는 작게, 역할별로 나눠라
    DIP
    구체적인 클래스보다 추상에 의존하라
     
    Animal
    package ex01; public abstract class Animal { public abstract String getName(); }
    Mouse
    package ex01; public class Mouse extends Animal { private String name = "쥐"; // 상태 확인 public String getName() { return name; } }
    Tiger
    package ex01; public class Tiger extends Animal { private String name = "호랑이"; // 상태 확인 public String getName() { return name; } }
    Doorman
    package ex01; public class Doorman { // 객체의 책임 // 하나의 책임만 줄 수 있으면 좋겠지만 그럴 수 없다면 하나로 묶는다 public void 쫓아내(Animal animal) { System.out.println(animal.getName() + " 나가!!"); } }
    Cat
    package ex01; public class Cat extends Animal { private String name = "고양이"; public String getName() { return name; } }
    App
    package ex01; public class App { public static void main(String[] args) { Mouse m1 = new Mouse(); Doorman d1 = new Doorman(); d1.쫓아내(m1); Tiger t1 = new Tiger(); d1.쫓아내(t1); Cat c1 = new Cat(); d1.쫓아내(c1); } }
    notion image
     
    전략패턴의 핵심
    • DIP – 의존 역전 원칙 (Dependency Inversion Principle)
      • 상위 모듈은 하위 모듈에 의존하면 안 되고, 둘 다 추상화에 의존해야 함
      • 구체적인 것에 의존하지 않고 추상적인 것에 의존한다
    • OCP - 개방-폐쇄 원칙 (Open/Closed Principle)
      • 기능은 확장 가능하게 하되, 기존 코드는 수정하지 말 것
    → DIP를 지켜서 만들면 OCP가 자동으로 지켜진다
     
    notion image
    Share article
    Contents
    ✅ SOLID 5대 원칙 - 객체지향 설계 5대 원칙

    parangdajavous

    RSS·Powered by Inblog