객체지향과 SOLID 원칙
목차 15
좋은 객체지향 설계가 공통으로 지키는 5가지 원칙 SOLID가 이 강의 중심. 좋은 설계의 황금률(결합도↓·응집도↑)을 코드 차원에서 풀어낸 헌법. 매 회차 1~3문항.
핵심 암기 5종: SOLID · 한글 보조 단개리인의 · OCP 확열수닫 · LSP 자대부 · DIP 추의
객체지향 기초
객체지향이란 ·개념 정의·
[정의] 프로그램을 여러 개의 독립된 객체(Object)들의 협력으로 보는 설계 패러다임.
[분류]
| 용어 | 정의 |
|---|---|
| 객체(Object) | 데이터 + 그 데이터를 다루는 기능을 한 덩어리로 묶음 |
| 클래스(Class) | 객체를 찍어내는 설계도(틀) |
| 메시지(Message) | 객체끼리 주고받는 요청·응답 |
🎯 빈출 객체·클래스·메시지 세 용어가 함께 등장하면 객체지향 보기. 간헐.
객체지향 4대 특성 ·캡상다추·
[분류]
| 특성 | 영문 | 한 줄 정의 |
|---|---|---|
| 캡슐화 | Encapsulation | 데이터+기능을 묶고 외부엔 필요한 것만 공개 |
| 상속 | Inheritance | 부모 클래스의 속성·기능을 자식이 물려받음 |
| 다형성 | Polymorphism | 같은 메시지에 객체마다 다르게 반응 |
| 추상화 | Abstraction | 공통 속성만 뽑아 본질을 남기고 세부는 감춤 |
🔑 암기 캡상다추 (캡슐화·상속·다형성·추상화) ⚠️ 함정 4대 특성(캡상다추, 4개)과 SOLID 5원칙(단개리인의, 5개)은 다른 개념. 'SOLID 5원칙'에 캡상다추가 끼면 함정.
SOLID 개요 ·5원칙 한눈에·
[정의] 로버트 마틴(Robert C. Martin, 'Uncle Bob')이 2000년대 초 정리한 객체지향 설계 5원칙. 5개 원칙 영문 첫 글자를 모아 'SOLID'(견고한).
[분류]
| 약자 | 원칙(한글) | 한 줄 정의 | 핵심 키워드 |
|---|---|---|---|
| SRP | 단일 책임 | 클래스는 단 하나의 책임만 | 한 책임 |
| OCP | 개방-폐쇄 | 확장 열림·수정 닫힘 | 확열수닫 |
| LSP | 리스코프 치환 | 자식이 부모를 완전히 대체 | 자대부 |
| ISP | 인터페이스 분리 | 인터페이스를 작게 쪼갬 | 쪼개기 |
| DIP | 의존 역전 | 구체가 아닌 추상에 의존 | 추의 |
🔑 암기 SOLID / 단개리인의 (단일책임·개방폐쇄·리스코프치환·인터페이스분리·의존역전) 🎯 빈출 'SOLID를 정립한 사람?'(로버트 마틴) 단답·약자 매칭. 그중 OCP·LSP 정의 매칭은 거의 매회 1순위.
SOLID 5원칙
SRP — 단일 책임 ·Single Responsibility·
[정의] 하나의 클래스는 단 하나의 책임만 가져야 한다. = 클래스가 변경되어야 할 이유는 단 하나여야 한다.
🔑 암기 한 클래스 = 한 책임 🎯 빈출 '하나의 책임'·'변경 이유가 하나' → SRP. 모듈의 기능적 응집도를 클래스 차원에서 실현한 것. ⚠️ 함정 '인터페이스를 쪼갠다'는 SRP가 아니라 ISP. SRP = 책임(클래스 차원), ISP = 메서드(인터페이스 차원). 💡 보충 식당에서 한 명이 요리·서빙·계산을 다 하면 점심에 사고 — 한 사람 한 책임.
OCP — 개방-폐쇄 ·1순위 빈출·
[정의] 소프트웨어 요소는 확장에는 열려 있고, 수정에는 닫혀 있어야 한다(Open for extension, Closed for modification). 새 기능 추가 시 기존 코드는 안 건드리고 새 코드만 더한다.
🔑 암기 확열수닫 (확장 열림·수정 닫힘) 🎯 빈출 정의·빈칸·영문 매칭. 매 회차 거의 그대로 출제. 인터페이스를 미리 두고 새 구현 클래스만 추가하는 게 코드 모습. ⚠️ 함정 '수정 열림·확장 닫힘'으로 뒤집기 단골. 확장 = 열림(O), 수정 = 닫힘(C). 💡 보충 모듈러 책장·멀티탭 — 칸/탭을 끼워 확장, 기존은 안 부순다. 팩토리 메서드·전략·템플릿 메서드 패턴이 OCP 도구.
LSP — 리스코프 치환 ·1순위 빈출·
[정의] 자식 타입은 언제나 부모 타입을 완전히 대체할 수 있어야 한다. 부모 자리에 자식을 넣어도 프로그램이 정상 동작. 1987년 바버라 리스코프(Barbara Liskov) 정립.
🔑 암기 자대부 (자식이 부모를 대체) 🎯 빈출 '상위를 하위로 치환·대체' 정의 매칭 + '바버라 리스코프' 인물 매칭. 매 회차 1순위. ⚠️ 함정 단순 '상속 잘하라'가 아니라 '자식이 부모의 약속(계약)을 깨면 안 됨'. LSP를 잘 지키면 OCP도 따라온다. 💡 보충 Bird.fly()를 상속한 Penguin이 '못 난다'며 예외를 던지면 LSP 위반.
ISP — 인터페이스 분리 ·Interface Segregation·
[정의] 클라이언트는 자신이 사용하지 않는 메서드에 의존하면 안 된다. = 큰 인터페이스 하나보다 작게 쪼갠 여러 인터페이스가 낫다.
🔑 암기 쪼개기 — 인터페이스를 용도별로 잘게 분리 🎯 빈출 '사용하지 않는 메서드에 의존 X' 정의 매칭. SRP의 인터페이스 버전. ⚠️ 함정 SRP와 헷갈림 — SRP = 책임 분리(클래스), ISP = 메서드 분리(인터페이스). 가짜 풀네임 'Independence·Integration' 함정 → 정답은 Segregation. 💡 보충 만능 리모컨(버튼 100개) → 전용 리모컨(필요한 버튼만).
DIP — 의존 역전 ·Dependency Inversion·
[정의] 고수준 모듈은 저수준 모듈에 의존하면 안 되고, 둘 다 추상(인터페이스)에 의존해야 한다. = 구체 클래스가 아닌 추상에 의존하라.
🔑 암기 추의 (추상에 의존) 🎯 빈출 '구체가 아닌 추상에 의존'·'고수준·저수준 모두 추상에 의존' 정의 매칭. ⚠️ 함정 '역전'은 방향만 바꾸는 게 아니라 '추상에 의존하는 구조'. 가짜 풀네임 'Distribution' 함정 → 정답은 Dependency Inversion. 💡 보충 콘센트·USB 표준 — 가전도 충전기도 표준(추상)에 의존. OrderService가 IOrderRepository(추상)에만 의존하면 DB 교체 자유. 스프링 IoC(제어 역전) 컨테이너가 DIP의 대표 실현.
패턴과 명칭 함정
디자인 패턴 ↔ SOLID ·패턴은 도구·
[비교]
| 디자인 패턴 | 실현 원칙 |
|---|---|
| 팩토리 메서드 | OCP |
| 추상 팩토리 | OCP·DIP |
| 전략(Strategy) | OCP·DIP |
| 템플릿 메서드 | OCP·LSP |
| 어댑터 | DIP·ISP |
| 데코레이터 | OCP·SRP |
| 옵저버 | OCP·DIP |
🎯 빈출 '전략 패턴이 실현하는 SOLID 원칙?' 통합 문제. 간헐. 💡 보충 패턴은 도구, SOLID는 원칙 — 패턴이 SOLID를 코드로 풀어낸다. (GoF 패턴 23종은 6강.)
명칭 헷갈림 함정 차단 ·합격 한 끗·
[비교] 이름이 비슷한 '원칙·원리·특성' 모음
| 이름 | 두문자 | 영역 |
|---|---|---|
| 객체지향 설계 5원칙 | SOLID / 단개리인의 | 오늘의 주제 |
| 공통 모듈 명세 5원칙 | 정명완일추 | 모듈 명세(5강) |
| 요구사항 명세 6원리 | 명완검일수추 | 요구사항 문서화(2강) |
| 객체지향 4대 특성 | 캡상다추 | 특성(4개) |
| UI 설계 4원칙 | 직유학유 | 화면 설계(4강) |
🔑 암기 SOLID = 단개리인의 다섯 개뿐. 그 외 항목이 'SOLID 5원칙' 보기에 끼면 정답 후보. 🎯 빈출 'SOLID에 포함되지 않는 것?' 소거형. 정명완일추·캡상다추 끼워 넣기 단골.
기출 다지기
[기출 1 출제] 다음 설명에 해당하는 객체지향 설계 원칙은? (빈칸형)
소프트웨어 요소는 ( ㉠ )에는 열려 있어야 하고, ( ㉡ )에는 닫혀 있어야 한다. 즉, 새 기능을 추가할 때 기존 코드를 수정하지 않고 추가만으로 가능해야 한다.
- ① SRP (단일 책임 원칙)
- ② OCP (개방-폐쇄 원칙)
- ③ LSP (리스코프 치환 원칙)
- ④ ISP (인터페이스 분리 원칙)
정답 및 해설 보기
정답 ②
㉠ 확장 / ㉡ 수정. '확장 열림·수정 닫힘' = OCP 표준 정의.
| 선지 | 판정 | 근거 |
|---|---|---|
| ① SRP | 오답 | '한 클래스 = 한 책임'. 확장·수정과 무관 |
| ② OCP | 정답 | 확열수닫 |
| ③ LSP | 오답 | '자식이 부모 대체' |
| ④ ISP | 오답 | '인터페이스 쪼개기' |
🔑 OCP = 확열수닫. 영문 'Open for extension, Closed for modification'까지 한 세트.
[기출 2 출제] 다음 설명에 해당하는 객체지향 설계 원칙은? (설명→용어)
부모 타입의 객체를 자식 타입의 객체로 치환해도 프로그램의 정확성이 깨지지 않아야 한다. 자식 타입은 언제나 부모 타입을 완전히 대체할 수 있어야 한다.
- ① 단일 책임 원칙 (SRP)
- ② 개방-폐쇄 원칙 (OCP)
- ③ 리스코프 치환 원칙 (LSP)
- ④ 의존 역전 원칙 (DIP)
정답 및 해설 보기
정답 ③
| 선지 | 판정 | 근거 |
|---|---|---|
| ① SRP | 오답 | '한 책임'. 치환과 무관 |
| ② OCP | 오답 | '확열수닫'. 치환과 다른 결 |
| ③ LSP | 정답 | '치환·대체'가 핵심. 1987년 바버라 리스코프 |
| ④ DIP | 오답 | '추상에 의존' |
🔑 치환·대체·substitution이 보이면 LSP(자대부).
[기출 3 출제] SOLID 중 알파벳 약자와 원칙명이 잘못 짝지어진 것은? (짝짓기 오류형)
- ① S — Single Responsibility Principle (단일 책임 원칙)
- ② O — Open-Closed Principle (개방-폐쇄 원칙)
- ③ L — Liskov Substitution Principle (리스코프 치환 원칙)
- ④ D — Distribution Independence Principle (분배 독립 원칙)
정답 및 해설 보기
정답 ④
D는 Dependency Inversion Principle(의존 역전)이다. 'Distribution Independence'는 존재하지 않는 가짜 용어.
| 약자 | 정확한 영문 | 한글 |
|---|---|---|
| S | Single Responsibility | 단일 책임 |
| O | Open-Closed | 개방-폐쇄 |
| L | Liskov Substitution | 리스코프 치환 |
| I | Interface Segregation | 인터페이스 분리 |
| D | Dependency Inversion | 의존 역전 |
🔑 단개리인의. 가짜 풀네임 함정 — I = Interface Segregation, D = Dependency Inversion.
[기출 4 출제] 다음 설명에 해당하는 객체지향 설계 원칙은? (설명→용어)
하나의 클래스는 단 하나의 책임만 가져야 한다. 클래스가 변경되어야 할 이유는 오직 하나여야 한다.
- ① 단일 책임 원칙 (SRP)
- ② 개방-폐쇄 원칙 (OCP)
- ③ 인터페이스 분리 원칙 (ISP)
- ④ 의존 역전 원칙 (DIP)
정답 및 해설 보기
정답 ①
'단 하나의 책임'·'변경 이유가 하나' = SRP. 한 클래스 = 한 책임.
| 선지 | 판정 | 근거 |
|---|---|---|
| ① SRP | 정답 | 책임 차원의 분리 |
| ② OCP | 오답 | '확열수닫' |
| ③ ISP | 오답 | '분리' 단어로 헷갈림. ISP는 인터페이스(메서드) 차원 |
| ④ DIP | 오답 | '추상에 의존' |
🔑 SRP = 책임 분리(클래스), ISP = 메서드 분리(인터페이스). '책임'이 보이면 SRP.
[기출 5 출제] 의존 역전 원칙(DIP)에 대한 설명과 거리가 가장 먼 것은? (거리형)
- ① 고수준 모듈은 저수준 모듈에 의존해서는 안 된다
- ② 고수준 모듈과 저수준 모듈 모두 추상에 의존해야 한다
- ③ 추상은 세부 사항(구체 클래스)에 의존해서는 안 된다
- ④ 하위 클래스는 항상 상위 클래스를 완전히 대체할 수 있어야 한다
정답 및 해설 보기
정답 ④
④는 LSP(자대부)의 정의 — DIP와 거리가 가장 멀다.
| 선지 | 어떤 원칙? |
|---|---|
| ① 고수준→저수준 의존 금지 | DIP |
| ② 둘 다 추상에 의존 | DIP |
| ③ 추상→구체 의존 금지 | DIP |
| ④ 하위가 상위 대체 | LSP(DIP 아님) |
🔑 DIP 보기엔 '고수준·저수준·추상' 세 단어가 함께. '치환·대체'가 보이면 LSP.
[기출 6 출제] 객체지향 설계 5원칙(SOLID)에 포함되지 않는 것은? (소거형)
- ① 단일 책임 원칙 (SRP)
- ② 인터페이스 분리 원칙 (ISP)
- ③ 의존 역전 원칙 (DIP)
- ④ 공통 모듈 명세 5원칙 (정명완일추)
정답 및 해설 보기
정답 ④
정명완일추(정확·명확·완전·일관·추적)는 공통 모듈 명세 5원칙(5강)이다. SOLID와 이름만 비슷하고 영역이 다르다.
| 두문자 | 정체 |
|---|---|
| 단개리인의 | 객체지향 설계 5원칙(SOLID) |
| 정명완일추 | 공통 모듈 명세 5원칙(5강) |
| 명완검일수추 | 요구사항 명세 6원리(2강) |
🔑 SOLID = 단개리인의 다섯뿐. 캡상다추(4대 특성)·명완검일수추도 끼면 정답 후보.
[기출 7 출제] 객체지향 설계 원칙(SOLID)에 대한 설명으로 옳지 않은 것은? (부정형)
- ① SRP — 클래스는 단 하나의 책임만 가져야 한다
- ② OCP — 확장에는 열려 있고 수정에는 닫혀 있어야 한다
- ③ LSP — 클라이언트는 자신이 사용하지 않는 메서드에 의존하면 안 된다
- ④ DIP — 고수준 모듈과 저수준 모듈 모두 추상에 의존해야 한다
정답 및 해설 보기
정답 ③
③은 ISP(인터페이스 분리)의 정의다. LSP는 '자식이 부모를 완전히 대체(자대부)'.
| 선지 | 정확 여부 | 정확한 매칭 |
|---|---|---|
| ① SRP | 정확 | 한 책임 |
| ② OCP | 정확 | 확열수닫 |
| ③ LSP | 오류 | '사용하지 않는 메서드'는 ISP 정의 |
| ④ DIP | 정확 | 추상에 의존 |
🔑 SRP=한책임 / OCP=확열수닫 / LSP=자대부 / ISP=쪼개기 / DIP=추의. 자리 바꾸기 함정은 이 다섯 줄로 적발.
한 장 요약
| 약자 | 한글 | 한 줄 정의 | 핵심 키워드 |
|---|---|---|---|
| SRP | 단일 책임 | 한 클래스 = 한 책임 | 한 책임 |
| OCP | 개방-폐쇄 | 확장 열림·수정 닫힘 | 확열수닫 |
| LSP | 리스코프 치환 | 자식이 부모를 대체 | 자대부 |
| ISP | 인터페이스 분리 | 인터페이스 잘게 쪼개기 | 쪼개기 |
| DIP | 의존 역전 | 추상에 의존 | 추의 |
| 헷갈리는 짝 | 한 단어 차이 |
|---|---|
| SRP vs ISP | 책임(클래스) vs 메서드(인터페이스) |
| LSP vs DIP | 치환·대체 vs 추상에 의존 |
| SOLID vs 정명완일추 | 객체지향 5원칙 vs 공통 모듈 명세 5원칙 |
| SOLID vs 캡상다추 | 설계 5원칙 vs 4대 특성 |
🎯 합격 한 끗: 단개리인의 · 확열수닫 · 자대부 · 추의 네 줄과 명칭 함정(SOLID ≠ 정명완일추·캡상다추) 거르기만 손에 쥐면 7강은 끝. SOLID는 결합도↓·응집도↑를 코드 차원에서 푼 헌법(5강과 한 줄로 연결).
