24. SOLID 원칙

박은서's avatar
Jan 01, 2026
24. SOLID 원칙

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.경주하다(); } }
notion image
Share article