Design pattern 1. Strategy Pattern

김미숙's avatar
Jul 22, 2025
Design pattern 1. Strategy Pattern

✅ 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

parangdajavous