Java & Spring/Java

SOLID 원칙

승주우에요 2026. 1. 6. 22:12

객체 지향 설계를 위한 다섯가지 핵심 원칙이다. 코드의 유지보수성, 확장성, 결합도 감소를 목표로 한다. 면접 단골 질문이니 잘 기억해두자!!

  • SRP - 단일 책임 원칙
  • OCP - 개방/폐쇄 원칙
  • LSP - 리스코프 치환 원칙
  • ISP - 인터페이스 분리 원칙
  • DIP - 의존성 역전 원칙

1. SRP - 단일 책임 원책

하나의 클래스는 하나의 책임만 가져야 한다. 

//위반 예시
class UserService {
    void saveUser() {
        // 사용자 저장
    }

    void sendEmail() {
        // 이메일 전송
    }
}
//적용 예시
class UserService {
    void saveUser() {
        // 사용자 저장
    }
}

class EmailService {
    void sendEmail() {
        // 이메일 전송
    }
}

 

2. OCP - 개방/폐쇄 원칙

확장에는 열려 있고, 변경에는 닫혀 있어야 한다.

//위반 예시
class PayService {
    void pay(String type) {
        if (type.equals("CARD")) {
            // 카드 결제
        } else if (type.equals("KAKAO")) {
            // 카카오 결제
        }
    }
}

//적용 예시
interface Pay {
    void pay();
}

class CardPay implements Pay {
    public void pay() {}
}

class KakaoPay implements Pay {
    public void pay() {}
}
class PayService {
    private final Pay pay;

    PayService(Pay pay) {
        this.pay = pay;
    }

    void process() {
        pay.pay();
    }
}

 

3. LSP - 리스코프 치환 원칙

자식 클래스는 부모 클래스를 완전히 대체할 수 있어야 한다.

// 위반 예시
class Bird {
    void fly() {}
}

class Penguin extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException();
    }
}

// 적용 예시
interface Flyable {
    void fly();
}

class Sparrow implements Flyable {
    public void fly() {}
}

class Penguin {
    // fly 없음
}

 

4. ISP - 인터페이스 분리 원칙

클라이언트는 사용하지 않는 메서드에 의존하면 안됨

// 위반 예시
interface Machine {
    void print();
    void scan();
    void fax();
}
class SimplePrinter implements Machine {
    public void print() {}
    public void scan() {} // 필요 없음
    public void fax() {}  // 필요 없음
}

// 적용 예시
interface Printer {
    void print();
}

interface Scanner {
    void scan();
}
class SimplePrinter implements Printer {
    public void print() {}
}

 

5. DIP - 의존성 역전 원칙

구현이 아니라 추상에 의존해야 함

//위반 예시
class OrderService {
    private CardPay pay = new CardPay();
}

//적용 예시
class OrderService {
    private final Pay pay;

    OrderService(Pay pay) {
        this.pay = pay;
    }
}

 

6. SOLID 원칙 정리

목적은 변경에 강한 코드를 작성하는 것이 목적이다

이를 위해

  • 책임 나누고 (SRP)
  • 확장 가능하게 만들고 (OCP)
  • 상속을 안전하게 쓰고(LSP)
  • 인터페이스를 작게 유지하며 (ISP)
  • 구현 의존을 제거한다 (DIP)

'Java & Spring > Java' 카테고리의 다른 글

내부 클래스(Inner Class)  (0) 2026.01.07
추상화  (0) 2026.01.07
다형성 (Polymorphism)  (0) 2026.01.06
캡슐화와 접근 제어자  (0) 2026.01.06
Object 클래스  (0) 2026.01.06