GRASP는 General Responsibility Assignment Software Patterns의 약자로, 객체지향 설계에서 적절한 객체에게 올바른 역할을 할당하기 위한 원칙들의 집합입니다. 이러한 원칙은 객체지향 설계에서 객체 간의 역할, 책임, 협력을 명확하게 할당하기 위해 사용됩니다.
GRASP는 아래의 9가지 패턴으로 구성되어 있습니다:
Information Expert (정보 전문가): 어떤 작업을 수행하는 데 필요한 정보를 갖고 있는 클래스에 해당 작업의 책임을 할당하는 원칙입니다. 정보를 최대한 알고 있는 클래스가 해당 정보를 사용하는 것이 논리적으로 더 일반적입니다.
Creator (창조자): 객체 A가 객체 B를 생성해야 할 때, A와 B 사이에서 A가 B의 인스턴스를 생성하는 것이 가장 적절한 경우에 해당합니다. 객체 A가 다수의 객체 B를 생성하는 경우, 이러한 책임을 A에게 할당할 수 있습니다.
Controller (컨트롤러): 사용자 입력을 받아 처리하고 시스템의 흐름을 조절하는 책임을 가진 클래스에게 해당 패턴을 적용합니다. 주로 사용자 인터페이스 이벤트나 시스템의 흐름을 제어하는 데 사용됩니다.
Low Coupling (낮은 결합도): 낮은 결합도를 유지하려면, 객체 간의 상호 작용을 최소화하고 가능하면 독립적인 책임을 부여해야 합니다. 이는 변경이 쉽고 재사용이 가능한 시스템을 설계하는 데 도움이 됩니다.
High Cohesion (높은 응집도): 높은 응집도는 객체의 책임이 서로 관련되어 있고, 한 가지 목적을 위해 모여 있는 것을 의미합니다. 높은 응집도를 갖는 객체들은 유사한 책임을 가지므로 시스템을 이해하고 유지보수하기가 쉽습니다.
Polymorphism (다형성): 다형성은 동일한 인터페이스를 사용하여 여러 객체 유형을 처리하는 데 사용됩니다. 다형성을 이용하면 코드의 유연성이 향상되고, 새로운 유형의 객체를 간단히 추가하거나 교체할 수 있습니다.
Pure Fabrication (순수한 창조물): 실제로 존재하지 않는 가상의 클래스에 책임을 할당하는 것으로, 설계의 편의를 위해 사용됩니다. 이 클래스는 시스템의 응집도를 높이고, 낮은 결합도를 유지하는 데 도움이 됩니다.
Indirection (간접 참조): 객체 간의 직접적인 참조를 피하고, 중간에 인터페이스나 추상 클래스 등을 사용하여 간접적인 참조를 통해 통신하는 것을 의미합니다. 이를 통해 결합도를 낮출 수 있습니다.
Protected Variations (보호된 변형): 외부 변화에 대한 영향을 최소화하기 위해 인터페이스나 추상 클래스를 통해 객체 간의 결합도를 감소시키는 것을 목적으로 합니다.
GRASP 패턴은 객체지향 설계에서 각 클래스에게 올바른 역할을 할당하여 유지보수 가능하고 유연한 시스템을 설계하는 데 도움을 주는 원칙들의 집합입니다.
SOLID는 다섯 가지 객체지향 설계 원칙의 약어로, 소프트웨어 디자인의 유연성, 확장성, 유지보수성을 향상시키기 위해 사용됩니다. SOLID 원칙은 소프트웨어의 객체지향 설계를 개선하고, 코드의 품질을 높이며, 변경에 대응하기 쉽게 만들기 위한 지침을 제공합니다.
하나의 클래스는 단 하나의 책임(역할)만 가져야 합니다. 클래스가 변경되어야 하는 이유는 오직 하나뿐이어야 합니다. 이렇게 하면 클래스가 간결하며 변경이 발생할 때 영향이 적게 미칩니다.
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 합니다. 새로운 기능을 추가할 때는 기존의 코드를 변경하지 않고 확장할 수 있도록 설계해야 합니다.
자식 클래스는 언제나 부모 클래스로 대체될 수 있어야 합니다. 즉, 상속 관계에서 하위 클래스는 상위 클래스의 기능을 변경하지 않고 확장만 수행해야 합니다.
클라이언트는 자신이 사용하지 않는 메서드에 의존하면 안 됩니다. 큰 인터페이스를 여러 개의 작은 인터페이스로 분리하여 클라이언트가 필요한 메서드만 사용하도록 해야 합니다.
고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 모두 추상화에 의존해야 합니다. 추상화는 세부 사항에 의존해서는 안 됩니다. 즉, 상위 수준 모듈이 하위 수준 모듈에 의존하지 말아야 하며, 둘 다 추상화(인터페이스나 추상 클래스)에 의존해야 합니다.
SOLID 원칙을 따르면 코드의 가독성, 확장성, 유지보수성이 향상되며, 시스템이 변경에 유연하게 대응할 수 있습니다. 이러한 원칙들은 객체지향 설계의 핵심 원칙으로 널리 받아들여지고 있습니다.