
SOLID ์์น
- SRP (๋จ์ผ ์ฑ ์ ์์น)
- OCP (๊ฐ๋ฐฉ-ํ์ ์์น)
- LSP (๋ฆฌ์ค์ฝํ ์นํ ์์น)
- DIP (์์กด ์ญ์ ์์น)
- ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
๐ SOLID — ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋ค์ฏ ๊ฐ์ง ํต์ฌ ์์น
ํ์ต๋ชฉํ
- ์ํํธ์จ์ด ์ค๊ณ์ ๊ธฐ๋ณธ ์๋ฆฌ์ธ SOLID ์์น์ ์ดํดํ๋ค.
- ๊ฐ ์์น์ ์ ์์ ์ ์ฉ ๋ฐฉ๋ฒ์ ํ์ตํ์ฌ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋์ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ์ ์๋ค.
- ์ค์ ์์๋ฅผ ํตํด ์๋ชป๋ ์ค๊ณ์ ๊ฐ์ ๋ ์ค๊ณ์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ค.
1. SRP (Single Responsibility Principle) — ๋จ์ผ ์ฑ ์ ์์น
“ํ๋์ ํด๋์ค๋ ์ค์ง ํ๋์ ์ด์ ๋ก๋ง ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.”
์ ์
- ํด๋์ค๋ ํ๋์ ์ฑ ์(๋ณ๊ฒฝ ์ด์ )๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
- ์๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ๊ธฐ๋ฅ์ ํ ํด๋์ค์ ๋ด์ผ๋ฉด, ํ๋์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
ํต์ฌ ๊ฐ๋
- ์ฑ ์(Responsibility)์ ๊ณง ๋ณ๊ฒฝ ์ด์ (Reason for Change)์ด๋ค.
- ์ฌ๋ฌ ์ฑ ์์ ๊ฐ์ง ํด๋์ค๋ ์ฌ๋ฌ ๋ณ๊ฒฝ ์์ธ์ ๋ ธ์ถ๋์ด ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ์ฆ, ํ ํด๋์ค๊ฐ ๋ด๋นํด์ผ ํ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌํด์ผ ํ๋ค.
์์
// โ ์๋ชป๋ ์์: Student ํด๋์ค๊ฐ ์ฌ๋ฌ ์ญํ ์ ์ํ
class Student {
void saveToDatabase() {}
void printReportCard() {}
void findAdvisor() {}
}
// โ
๊ฐ์ ๋ ์์: ์ฑ
์ ๋ถ๋ฆฌ
class StudentRepository { void save(Student s) {} }
class ReportPrinter { void print(Student s) {} }
class AdvisorFinder { void find(Student s) {} }
// โ ์๋ชป๋ ์์: Student ํด๋์ค๊ฐ ์ฌ๋ฌ ์ญํ ์ ์ํ
class Student {
void saveToDatabase() {}
void printReportCard() {}
void findAdvisor() {}
}
// โ
๊ฐ์ ๋ ์์: ์ฑ
์ ๋ถ๋ฆฌ
class StudentRepository { void save(Student s) {} }
class ReportPrinter { void print(Student s) {} }
class AdvisorFinder { void find(Student s) {} }
์ฃผ์ ๋ฌธ์ ์
- ์ฌ๋ฌ ์ฑ
์์ ๊ฐ์ง ํด๋์ค๋ “์ฐํ์ด ์์ (Shotgun Surgery)” ํ์์ ์ ๋ฐํ๋ค.
→ ํ๋์ ๋ณ๊ฒฝ์ด ์ฌ๋ฌ ํด๋์ค ๋๋ ์ฌ๋ฌ ๋ฉ์๋์ ๋์์ ์ํฅ์ ๋ฏธ์นจ.
2. OCP (Open-Closed Principle) — ๊ฐ๋ฐฉ-ํ์ ์์น
“์ํํธ์จ์ด ์ํฐํฐ๋ ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ๋ซํ ์์ด์ผ ํ๋ค.”
์ ์
- ์๋ก์ด ๊ธฐ๋ฅ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์ถ๊ฐํ ์ ์๋๋ก ์ค๊ณํด์ผ ํ๋ค.
- ์ฆ, ํ์ฅ์ ์ด๋ ค(Open) ์์ผ๋, ์์ ์ ๋ซํ(Closed) ์์ด์ผ ํ๋ค.
์ ์ฉ ๋ฐฉ๋ฒ
- ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๋ณ๊ฒฝ๋์ง ์๋ ๋ถ๋ถ(๋ซํ ๋ถ๋ถ)๊ณผ ๋ณ๊ฒฝ๋ ๋ถ๋ถ(์ด๋ฆฐ ๋ถ๋ถ)์ ๋ถ๋ฆฌํ๋ค.
์์
interface MusicPlayer {
void play();
}
class MP3Player implements MusicPlayer {
public void play() { System.out.println("Playing MP3"); }
}
class TimeTrigger {
private MusicPlayer player;
public TimeTrigger(MusicPlayer player) { this.player = player; }
public void trigger() {
player.play(); // ๋ณ๊ฒฝ ์์ด ํ์ฅ ๊ฐ๋ฅ
}
}
์ ์ค๊ณ์์๋ ์๋ก์ด ์ฌ์ ์ฅ์น๊ฐ ์ถ๊ฐ๋์ด๋ MusicPlayer ์ธํฐํ์ด์ค๋ง ๊ตฌํํ๋ฉด ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค.
3. LSP (Liskov Substitution Principle) — ๋ฆฌ์ค์ฝํ ์นํ ์์น
“ํ์ ํด๋์ค๋ ์์ ํด๋์ค๋ฅผ ์๋ฒฝํ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค.”
์ ์
- ํ๋ก๊ทธ๋จ์์ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ฒด ๋์ ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด๋ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ์๋ํด์ผ ํ๋ค.
์์
class Rectangle {
int width, height;
void setWidth(int w) { width = w; }
void setHeight(int h) { height = h; }
int getArea() { return width * height; }
}
class Square extends Rectangle {
void setWidth(int w) {
width = w;
height = w; // ์ ์ฌ๊ฐํ์ ํน์ฑ ์ ์ง
}
}
ํ์ง๋ง, Rectangle์ ๊ธฐ๋ํ ์ฝ๋๊ฐ Square๋ฅผ ๋์ ํ์ ๋ ์๊ธฐ์น ๋ชปํ ๋์์ ํ๋ค๋ฉด LSP ์๋ฐ์ด๋ค.
์ฆ, “is-a ๊ด๊ณ”๊ฐ ์๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ํํ๋ค.
ํต์ฌ ํฌ์ธํธ
- ๋ถ๋ชจ ํด๋์ค์ ๊ท์ฝ์ ๊นจ๋จ๋ฆฌ์ง ์์์ผ ํ๋ค.
- ํ์ ํด๋์ค๊ฐ ๋ถ๋ชจ์ ํ์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ์ฝ์ ์๋ฐํ์ง ์์์ผ ํ๋ค.
4. DIP (Dependency Inversion Principle) — ์์กด ์ญ์ ์์น
“๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์๋๋ผ ์ถ์ํ์ ์์กดํ๋ผ.”
์ ์
- ์์ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ์ธ๋ถ ๊ตฌํ์ ์์กดํ์ง ์๊ณ , **์ถ์ํ(์ธํฐํ์ด์ค)**์ ์์กดํด์ผ ํ๋ค.
- ๋ณํ์ ์ทจ์ฝํ ๊ตฌ์ฒด์ ์์๋ณด๋ค, ์๋์ ์ผ๋ก ์์ ์ ์ธ ์ถ์ ๊ณ์ธต์ ์ค์ฌ์ผ๋ก ์ค๊ณํ๋ค.
์์
interface Robot {
void doWork();
}
class CleaningRobot implements Robot {
public void doWork() { System.out.println("Cleaning!"); }
}
class Kid {
private Robot robot;
public Kid(Robot robot) { this.robot = robot; }
public void start() { robot.doWork(); }
}
Kid ํด๋์ค๋ Robot ์ธํฐํ์ด์ค์ ์์กดํ๋ฏ๋ก, CleaningRobot ์ด์ธ์ ๋ก๋ด์ผ๋ก ์ฝ๊ฒ ๊ต์ฒด ๊ฐ๋ฅํ๋ค.
5 ISP (Interface Segregation Principle) — ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
“ํ๋์ ๋ฒ์ฉ ์ธํฐํ์ด์ค๋ณด๋ค๋ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฒด์ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค.”
์ ์
- ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ์ ์์กดํ์ง ์์์ผ ํ๋ค.
- ์ฆ, ์ธํฐํ์ด์ค๋ ์๊ณ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
์์
interface Printer {
void print();
}
interface Scanner {
void scan();
}
// ๋ฉํฐํ๋ฆฐํฐ๋ ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ๊ตฌํํ ์ ์๋ค.
class MultiDevice implements Printer, Scanner {
public void print() {}
public void scan() {}
}
๋ถํ์ํ ๋ฉ์๋ ์์กด์ ๋ง๊ณ , ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ธ๋ถํํจ์ผ๋ก์จ ์์คํ ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
๐ํต์ฌ ์์ฝ
| SRP | ๋จ์ผ ์ฑ ์ ์์น | ํด๋์ค๋ ํ๋์ ๋ณ๊ฒฝ ์ด์ ๋ง ๊ฐ์ ธ์ผ ํ๋ค |
| OCP | ๊ฐ๋ฐฉ-ํ์ ์์น | ํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ๋ซํ ์์ด์ผ ํ๋ค |
| LSP | ๋ฆฌ์ค์ฝํ ์นํ ์์น | ํ์ ํด๋์ค๋ ์์ ํด๋์ค๋ฅผ ์๋ฒฝํ ๋์ฒดํด์ผ ํ๋ค |
| DIP | ์์กด ์ญ์ ์์น | ๊ตฌ์ฒด๊ฐ ์๋ ์ถ์์ ์์กดํด์ผ ํ๋ค |
| ISP | ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น | ํด๋ผ์ด์ธํธ ์ ์ฉ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๋ผ |