Search

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ๋ณด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€?

์‹ค์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์ด๋‚˜ ๊ฐœ๋…์„ ๊ฐ์ฒด๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

โ€ข
์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์Œ
โ€ข
์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•จ
โ€ข
๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ์ ํ•ฉ
โ€ข
์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‰ฌ์›€

๊ฐ์ฒด์ง€ํ–ฅ 4๋Œ€ ํŠน์ง•

1.
์บก์Šํ™”
2.
์ƒ์†
3.
๋‹คํ˜•์„ฑ
4.
์ถ”์ƒํ™”

1. ์บก์Šํ™” (Encapsulation)

๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ์™ธ๋ถ€์—์„œ์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ํ–‰์œ„๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ , ์‹ค์ œ ๊ตฌํ˜„ ๋‚ด์šฉ ์ผ๋ถ€๋ฅผ ์™ธ๋ถ€์— ๊ฐ์ถ”์–ด ์€๋‹‰ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ์˜ ์บก์Šํ™” ๊ตฌํ˜„

โ€ข
์ ‘๊ทผ ์ œ์–ด์ž (Access Modifier): private, protected, public, default๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
โ€ข
private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜: ํด๋ž˜์Šค์˜ ์†์„ฑ(ํ•„๋“œ)์„ private์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
โ€ข
Getter ๋ฉ”์„œ๋“œ: private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” public ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
public String getName() { return this.name; }
Java
๋ณต์‚ฌ
โ€ข
Setter ๋ฉ”์„œ๋“œ: private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” public ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.
public void setName(String name) { this.name = name; }
Java
๋ณต์‚ฌ
์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์ž˜๋ชป๋œ ๊ฐ’์ด ์„ค์ •๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ƒ์† (Inheritance)

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›์•„ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€, ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ์˜ ์ƒ์† ๊ตฌํ˜„

์ž๋ฐ”์—์„œ๋Š” extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ƒ์†์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
class Animal { void eat() { System.out.println("eating..."); } } class Dog extends Animal { void bark() { System.out.println("barking..."); } }
Java
๋ณต์‚ฌ

๋‹จ์ผ ์ƒ์†๊ณผ ๋‹ค์ค‘ ์ƒ์†

โ€ข
๋‹จ์ผ ์ƒ์†: ์ž๋ฐ”๋Š” ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ํด๋ž˜์Šค๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๋‹ค์ค‘ ์ƒ์†: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„(implement)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
interface Flyable { void fly(); } interface Swimmable { void swim(); } class Duck implements Flyable, Swimmable { public void fly() { System.out.println("flying..."); } public void swim() { System.out.println("swimming..."); } }
Java
๋ณต์‚ฌ
์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž๋ฐ”๋Š” ํด๋ž˜์Šค ์ƒ์†์˜ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์ค‘ ์ƒ์†์˜ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3. ๋‹คํ˜•์„ฑ (Polymorphism)

ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ (Method Overloading)

๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด๋‚˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } }
Java
๋ณต์‚ฌ

๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ (Method Overriding)

์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
class Animal { void makeSound() { System.out.println("Some sound"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("Woof woof!"); } }
Java
๋ณต์‚ฌ
์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์†Œ๋“œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์™€ ๋™์ผํ•œ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ถ”์ƒํ™” (Abstraction)

๋ณต์žกํ•œ ์ž๋ฃŒ, ๋ชจ๋“ˆ, ์‹œ์Šคํ…œ ๋“ฑ์œผ๋กœ๋ถ€ํ„ฐ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋… ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ„์ถ”๋ ค ๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ์˜ ์ถ”์ƒํ™” ๊ตฌํ˜„

โ€ข
์ถ”์ƒ ํด๋ž˜์Šค (Abstract Class): abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๋ฉฐ, ๊ตฌํ˜„๋ถ€๊ฐ€ ์—†๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
abstract class Animal { abstract void makeSound(); // ์ถ”์ƒ ๋ฉ”์†Œ๋“œ void eat() { // ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ System.out.println("eating..."); } }
Java
๋ณต์‚ฌ
โ€ข
์ธํ„ฐํŽ˜์ด์Šค (Interface): ์™„์ „ํ•œ ์ถ”์ƒํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
interface Vehicle { void start(); void stop(); void accelerate(); }
Java
๋ณต์‚ฌ
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
class Car implements Vehicle { public void start() { System.out.println("Car starting"); } public void stop() { System.out.println("Car stopping"); } public void accelerate() { System.out.println("Car accelerating"); } }
Java
๋ณต์‚ฌ
โ€ข
์ถ”์ƒํ™”์˜ ์žฅ์ :
โ€ข
๊ณตํ†ต๋œ ํŠน์„ฑ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋ณต์žก์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
โ€ข
๊ตฌํ˜„์˜ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ 5๋Œ€ ์›์น™ (SOLID)

์›์น™
์›์น™ ์ด๋ฆ„
ํ•ต์‹ฌ ๊ฐœ๋…
SRP
๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle)
ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•จ
OCP
๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle)
ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•จ
LSP
๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle)
ํ•˜์œ„ ํƒ€์ž…์€ ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ
ISP
์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle)
ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
DIP
์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)
์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•˜๋ฉฐ, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋จ

1. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle)

ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle)

์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle)

ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle)

ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

5. ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)

์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

SOLID ์›์น™์˜ ์ค‘์š”์„ฑ

SOLID ์›์น™์ด๋ž€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์ง€์ผœ์ค˜์•ผ ํ•  5๊ฐœ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์›์น™(SRP, OCP, LSP, ISP, DIP)์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ์›์น™๋“ค์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‹จ๊ณจ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์•ž์œผ๋กœ ๋ฐฐ์šฐ๊ฒŒ ๋  ์—ฌ๋Ÿฌ ๋””์ž์ธ ํŒจํ„ด(Design Pattern)๋“ค์˜ ๊ทผ๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์„ค๊ณ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ณธ๋ž˜ ์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด๋ž€ ๋ณ€ํ™”์— ๋Œ€์‘์„ ์ž˜ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์„ค๊ณ„๋ž€ ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ, ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ”์œ„๊ฐ€ ์ ์€ ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ‘์ž๊ธฐ ๊ณ ๊ฐ์‚ฌ๊ฐ€ ๊ธฐํš์— ์—†๋Š” ์ถ”๊ฐ€์ ์ธ ์š”์ฒญ์„ ํ•˜๋ฉด, ๋น„๋ก ์–ด๋ ค์›€์ด ์žˆ๋”๋ผ๋„ ๊ฒฐ๊ตญ ๊ตฌํ˜„์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™”์— ํฐ ์• ๋กœ์‚ฌํ•ญ ์—†์ด ์ž˜ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„  ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๊ทผ๊ฐ„์ด ํƒ„ํƒ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SOLID ์›์น™์˜ ์ด์ 

โ€ข
์ฝ”๋“œ ํ™•์žฅ์„ฑ ํ–ฅ์ƒ: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด์„ฑ: ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ํŠน์ • ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•  ๋•Œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข
๋ณต์žก์„ฑ ๊ฐ์†Œ: ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•ด ์ฝ”๋“œ๋ฅผ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
โ€ข
๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ: ๋ฆฌํŒฉํ† ๋ง์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ž„์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

๊ฐ ์›์น™ ์ƒ์„ธ ์„ค๋ช…

1. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP)

ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ์˜ค์ง ํ•˜๋‚˜๋ฟ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: ์‚ฌ์šฉ์ž ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž ์ •๋ณด ๊ด€๋ฆฌ๋งŒ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋ฉฐ ๋กœ๊น…์ด๋‚˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๊ฐ™์€ ๋‹ค๋ฅธ ์ฑ…์ž„์€ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (OCP)

์†Œํ”„ํŠธ์›จ์–ด ์—”ํ‹ฐํ‹ฐ(ํด๋ž˜์Šค, ๋ชจ๋“ˆ, ํ•จ์ˆ˜ ๋“ฑ)๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ, ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์ถ”์ƒํ™”์™€ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

3. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (LSP)

์ƒ์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์ด ๊นจ์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํ–‰๋™ ๊ทœ์•ฝ์„ ๋ชจ๋‘ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง์‚ฌ๊ฐํ˜•์„ ์ƒ์†๋ฐ›์€ ์ •์‚ฌ๊ฐํ˜• ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ง์‚ฌ๊ฐํ˜•์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์‚ฌ๊ฐํ˜•์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (ISP)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํฐ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

5. ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (DIP)

๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์ ์šฉ ์‚ฌ๋ก€

// ๋‚˜์œ ์˜ˆ: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์œ„๋ฐ˜ class User { private String name; private String email; // ์‚ฌ์šฉ์ž ์ •๋ณด ๊ด€๋ จ ๋ฉ”์†Œ๋“œ public void saveUser() { /* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ */ } // ์ด๋ฉ”์ผ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ (๋‹ค๋ฅธ ์ฑ…์ž„) public void sendEmail(String message) { /* ์ด๋ฉ”์ผ ์ „์†ก */ } } // ์ข‹์€ ์˜ˆ: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ค€์ˆ˜ class User { private String name; private String email; // ์‚ฌ์šฉ์ž ์ •๋ณด ๊ด€๋ จ ๋ฉ”์†Œ๋“œ๋งŒ ํฌํ•จ public void saveUser() { /* ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ */ } } class EmailService { // ์ด๋ฉ”์ผ ๊ด€๋ จ ๊ธฐ๋Šฅ๋งŒ ๋‹ด๋‹น public void sendEmail(User user, String message) { /* ์ด๋ฉ”์ผ ์ „์†ก */ } }
Java
๋ณต์‚ฌ
SOLID ์›์น™์€ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ์ด ์›์น™๋“ค์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๋ฉด ๋” ๋‚˜์€ ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.