sellen

객체 지향 설계 원칙 - SOLID 본문

Programming/Java

객체 지향 설계 원칙 - SOLID

sellen 2025. 8. 12. 23:12

객체 지향 설게 원칙인 SOLID에 대해 간간하게 알아보겠습니다.

SRP - 단일 책임의 원칙

  • Single Responsibility Principle
  • 하나의 클래스는 하나의 목적을 위해 생성
  • 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어야 한다

ORP - 개방 폐쇄 원칙

  • Open Close Principle
  • 확장에는 열려있고, 변경에는 닫혀있어야 한다

LSP - 리스코프 치환 원칙

  • Liskov Substitution Principle
  • 서브 타입(상속받은 하위 클래스)은 어디서나 상위클래스로 교체 가능해야 한다
    • 자식 클래스는 부모 클래스의 기능을 모두 구현해야 한다

ISP - 인터페이스 분리의 원칙

  • Interface Segregation Principle
  • 사용하지 않는 인터페이스는 구현하지 말아야 한다
  • 특정 기능에 대한 인터페이스 설계 시 그 기능과 관련 없는 기능이 변해도 영향을 받지 않아야 한다

DIP - 의존성 역전의 원칙

  • Dependency Inversion Principle
  • 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 메시지를 주고받는다.

class Dog {
    public void bark() {
        System.out.println("Woof");
    }
}

public class Zoo {
    // dog 객체를 생성
    private Dog dog = new Dog();

    public Zoo() {
        // Zoo 객체 생성할 때 직접 dog의 메소드 실행
        dog.bark();
    }

    public static void main(String[] args) {
        Zoo zoo = new Zoo();
    }
};

만약 Dog가 아니라 Cat 같은 다른 객체를 생성하여 Zoo에서 사용하고 싶을 경우

Zoo 생성자에서 dog.bark( )를 cat.bark( )로 변경해야 하는 번거로움이 발생합니다.

interface Animal {
    void bark();
}

class Dog implements Animal {
    @Override
    public void bark() {
        System.out.println("웡!");
    }
}

public class Zoo {
    private Animal animal;

    Zoo(Animal animal) {
        // 생성자를 통해 Animal을 주입받음
        this.animal = animal;
    }

    public static void main(String[] args) {
        // Dog 객체를 생성하여 넣음
        Zoo zoo = new Zoo(new Dog());
        zoo.animal.bark();
    }
}

만약 Dog가 아니라 Cat 객체를 생성하여 Zoo에서 사용하고 싶은 경우

Animal의 구현체로서 Cat 클래스를 생성하고

Zoo 객체를 생성할 때 Cat 객체를 주입하면 됩니다.

우리는 dog.bark( )나 cat.bark( )를 변경하거나 사용할 필요 없이 animal에 Animal 구현체가 주입되었으므로

zoo.animal.bark( )만 실행하면 주입한 객체에 따라 원하는 메서드가 실행됩니다.

따라서 저희는 구현체를 생성하고 원하는 객체만 주입해 주면 되므로 코드 변경이 쉬워집니다.