๐ŸŽฏ SOLID ์›์น™ ํ•œ๋ฐฉ ์ •๋ฆฌ + ์‹ค๋ฌด ์ ์šฉ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์‹œ

์—…๋ฐ์ดํŠธ:
3 ๋ถ„ ์†Œ์š”

๐ŸŽฏ SOLID ์›์น™ ํ•œ๋ฐฉ ์ •๋ฆฌ + ์‹ค๋ฌด ์ ์šฉ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์‹œ


๐Ÿ“Œ SOLID๋ž€?

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๋Œ€ ์›์น™
์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.
Solid ์›์น™์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • Single Responsibility Principle
  • Open-Closed Principle
  • Liskov Substitution Principle
  • Interface Segregation Principle
  • Dependency Inversion Principle

1๏ธโƒฃ SRP - ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

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

๐Ÿ”ง ๋ฆฌํŒฉํ† ๋ง ์ „

class UserService {
    public void registerUser() {
        // ํšŒ์›๊ฐ€์ž… ๋กœ์ง
    }

    public void sendWelcomeEmail() {
        // ์ด๋ฉ”์ผ ์ „์†ก ๋กœ์ง
    }
}

โžก ํšŒ์› ๊ฐ€์ž…๊ณผ ์ด๋ฉ”์ผ ์ „์†ก์ด ๋™์‹œ์— ์ฑ…์ž„์ง€๊ณ  ์žˆ์Œ

โœ… ๋ฆฌํŒฉํ† ๋ง ํ›„

class UserService {
    private EmailService emailService;

    public void registerUser() {
        // ํšŒ์›๊ฐ€์ž… ๋กœ์ง
        emailService.sendWelcomeEmail();
    }
}

class EmailService {
    public void sendWelcomeEmail() {
        // ์ด๋ฉ”์ผ ์ „์†ก
    }
}

โžก ๊ฐ๊ฐ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋ณ€๊ฒฝ ํฌ์ธํŠธ๊ฐ€ ์ค„์–ด๋“ฆ


2๏ธโƒฃ OCP - ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™

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

๐Ÿ”ง ๋ฆฌํŒฉํ† ๋ง ์ „

class DiscountService {
    public int calculateDiscount(String grade, int price) {
        if (grade.equals("VIP")) return price - 1000;
        else return price - 500;
    }
}

โžก ๋“ฑ๊ธ‰์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค if-else ์ˆ˜์ • ํ•„์š”

โœ… ๋ฆฌํŒฉํ† ๋ง ํ›„

interface DiscountPolicy {
    int discount(int price);
}

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

class BasicDiscount implements DiscountPolicy {
    public int discount(int price) {
        return price - 500;
    }
}

class DiscountService {
    public int calculate(DiscountPolicy policy, int price) {
        return policy.discount(price);
    }
}

โžก ์ƒˆ๋กœ์šด ์ •์ฑ… ์ถ”๊ฐ€ ์‹œ ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ


3๏ธโƒฃ LSP - ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

์ž์‹ ํด๋ž˜์Šค๋Š” ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค

๐Ÿ”ง ๋ฆฌํŒฉํ† ๋ง ์ „

class Rectangle {
    protected int width, height;

    public void setWidth(int w) { width = w; }
    public void setHeight(int h) { height = h; }

    public int getArea() { return width * height; }
}

class Square extends Rectangle {
    @Override
    public void setWidth(int w) {
        width = height = w;
    }

    @Override
    public void setHeight(int h) {
        width = height = h;
    }
}

โžก Square๋Š” Rectangle์˜ ๊ธฐ๋Œ€ ๋™์ž‘์„ ๊นจํŠธ๋ฆผ

โœ… ๋ฆฌํŒฉํ† ๋ง ํ›„

interface Shape {
    int getArea();
}

class Rectangle implements Shape {
    private int width, height;

    Rectangle(int w, int h) {
        this.width = w;
        this.height = h;
    }

    public int getArea() {
        return width * height;
    }
}

class Square implements Shape {
    private int side;

    Square(int s) {
        this.side = s;
    }

    public int getArea() {
        return side * side;
    }
}

โžก ๋” ์ด์ƒ Rectangle์— ์–ต์ง€ ์ƒ์†ํ•˜์ง€ ์•Š๊ณ , ์—ญํ• ๋งŒ ๊ณต์œ 


4๏ธโƒฃ ISP - ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

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

๐Ÿ”ง ๋ฆฌํŒฉํ† ๋ง ์ „

interface Animal {
    void fly();
    void walk();
}

class Dog implements Animal {
    public void fly() {
        // ์•„๋ฌด ๋™์ž‘ ์•ˆํ•จ
    }

    public void walk() {
        // ๊ฑท๊ธฐ
    }
}

โžก Dog๋Š” fly()๋ฅผ ์“ธ ์ผ์ด ์—†์Œ์—๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ

โœ… ๋ฆฌํŒฉํ† ๋ง ํ›„

interface Walkable {
    void walk();
}

interface Flyable {
    void fly();
}

class Dog implements Walkable {
    public void walk() {
        // ๊ฑท๊ธฐ
    }
}

โžก ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ถ„๋ฆฌ


5๏ธโƒฃ DIP - ์˜์กด์„ฑ ์—ญ์ „ ์›์น™

์ƒ์œ„ ๋ชจ๋“ˆ์€ ํ•˜์œ„ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค

๐Ÿ”ง ๋ฆฌํŒฉํ† ๋ง ์ „

class MySQLRepository {
    public void save() {
        // DB ์ €์žฅ
    }
}

class UserService {
    private MySQLRepository repo = new MySQLRepository();

    public void register() {
        repo.save();
    }
}

โžก ๊ตฌํ˜„์ฒด์— ์ง์ ‘ ์˜์กด โ†’ ๊ต์ฒด, ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€

โœ… ๋ฆฌํŒฉํ† ๋ง ํ›„

interface Repository {
    void save();
}

class MySQLRepository implements Repository {
    public void save() {
        // DB ์ €์žฅ
    }
}

class UserService {
    private final Repository repo;

    public UserService(Repository repo) {
        this.repo = repo;
    }

    public void register() {
        repo.save();
    }
}

โžก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž… โ†’ ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€


๐Ÿ’ก SOLID ํ•œ์ค„ ์•”๊ธฐ ํŒ

๐ŸŸ ์†Œ์˜ค๋ฆฌ์ธํ„ฐ์—ญ
โ†’ ๋‹จ์ผ ์ฑ…์ž„, ๊ฐœ๋ฐฉ ํ์‡„, ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜, ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ, ์˜์กด์„ฑ ์—ญ์ „

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

์›์น™ ํ•ต์‹ฌ ๋ชฉ์ 
SRP ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€์ž
OCP ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ ํ™•์žฅ
LSP ์ž์‹์€ ๋ถ€๋ชจ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
ISP ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž‘๊ฒŒ ์ชผ๊ฐœ์ž
DIP ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ์ถ”์ƒํ™”์— ์˜์กดํ•˜์ž

ํƒœ๊ทธ: , , , , , , , ,

์นดํ…Œ๊ณ ๋ฆฌ: , ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ