객체 지향 프로그래밍의 5원칙

2020. 4. 26. 18:23기타

1. Single Responsibility Principle(단일 책임 원칙)

클래스는 단 하나의 책임만을 가져야 한다.

 작성된 클래스는 하나의 기능만 가지며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어 있어야 한다는 원칙입니다. 이는 어떤 변화에 의해 클래스를 변경하는 이유는 오직 하나뿐이어야 함을 의미합니다. 단일 책임 원칙을 적용하면, 무엇보다도 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있습니다. 뿐만 아니라 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수 용이라는 이점까지 누릴 수 있습니다.

2. Open Close Principle(개방 폐쇄 원칙)

기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.

 이는 수정이 일어나더라도 기존의 구성 요소에는 수정이 일어나지 않아야 하며, 쉽게 확장이 가능하여 재사용을 할 수 있도록 해야 한다는 의미입니다. 개방 폐쇄 원칙은 관리 가능하고 재사용 가능한 코드를 만드는 기반이며, 이를 가능하게 하는 중요한 메커니즘은 추상화와 다형성입니다.
 예를 들어, 게임 캐릭터를 하나 생성할 때, 각각의 캐릭터가 움직임이 다를 경우 부모 클래스인 캐릭터를 만들어 줍니다. 그리고 이를 상속받은 클래스들을 만들어 움직임의 구현을 위임합니다. 이렇게 하면 캐릭터 클래스는 수정할 필요가 없고(수정에 대해 폐쇄) 상속받은 자식 클래스들의 움직임만 재정의 하면 됩니다. (확장에 대해 개방)

3. Liskov Substitution Principle(리스코프 치환 원칙)

자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.

 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙입니다. 이는 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스턴스를 사용해도 문제가 없어야 한다는 것을 의미합니다.

4. Interface Segregation Principle(인터페이스 분리 원칙)

클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스 보다는, 여러 개의 구체적인 인터페이스가 낫다.

 클래스는 자신이 사용하지 않는 기능에 대해서는 영향을 받지 말아야 한다는 의미입니다. 다시 말해서, 큰 덩어리의 인터페이스를 구현해서 사용하지 않는 함수를 implement 하지 말고 여러 개의 단위로 분리시킴으로써 꼭 필요한 메소드들만 이용할 수 있게 한다는 말입니다.
 한가지 예를 들자면, 우리는 스마트폰으로 전화, 웹 서핑, 사진 촬영 등 다양한 기능을 사용할 수 있습니다. 그러나 전화를 할 때에는 웹 서핑, 사진 촬영 등 다른 기능은 사용하지 않습니다. 따라서 전화 기능과 웹 서핑, 사진 촬영 기능들은 각각 독립된 인터페이스로 구현하여, 서로에게 영향을 받지 않도록 설계해야 합니다.

5. Dependency Inversion Principle(의존 역전 원칙)

의존 관계를 맺을 때, 변화하기 쉬운 것보다는 변화하기 어려운 것에 의존해야 한다.

 여기서 말하는 변화하기 쉬운 것이란 구체적인 것을 말하고, 변화하기 어려운 것이란 추상적인 것을 말합니다. 객체 지향적인 관점에서 보자면 변화하기 쉬운 것이란 구체화된 클래스를 의미하고, 변화하기 어려운 것은 추상 클래스나 인터페이스를 의미합니다. 따라서, 의존 역전 원칙을 만족한다는 것은 의존 관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미합니다.
 예를 들어, 아래와 같은 클래스 들이 있다고 합니다.

public class A {
    private C c;

    public A(C c) {
        this.c = c;
    }
}

public class B implements C {
    ...
}

public interface C {
    ...
}

public class D implements C {
    ...
}

 위의 예제와 같이, 추상을 매개로 의존 관계를 생성하는 것을 의미하는 것이 의존 역전 원칙입니다. 이렇게 구현하게 되면 A에서 B의 구현된 기능을 사용하고 싶다면, A를 생성할 때 B를 인자로 생성하면 됩니다. 다르게 D의 구현된 기능을 사용하고 싶다면, D를 인자로 생성하면 됩니다. 이처럼 추상을 매개로 구현된 객체 간의 관계를 최대한 느슨하게 만드는 원칙이 의존 역전 원칙입니다.

728x90

'기타' 카테고리의 다른 글

Pub/Sub 모델  (0) 2020.05.07
Git Merge와 Rebase  (0) 2020.04.26
예외 처리  (0) 2020.04.25
API  (0) 2020.04.22
QueryString과 Path Variable은 각각 언제 사용하는가  (0) 2020.04.09