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