ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐ŸŽฏ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋” ์ง๊ด€์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

ํด๋ž˜์Šค : ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ‹€(์„ค๊ณ„๋„)

๊ฐ์ฒด: ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ์‹ค์ฒด(Instance)๋กœ, ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜์–ด ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ๋‹จ์œ„

  ํด๋ž˜์Šค ๊ฐ์ฒด
์ •์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‹€ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ์‹ค์ฒด
๋ฉ”๋ชจ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜์ง€ ์•Š์Œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋จ
์—ญํ•  ์†์„ฑ๊ณผ ๋™์ž‘์„ ์ •์˜ ์†์„ฑ๊ณผ ๋™์ž‘์„ ์‹ค์ œ๋กœ ๊ฐ€์ง
์˜ˆ์ œ Car ํด๋ž˜์Šค myCar = new Car("Hyundai", 100);

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๊ณ„๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

 

  • ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ์ •์˜ํ•œ ํ›„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ
  • ํด๋ž˜์Šค ํ•˜๋‚˜๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง
class Dog {
    String name;
    
    Dog(String name) {
        this.name = name;
    }
    
    void bark() {
        System.out.println(name + "๊ฐ€ ๋ฉ๋ฉ ์ง–๋Š”๋‹ค");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog1 = new Dog("๋ฐ”๋‘‘์ด");
        Dog dog2 = new Dog("์ฝ”์ฝ”");

        dog1.bark(); // ๋ฐ”๋‘‘์ด๊ฐ€ ๋ฉ๋ฉ ์ง–๋Š”๋‹ค
        dog2.bark(); // ์ฝ”์ฝ”๊ฐ€ ๋ฉ๋ฉ ์ง–๋Š”๋‹ค
    }
}

 

 

 

๐ŸŽฏ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 4๊ฐ€์ง€ ํŠน์ง• 

1๏ธโƒฃ ์บก์Аํ™”(Encapsulation)

๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ํ–‰๋™์„ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ  ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

private ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์€๋‹‰ ํ›„, getter/setter๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋ฉด์„œ, deposit()๊ณผ withdraw() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

class BankAccount {
    private double balance; // ๊ณ„์ขŒ ์ž”์•ก (private์œผ๋กœ ๋ณดํ˜ธ)

    public BankAccount(double balance) {
        this.balance = balance;
    }

    // getter
    public double getBalance() {
        return balance;
    }

    // setter (์•ˆ์ „ํ•œ ์ž…์ถœ๊ธˆ์„ ์œ„ํ•ด)
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000);
        account.deposit(500);
        account.withdraw(300);
        System.out.println(account.getBalance()); // 1200.0
    }
}

 

 

2๏ธโƒฃ ์ƒ์†(Inheritance)

๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” Dog ํด๋ž˜์Šค๊ฐ€ Animal ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ makeSound()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

class Animal {
    void makeSound() {
        System.out.println("๊ฐ•์ฅ๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
        dog.bark(); // ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
    }
}

 

 

3๏ธโƒฃ ๋‹คํ˜•์„ฑ(Polymorphism)

ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋‚˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๊ฐ์ฒด ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading), ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ๋Š” Animal ํƒ€์ž… ๋ณ€์ˆ˜์— Cat ๊ฐ์ฒด๋ฅผ ๋„ฃ์—ˆ์ง€๋งŒ, makeSound()๊ฐ€ Cat ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์ ์šฉ๋œ ๊ฒƒ์ด๋‹ค.

class Animal {
    void makeSound() {
        System.out.println("๋ƒฅ์ด๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("์•ผ์˜น!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Cat(); // ๋‹คํ˜•์„ฑ ์ ์šฉ
        myAnimal.makeSound(); // "์•ผ์˜น!" ์ถœ๋ ฅ (Cat์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)
    }
}

 

 

4๏ธโƒฃ ์ถ”์ƒํ™”(Abstraction)

๋ถˆํ•„์š”ํ•œ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ณ  ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

abstract class Animal {
    abstract void makeSound(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๊ตฌํ˜„ X)
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound(); // "๋ฉ๋ฉ!" ์ถœ๋ ฅ
    }
}

 

 

 

 

๐ŸŽฏ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 5๊ฐ€์ง€ ์›์น™

SOLID ์›์น™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ 5๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™์ด๋‹ค.
์ด ์›์น™์„ ๋”ฐ๋ฅด๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์—ฌ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

1๏ธโƒฃ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP: Single Responsibility Principle)

ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์ด์œ ๋„ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ์€ SRP์›์น™์„ ์œ„๋ฐ˜ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

ReportManager ํด๋ž˜์Šค๊ฐ€ ๋ณด๊ณ ์„œ ์ƒ์„ฑ, ์ถœ๋ ฅ, ์ €์žฅ๊นŒ์ง€ ๋ชจ๋“  ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

class ReportManager {
    public void generateReport() {
        // ๋ณด๊ณ ์„œ ์ƒ์„ฑ ๋กœ์ง
    }

    public void printReport() {
        // ๋ณด๊ณ ์„œ ์ถœ๋ ฅ ๋กœ์ง (ํ”„๋ฆฐํ„ฐ ๊ด€๋ จ)
    }

    public void saveToFile() {
        // ํŒŒ์ผ ์ €์žฅ ๋กœ์ง
    }
}

 

๋‹ค์Œ์ฒ˜๋Ÿผ ๊ฐ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• (์ฑ…์ž„)๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•  ๋•Œ SRP๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค.

class ReportGenerator {
    public void generateReport() {
        // ๋ณด๊ณ ์„œ ์ƒ์„ฑ ๋กœ์ง
    }
}

class ReportPrinter {
    public void printReport() {
        // ๋ณด๊ณ ์„œ ์ถœ๋ ฅ ๋กœ์ง
    }
}

class ReportSaver {
    public void saveToFile() {
        // ํŒŒ์ผ ์ €์žฅ ๋กœ์ง
    }
}

 

 

2๏ธโƒฃ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (OCP: Open-Closed Principle)

์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋‹ค์Œ์€ OCP๋ฅผ ์œ„๋ฐ˜ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

๊ฒฐ์ œ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค if-else๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜์ •์ด ์ž์ฃผ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

class PaymentProcessor {
    public void processPayment(String type) {
        if (type.equals("creditCard")) {
            System.out.println("Processing credit card payment");
        } else if (type.equals("paypal")) {
            System.out.println("Processing PayPal payment");
        }
    }
}

 

ํ•˜์ง€๋งŒ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋˜์–ด๋„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

interface Payment {
    void pay();
}

class CreditCardPayment implements Payment {
    public void pay() {
        System.out.println("Processing credit card payment");
    }
}

class PayPalPayment implements Payment {
    public void pay() {
        System.out.println("Processing PayPal payment");
    }
}

class PaymentProcessor {
    public void processPayment(Payment payment) {
        payment.pay();
    }
}

 

 

 

3๏ธโƒฃ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (LSP: Liskov Substitution Principle)

์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์—์„œ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

LSP๋ฅผ ์œ„๋ฐ˜ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Rectangle์„ ๊ธฐ๋Œ€ํ•˜๊ณ  Square๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

class Rectangle {
    protected int width, height;

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

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

class Square extends Rectangle {
    @Override
    public void setWidth(int width) {
        this.width = width;
        this.height = width;  // ์ •์‚ฌ๊ฐํ˜•์€ ๋„ˆ๋น„์™€ ๋†’์ด๊ฐ€ ๊ฐ™์•„์•ผ ํ•จ
    }

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

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด Rectangle๊ณผ Square๋ฅผ Shape ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ์œ ์ง€๋˜๋ฉฐ LSP๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋œ๋‹ค.

interface Shape {
    int getArea();
}

class Rectangle implements Shape {
    protected int width, height;

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

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

class Square implements Shape {
    private int side;

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

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

 

 

4๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (ISP: Interface Segregation Principle)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๊ผญ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณตํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋‹ค์Œ์€ ISP ์œ„๋ฐ˜ ์˜ˆ์‹œ๋กœ Developer๋Š” eat() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š” ์—†๋Š”๋ฐ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

interface Worker {
    void work();
    void eat();
}

class Developer implements Worker {
    public void work() {
        System.out.println("์ฝ”๋”ฉ ์ค‘...");
    }

    public void eat() {
        // ๊ฐœ๋ฐœ์ž๋Š” ์‹์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ (๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„)
    }
}

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์ฃผ๋ฉด ISP๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

interface Workable {
    void work();
}

interface Eatable {
    void eat();
}

class Developer implements Workable {
    public void work() {
        System.out.println("์ฝ”๋”ฉ ์ค‘...");
    }
}

class Employee implements Workable, Eatable {
    public void work() {
        System.out.println("์—…๋ฌด ์ˆ˜ํ–‰ ์ค‘...");
    }

    public void eat() {
        System.out.println("์ ์‹ฌ ์‹์‚ฌ ์ค‘...");
    }
}

 

 

5๏ธโƒฃ ์˜์กด ์—ญ์ „ ์›์น™ (DIP: Dependency Inversion Principle)

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

 

DIP๋ฅผ ์œ„๋ฐ˜ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ  Application์ด MySQLDatabase์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค.

class MySQLDatabase {
    public void connect() {
        System.out.println("MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ");
    }
}

class Application {
    private MySQLDatabase database = new MySQLDatabase(); // ์ง์ ‘ ์˜์กด

    public void start() {
        database.connect();
    }
}

 

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค(Database)์— ์˜์กดํ•˜๋„๋ก ๋ฐ”๊พธ๋ฉด DIP๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

interface Database {
    void connect();
}

class MySQLDatabase implements Database {
    public void connect() {
        System.out.println("MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ");
    }
}

class Application {
    private Database database;

    public Application(Database database) {
        this.database = database;
    }

    public void start() {
        database.connect();
    }
}

 

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JDBC, JDK, JRE, JVM  (0) 2025.02.16
Java์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜  (0) 2025.02.09
Java Collections Framework  (0) 2025.01.20
๋Œ“๊ธ€