1. SOLID 원칙
0️⃣ SOLID 원칙이란?
객체지향 설계에서 가장 중요한 5가지 설계 원칙
객체지향 설계를 유연하고, 확장 가능하며, 유지보수하기 쉽게 만들기 위한 5가지 설계 원칙의 앞글자
1️⃣ SRP – 단일 책임 원칙
(Single Responsibility Principle)
1) 개념
클래스는 하나의 책임만 가져야 한다
2) 의미
- 변경 이유는 하나여야 함
- 역할이 섞이면 수정 영향 범위 커짐
3) 예시
❌
class UserService {
void saveUser() {}
void sendEmail() {}
}⭕
class UserService {
void saveUser() {}
}
class EmailService {
void sendEmail() {}
}2️⃣ OCP – 개방-폐쇄 원칙
(Open-Closed Principle)
1) 개념
확장에는 열려 있고, 수정에는 닫혀 있어야 한다
2) 의미
- 기존 코드 수정 ❌
- 새 기능은 추가 ⭕
3) 예시
abstract class Payment {
abstract void pay();
}class CardPay extends Payment {}
class KakaoPay extends Payment {}3️⃣ LSP – 리스코프 치환 원칙
(Liskov Substitution Principle)
1) 개념
부모 타입 객체를 자식 객체로 바꿔도 프로그램이 정상 동작해야 한다
자식 클래스는 부모 클래스의 행위를 깨뜨리면 안 된다.
2) 의미
- is-a 관계 보장
- 상속 오용 방지
3) ❌위반❌ 예시
class Bird {
void fly() {}
}
class Penguin extends Bird { } // ❌4️⃣ ISP – 인터페이스 분리 원칙
(Interface Segregation Principle)
1) 개념
사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하라
2) 의미
- 인터페이스는 작게
- 역할 중심 설계
3) 예시
❌
interface Machine {
void print();
void fax();
}⭕
interface Printer {
void print();
}
interface Fax {
void fax();
}5️⃣ DIP – 의존성 역전 원칙
(Dependency Inversion Principle)
1) 개념
구체 클래스가 아니라 추상화에 의존하라
2) 의미
- 구현이 아닌 역할에 의존
- 결합도 감소
3) 예시
❌
class Service {
MySQL db = new MySQL();
}⭕
class Service {
Database db;
}6️⃣ SOLID 전체 한눈에 정리
원칙 | 핵심 키워드 |
SRP | 하나의 책임 |
OCP | 확장 ⭕ 수정 ❌ |
LSP | 상속 안정성 |
ISP | 인터페이스 분리 |
DIP | 추상화 의존 |
7️⃣ DIP 실습
package ex07;
class 계산기 {
private void add(){}
private void minus(){}
private void multi(){}
private void divide(){}
public void 계산하다(String str){
add();
minus();
}
}
// DIP 단일 책임의 원칙 (의존성 역전원칙 - 구체적인것에 의존하지말고 추상적인것에 의존하라)
abstract class 자동차 {
public abstract void run();
}
class 람보르기니 extends 자동차{
public void run(){
System.out.println("람보르기니 달린다.");
}
}
class M5 extends 자동차{
public void run(){
System.out.println("m5 달린다.");
}
}
class 포르쉐911 extends 자동차{
public void run(){
System.out.println("포르쉐911 달린다.");
}
}
class 레이싱게임 {
자동차 car1;
자동차 car2;
public 레이싱게임(자동차 car1, 자동차 car2) {
this.car1 = car1;
this.car2 = car2;
}
public void 경주하다(){
car1.run();
car2.run();
}
}
public class MyApp {
public static void main(String[] args) {
// 1. 초기화
자동차 car1 = new M5();
자동차 car2 = new 포르쉐911();
자동차 car3 = new 람보르기니();
레이싱게임 game = new 레이싱게임(car1, car3);
game.경주하다();
}
}

Share article