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
로 분리하는 게 SRP2️⃣ 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
로 나누는 게 ISP5️⃣ 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);
}
}

전략패턴의 핵심
- DIP – 의존 역전 원칙 (Dependency Inversion Principle)
- 상위 모듈은 하위 모듈에 의존하면 안 되고, 둘 다 추상화에 의존해야 함
- 구체적인 것에 의존하지 않고 추상적인 것에 의존한다
- OCP - 개방-폐쇄 원칙 (Open/Closed Principle)
- 기능은 확장 가능하게 하되, 기존 코드는 수정하지 말 것
→ DIP를 지켜서 만들면 OCP가 자동으로 지켜진다

Share article