์ค๋์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ค๊ฐ ํ์๊ณผ ์ค๊ณ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ ์ค, "์์ง๋(Cohesion)"์ "๊ฒฐํฉ๋(Coupling)"๋ผ๋ ์ฉ์ด๊ฐ ๋์์ต๋๋ค. ์ฌ์ค ์ํํธ์จ์ด ์ค๊ณ์์ ์์ฃผ ์ธ๊ธ๋์ง๋ง, ๊ทธ ์๋ฏธ๋ฅผ ์ ํํ ์๊ณ ์๋ ์ฌ๋์ ์์ธ๋ก ์ ์ต๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธฐํ์ ์ ๋ ๋ค์ ํ๋ฒ ์ ๋ฆฌํ๊ณ , ์ด ๊ฐ๋ ์ ๋ณด๋ค ์ฝ๊ฒ ์ค๋ช ํ๋ ค ํฉ๋๋ค.
์ค๊ณ์ ํต์ฌ์ "๋ณ๊ฒฝ์ ์ ์ฐํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ์ฝ๋"์ ๋๋ค. ์ด๋ฅผ ์คํํ๊ธฐ ์ํด ๊ผญ ์์์ผ ํ ๊ฒ์ด ๋ฐ๋ก ์์ง๋์ ๊ฒฐํฉ๋์ ๋๋ค. ์, ์ด์ ์ฐจ๊ทผ์ฐจ๊ทผ ์์๋ด ์๋ค!
์์ง๋๋ ๋ชจ๋ ๋ด ๊ตฌ์ฑ ์์๋ค์ด ์ผ๋ง๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์๋์ง๋ฅผ ์ธก์ ํ๋ ์ฒ๋์ ๋๋ค. ๋์ ์์ง๋๋ ๋ชจ๋์ด ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle, SRP)์ ์ ๋ฐ๋ฅด๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์์ง๋๊ฐ ๋์์๋ก ๋ชจ๋์ ๋ช ํํ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ณ๊ฒฝ ์ ๋ค๋ฅธ ๋ชจ๋์ ๋ฏธ์น๋ ์ํฅ์ด ์ค์ด๋ญ๋๋ค.
// ๋์ ์์ง๋๋ฅผ ๊ฐ์ง UserAuthentication ๋ชจ๋
public class UserAuthentication {
public boolean login(String username, String password) {
// ๋ก๊ทธ์ธ ๋ก์ง
return true;
}
public void logout() {
// ๋ก๊ทธ์์ ๋ก์ง
}
public boolean register(String username, String password) {
// ํ์๊ฐ์
๋ก์ง
return true;
}
}
// ๋ฎ์ ์์ง๋๋ฅผ ๊ฐ์ง ํด๋์ค
public class UserModule {
public boolean login(String username, String password) {
// ๋ก๊ทธ์ธ ๋ก์ง
return true;
}
public void connectToDatabase() {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ก์ง (๋ถํ์ํ ์ฑ
์)
}
public void renderUI() {
// ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋ ๋๋ง (๋ถํ์ํ ์ฑ
์)
}
}
๊ฒฐํฉ๋๋ ํ ๋ชจ๋์ด ๋ค๋ฅธ ๋ชจ๋์ ์ผ๋ง๋ ์์กด์ ์ธ์ง๋ฅผ ๋ํ๋ ๋๋ค. ๊ฒฐํฉ๋๊ฐ ๋ฎ์์๋ก ๋ชจ๋ ๊ฐ ๋ ๋ฆฝ์ฑ์ด ๋์์ง๊ณ , ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ํฅ ๋ฒ์๊ฐ ์ค์ด๋ญ๋๋ค.
// ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ๋ฎ์ ๊ฒฐํฉ๋ ์ค๊ณ
public interface PaymentProcessor {
void processPayment(double amount);
}
public class CreditCardProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
// ์ ์ฉ์นด๋ ๊ฒฐ์ ์ฒ๋ฆฌ ๋ก์ง
}
}
public class OrderService {
private PaymentProcessor paymentProcessor;
public OrderService(PaymentProcessor paymentProcessor) {
this.paymentProcessor = paymentProcessor;
}
public void placeOrder(double amount) {
paymentProcessor.processPayment(amount);
}
}
OrderService
๋ PaymentProcessor
์ธํฐํ์ด์ค์ ์์กดํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด์๋ ์์กดํ์ง ์์ต๋๋ค.// ํน์ ํด๋์ค์ ์ง์ ์์กดํ๋ ๋์ ๊ฒฐํฉ๋ ์ค๊ณ
public class OrderService {
private CreditCardProcessor creditCardProcessor = new CreditCardProcessor();
public void placeOrder(double amount) {
creditCardProcessor.processPayment(amount);
}
}
OrderService
๊ฐ CreditCardProcessor
ํด๋์ค์ ์ง์ ์์กดํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๊ฒฐ์ ํ๋ก์ธ์๋ฅผ ๋์
ํ๋ ค๋ฉด ์์ ๋ฒ์๊ฐ ์ปค์ง๋๋ค.์บก์ํ๋ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ์จ๊ธฐ๊ณ , ํ์ํ ์ธํฐํ์ด์ค๋ง ๋ ธ์ถํ์ฌ ๋ด๋ถ ๊ตฌํ ๋ณ๊ฒฝ์ ์ํฅ์ ์ต์ํํ๋ ์์น์ ๋๋ค. ์บก์ํ๋ฅผ ์ ์ ์ฉํ๋ฉด ์์ง๋๋ฅผ ๋์ด๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค.
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}
}
balance
ํ๋๋ private
์ผ๋ก ์ ์ธ๋์ด ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ด๋ถ ๊ตฌํ์ ๋ณดํธํ๋ฉด์๋ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.์ด ๋ ๊ฐ์ง๋ฅผ ์ค์ฒํ๋ฉด, ๋ณ๊ฒฝ์ ์ ์ฐํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋์ ์ค๊ณ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์์ ์ญํ ์ ์ ์ํํ๋ฉด์ ํ์ํ ์๊ฐ ํ๋ ฅํ๋ ๋๋ฆผํ๊ณผ ๊ฐ์ต๋๋ค.