๐Ÿ”— ๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์˜ ๋น„๋ฐ€, ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ํ™ฉ๊ธˆ๋ฅ ! ๐Ÿค

์„ํ˜„ยท2025๋…„ 1์›” 27์ผ
0

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
13/43
post-thumbnail

์™œ ๊ฐ‘์ž๊ธฐ "์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„"์ผ๊นŒ?

์˜ค๋Š˜์€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋‹ค๊ฐ€ ํŒ€์›๊ณผ ์„ค๊ณ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋˜ ์ค‘, "์‘์ง‘๋„(Cohesion)"์™€ "๊ฒฐํ•ฉ๋„(Coupling)"๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ์ž์ฃผ ์–ธ๊ธ‰๋˜์ง€๋งŒ, ๊ทธ ์˜๋ฏธ๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์˜์™ธ๋กœ ์ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ €๋„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜๊ณ , ์ด ๊ฐœ๋…์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์„ค๊ณ„์˜ ํ•ต์‹ฌ์€ "๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ"์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด ๋ฐ”๋กœ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„์ž…๋‹ˆ๋‹ค. ์ž, ์ด์ œ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ด…์‹œ๋‹ค!


๐Ÿงฉ ์‘์ง‘๋„(Cohesion): ๋ชจ๋“ˆ์˜ ๋‹จ๋‹จํ•จ

์‘์ง‘๋„๋Š” ๋ชจ๋“ˆ ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ด ์–ผ๋งˆ๋‚˜ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ์ธก์ •ํ•˜๋Š” ์ฒ™๋„์ž…๋‹ˆ๋‹ค. ๋†’์€ ์‘์ง‘๋„๋Š” ๋ชจ๋“ˆ์ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(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() {
        // ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ Œ๋”๋ง (๋ถˆํ•„์š”ํ•œ ์ฑ…์ž„)
    }
}
  • ์ธ์ฆ ๋ชจ๋“ˆ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ UI ๋ Œ๋”๋ง ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ์ฑ…์ž„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”— ๊ฒฐํ•ฉ๋„(Coupling): ๋ชจ๋“ˆ ๊ฐ„ ์œ ์—ฐํ•จ

๊ฒฐํ•ฉ๋„๋Š” ํ•œ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์–ผ๋งˆ๋‚˜ ์˜์กด์ ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ๋ชจ๋“ˆ ๊ฐ„ ๋…๋ฆฝ์„ฑ์ด ๋†’์•„์ง€๊ณ , ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์˜ ์˜ˆ์‹œ

// ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ ์„ค๊ณ„
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์œผ๋กœ ์„ ์–ธ๋˜์–ด ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณดํ˜ธํ•˜๋ฉด์„œ๋„ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์ข‹์€ ์„ค๊ณ„์˜ ์ง€ํ‘œ

  1. ๋†’์€ ์‘์ง‘๋„: ๊ฐ ๋ชจ๋“ˆ์ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฆ„.
  2. ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„: ๋ชจ๋“ˆ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์ตœ์†Œํ™”.

์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์‹ค์ฒœํ•˜๋ฉด, ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์œ :

๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์˜ ์„ค๊ณ„๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ์ž์˜ ์—ญํ• ์„ ์ž˜ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์ˆœ๊ฐ„ ํ˜‘๋ ฅํ•˜๋Š” ๋“œ๋ฆผํŒ€๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๐Ÿ“š ์ถ”๊ฐ€ ํ•™์Šต ์ž๋ฃŒ


0๊ฐœ์˜ ๋Œ“๊ธ€