[CS] SOLID ์›์น™

๋ฐ•์›์ค€ยท2025๋…„ 6์›” 9์ผ

๐Ÿ’ก ์ง๋ฌด ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” SOLID ์›์น™

โœ… SOLID ์›์น™์ด๋ž€?

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

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์€ ์‹ค์ œ ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์„ ๋ชจ๋ธ๋งํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด์—์„œ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์ธ SOLID๋Š” ์ด๋Ÿฌํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” SOLID๋Š” ๋‹ค์Œ ๋‹ค์„ฏ ๊ฐ€์ง€ ์›์น™์˜ ์•ฝ์–ด์ž…๋‹ˆ๋‹ค:

  • S: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle)

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

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

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

  • D: ์˜์กด ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)

โœ… SOLID ์›์น™์€ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.


๐Ÿ“˜ ๊ฐ ์›์น™ ์š”์•ฝ + ์˜ˆ์‹œ

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

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

๐Ÿ“Œ ์˜ˆ์‹œ (Java)

// Bad Example
class UserService {
    void registerUser(User user) { ... }
    void sendEmail(User user) { ... } // ์—ญํ• ์ด ์„ž์ž„
}

// Good Example
class UserService {
    void registerUser(User user) { ... }
}

class EmailService {
    void sendEmail(User user) { ... }
}

๐Ÿ’ฅ ์œ„๋ฐ˜ ์‹œ ๋ฌธ์ œ์ 

  • ์—ฌ๋Ÿฌ ๋ณ€๊ฒฝ ์ด์œ ๊ฐ€ ์ƒ๊ธฐ๋ฏ€๋กœ ์ˆ˜์ • ์‹œ ์—ฐ์‡„์ ์ธ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€

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

ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ

interface DiscountPolicy {
    int discount(int price);
}

class FixDiscountPolicy implements DiscountPolicy {
    public int discount(int price) {
        return price - 1000;
    }
}

class OrderService {
    private DiscountPolicy discountPolicy;

    public OrderService(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

    public void order(int price) {
        int finalPrice = discountPolicy.discount(price);
        // ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋กœ์ง
    }
}

๐Ÿ’ฅ ์œ„๋ฐ˜ ์‹œ ๋ฌธ์ œ์ 

  • ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์•ˆ์ •์„ฑ์ด ๋‚ฎ์Œ

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

ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํ–‰์œ„๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ

class Bird {
    void fly() {}
}

class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException(); // ๋‚  ์ˆ˜ ์—†์Œ
    }
}

๐Ÿ’ฅ ์œ„๋ฐ˜ ์‹œ ๋ฌธ์ œ์ 

  • ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ โ†’ ๋‹คํ˜•์„ฑ ๊นจ์ง

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

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ

// Bad Interface
interface Machine {
    void print();
    void scan();
    void fax();
}

// Good Interfaces
interface Printer {
    void print();
}

interface Scanner {
    void scan();
}

๐Ÿ’ฅ ์œ„๋ฐ˜ ์‹œ ๋ฌธ์ œ์ 

  • ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๊ฐ•์ œ โ†’ ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€

5. ๐Ÿ”น ์˜์กด ์—ญ์ „ ์›์น™ (DIP)

๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋˜๋ฉฐ, ๋‘˜ ๋‹ค ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ

// ๋‚˜์œ ์˜ˆ
class MySQLDatabase {
    void connect() { ... }
}

class UserService {
    private MySQLDatabase db = new MySQLDatabase(); // ์ง์ ‘ ์˜์กด
}
// ์ข‹์€ ์˜ˆ
interface Database {
    void connect();
}

class MySQLDatabase implements Database {
    public void connect() { ... }
}

class UserService {
    private Database db;

    public UserService(Database db) {
        this.db = db;
    }
}

๐Ÿ’ฅ ์œ„๋ฐ˜ ์‹œ ๋ฌธ์ œ์ 

  • ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ๊นŒ์ง€ ์ˆ˜์ •ํ•ด์•ผ ํ•จ

๐Ÿ“Œ SOLID ์›์น™์„ ์ง€์ผœ์•ผ ํ•˜๋Š” ์ด์œ 

  • โœ… ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
  • โœ… ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•œ ์„ค๊ณ„ ๊ฐ€๋Šฅ
  • โœ… ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ๊ฐ์†Œ
  • โœ… ์œ ๋‹› ํ…Œ์ŠคํŠธ ์šฉ์ด

๐Ÿง  ๋ฉด์ ‘ TIP

  • ๊ฐ ์›์น™์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์ˆ™์ง€ํ•˜์ž
  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ์›์น™์„ ์ ์šฉํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์‚ฐ์ 

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