๐ฆ ์์ง๋, ๊ฒฐํฉ๋, ์บก์ํ - ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ ์ ๋๋ก ์ดํดํ๊ธฐ
โ ๊ฐ๋ ์์ฝ
์ฉ์ด | ์ ์ |
---|---|
์์ง๋(Cohesion) | ๋ชจ๋ ๋ด๋ถ ๊ตฌ์ฑ ์์๋ผ๋ฆฌ ์๋ก ๊ด๋ จ๋ ์ ๋ |
๊ฒฐํฉ๋(Coupling) | ํ ๋ชจ๋์ด ๋ค๋ฅธ ๋ชจ๋์ ์ผ๋ง๋ ์์กดํ๊ณ ์๋์ง |
์บก์ํ(Encapsulation) | ๊ฐ์ฒด ๋ด๋ถ ์ํ/๋ก์ง์ ์ธ๋ถ๋ก๋ถํฐ ์จ๊ธฐ๋ ๊ฒ |
๐ฏ ์ข์ ์ค๊ณ๋?
์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ค๊ณ๋ ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ์ ๋๋ค.
- ์์ง๋ โ: ๋ชจ๋ ๋ด๋ถ๊ฐ ํ๋์ ์ฑ ์์ ์ง์ค โ ๋ณ๊ฒฝ์ ๊ฐํ ์ฝ๋
- ๊ฒฐํฉ๋ โ: ๋ค๋ฅธ ๋ชจ๋๊ณผ ์ฝํ์ง ์์ โ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์ โ
- ์บก์ํ โ: ๋ด๋ถ ๊ตฌํ์ ์จ๊น โ ๊ฒฐํฉ๋ ๊ฐ์์ ๊ธฐ์ฌ
๐ก ์์ 1: ์์ง๋๊ฐ ๋ฎ์ ํด๋์ค
public class EmployeeManager {
public void calculateSalary() {
// ๊ธ์ฌ ๊ณ์ฐ ๋ก์ง
}
public void sendEmailToCustomer() {
// ๊ณ ๊ฐ์๊ฒ ์ด๋ฉ์ผ ๋ณด๋ด๋ ๋ก์ง
}
public void printMonthlyReport() {
// ์๊ฐ ๋ณด๊ณ ์ ์ถ๋ ฅ
}
}
โ ๋ฌธ์ ์
- ํ๋์ ํด๋์ค๊ฐ ๋๋ฌด ๋ง์ ์ฑ ์์ ๊ฐ์ง
- ๊ธ์ฌ, ์ด๋ฉ์ผ, ๋ณด๊ณ ์ ์ถ๋ ฅ์ ์ฐ๊ด์ฑ ๋ฎ์ ์์
- ์์ง๋๊ฐ ๋ฎ์ โ ๋ณ๊ฒฝ ์ ์๋ก ์ํฅ์ ์ค ๊ฐ๋ฅ์ฑ
โ ๊ฐ์ : ์์ง๋ ๋์ ๊ตฌ์กฐ
public class PayrollService {
public void calculateSalary() {
// ๊ธ์ฌ ๊ด๋ จ ์ฑ
์๋ง ์ํ
}
}
public class EmailService {
public void sendEmailToCustomer() {
// ์ด๋ฉ์ผ ์ ์ก๋ง ์ํ
}
}
public class ReportPrinter {
public void printMonthlyReport() {
// ๋ณด๊ณ ์ ์ถ๋ ฅ๋ง ์ํ
}
}
- ๊ฐ๊ฐ์ ํด๋์ค๋ ๋จ์ผ ์ฑ ์(SRP) ์ ์ถฉ์ค
- ๋ด๋ถ ์์๋ค๋ผ๋ฆฌ ๊ด๋ จ ์๊ณ ์์ง๋ ฅ์ด ๋์
๐ก ์์ 2: ๊ฒฐํฉ๋๊ฐ ๋์ ๊ตฌ์กฐ
public class OrderService {
private UserService userService = new UserService(); // ์ง์ ์์ฑ
public void placeOrder() {
userService.checkUserStatus();
// ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง
}
}
โ ๋ฌธ์ ์
OrderService
๋UserService
์ ๊ตฌ์ฒด์ ์ธ ์์ฑ ๋ฐฉ์๊น์ง ์๊ณ ์์UserService
๋ฅผ ๊ต์ฒดํ๋ ค๋ฉดOrderService
๋ ํจ๊ป ์์ ํ์
โ ๊ฐ์ : ๋ฎ์ ๊ฒฐํฉ๋ (์์กด์ฑ ์ฃผ์ ํ์ฉ)
public class OrderService {
private final UserService userService;
public OrderService(UserService userService) {
this.userService = userService;
}
public void placeOrder() {
userService.checkUserStatus();
}
}
OrderService
๋UserService
์ ๊ตฌ์ฒด ๊ตฌํ์ ๋ชฐ๋ผ๋ ๋จ- ์์กด์ฑ ์ญ์ (DIP) โ ๊ฒฐํฉ๋ ๋ฎ์์ง โ ํ ์คํธ๋ ๋ณ๊ฒฝ์ด ์ฌ์
๐งช ์์ 3: ์บก์ํ๊ฐ ์ฝํ ๊ฐ์ฒด
public class BankAccount {
public int balance;
public void deposit(int amount) {
balance += amount;
}
}
โ ๋ฌธ์ ์
- ์ธ๋ถ์์
balance
๋ฅผ ์ง์ ๋ณ๊ฒฝ ๊ฐ๋ฅ โ ๋ฌด๊ฒฐ์ฑ ๊นจ์ง ์ ์์
BankAccount account = new BankAccount();
account.balance = -1000; // ์๋์น ์์ ์ํ
โ ์บก์ํ ๊ฐํ: ์ ๊ทผ ์ ์ด์ ํ์ฉ
public class BankAccount {
private int balance;
public void deposit(int amount) {
if (amount <= 0) throw new IllegalArgumentException();
balance += amount;
}
public int getBalance() {
return balance;
}
}
- ๋ด๋ถ ์ํ๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์์
- ๋ฉ์๋๋ก๋ง ์กฐ์ โ ์ํ ์์ ์ฑ ๋ณด์ฅ
- ์บก์ํ๋ฅผ ํตํด ๊ฒฐํฉ๋ ๊ฐ์ + ์์ง๋ ์ฆ๊ฐ
๐ ์์ฝ ๋น๊ต
๊ธฐ์ค | ์ข์ง ์์ ์ค๊ณ | ์ข์ ์ค๊ณ |
---|---|---|
์์ง๋ | ์ฌ๋ฌ ์ฑ ์ ํผํฉ๋ ํด๋์ค | ํ๋์ ์ฑ ์์ ์ง์ค |
๊ฒฐํฉ๋ | ๊ตฌ์ฒด ํด๋์ค์ ์์กด | ์ถ์ํ, DI๋ก ๋ถ๋ฆฌ |
์บก์ํ | ํ๋ ์ง์ ์ ๊ทผ ํ์ฉ | ์ํ ์๋, ๋ฉ์๋ ์ ๊ณต |
โ ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
-
์ข์ ์ค๊ณ๋ ์บก์ํ๋ฅผ ํตํด ๋ด๋ถ ๊ตฌํ์ ์จ๊ธฐ๊ณ ,
์์ง๋๋ ๋์ด๊ณ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๋ ๊ฒ์ ๋๋ค. -
์ด๋ฅผ ํตํด ์์คํ ์ ๋ณ๊ฒฝ์ ๊ฐํ๊ณ ,
์ ์ง๋ณด์๊ฐ ์ฌ์ฐ๋ฉฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ