좋은 객체 지향 설계를 위한 5가지 원리
1. Single Responsibility Principle : SRP, 단일 책임 원칙
하나의 Class는 하나의 책임만 가져야한다. 쉽게 생각하면 하나의 클래스는 하나의 기능을 가져야 한다.
여러개의 기능을 갖는 경우 내부 함수끼리의 강한 결합을 필요로 하고 코드의 효율이 떨어지게 된다.
또한, 새로운 요구사항과 같은 프로그램 변경에 의해 변경 시 연쇄적 변경을 유발하므로 유지보수의 비효율이 동반된다.
따라서 하나의 클래스는 하나의 책임을 가지도록 책임을 분리시켜야 한다.
2. Open-Closed Principle : OCP, 개방 폐쇄의 원칙
소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀있어야 한다.
기존 코드를 변경하지 않고 기능을 수정, 추가할 수 있도록 설계해야한다.
어떤 클래스의 기능을 수정할때 해당 클래스를 이용하는 모든 클래스를 수정해야한다면 유지보수의 비효율이 동반된다.
또한 OCP를 지키지 않는 경우 유연성, 재사용성도 사용이 어렵게 되므로 기존 코드를 변경하지 않아도 기능을 수정 추가할 수 있도록 하여야 한다.(다형성과 추상화를 활용하여야 한다.)
3. Liskov Substitution Principle : LSP, 리스코프 치환의 원칙
하위 클래스의 객체는 상위 클래스의 객체에서 가능한 행위를 수정할 수 있어야 한다.
상속 관계에서는 반드시 Is a 관계(일반화)가 성립해야하며 다형성에서는 하위 클래스의 인터페이스 규약을 다 지켜야한다.
쉽게 생각하면 자식 클래스는 부모 클래스의 역할을 완전히 대체할 수 있어야 한다.
4. Interface Segregation Principle : ISP, 인터페이스 분리의 원칙
최대한 인터페이스를 작게 쪼개 하나의 범용 인터페이스 보다는 여러개의 인터페이스를 사용하는 것이 낫다.
세부적으로 나눌수록 인터페이스가 명확해지며, 대체 가능성이 높아지기 때문이다.
인터페이스를 변경해도 다른 인터페이스들은 영향을 받지 않도록 하는 것이 가장 중요한 핵심이다.
5. Dependency Inversion Principle : DIP 의존 역전의 원칙
개발자는 추상화에 의존하되 구체화에 의존해서는 안된다.
하나의 클래스 구현에 의존할게 아니라 여러개의 인터페이스에 의존해야한다는 것이다.
인터페이스에 의존할수록 유연하게 구현체를 바꿀 수 있으며 구현체는 언제든 변하기 쉽기 때문에 유지보수의 비효율이 동반될 수 있기 때문이다.
* 5대 원칙의 상관관계
SRP, ISP
객체가 단일 책임을 가지게하고 세부적인 인터페이스를 갖음으로 기능의 추가 및 변경에 용이해진다.
LSP, DIP
OCP를 각각 돕는다.
LSP는 다형성을 통해 새로운 자식 클래스가 추가되어도 부모 클래스의 특성을 모두 반영함으로써, 새로운 기능을 추가하며 기존의 기능을 변경하지 않도록 하여 OCP를 돕는다.
DIP는 추상화를 통해 각각의 인터페이스에 의존하게 만듬으로써, 자식 클래스의 특성에 의존하지 않게 되므로 기존의 기능 변경 없이 새로운 기능이 추가되도록 하여 OCP를 돕는다.
OCP의 기존 코드 영향 없이 새로운 기능 추가라는 원칙을 LSP와 DIP로써 이룰 수 있게끔 방법론적으로 도와주는 것이다.
'Computer Science' 카테고리의 다른 글
컴퓨터 구조 (0) | 2024.11.14 |
---|