🎯 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 κ΅¬ν˜„μ΄ μ•„λ‹ˆλΌ 좔상화에 μ˜μ‘΄ν•˜μž

νƒœκ·Έ: , , , , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°