객체지향 패러다임
1. 추상화(Abstraction)
불필요한 부분을 제거함으로, 필요한 핵심만 나타내는 것. 흔히 일반화, 단순화라고도 한다. 사용하는 목적은 복잡성을 제거하는 것이라 할 수 있다.
2. 다형성(Polymorphism)
다양한 형태를 가지는 것이다. 쉽게 생각해서, 하나의 타입으로 여러 종류의 객체를 참조하는 것이다.
3. 캡슐화(Encapsulation)
객체 내부의 세부사항을 외부로부터 감추는 것. 사용하는 목적은, 인터페이스만 공개해서 변경하기 쉬운 코드를 만들기 위함이라 할 수 있다.
4. 상속(Inheritance)
상속은 부모로부터 물려받는 것이다.
1. 단일 책임의 원칙(SRP : Single Responsibility Principle)
: 하나의 책임을 가진다
2. 개방 폐쇄의 원칙(OCP : Open/Closed Principle)
: 합장에는 열려있고, 변경에는 닫혀있다. 즉, 기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다.
3. 리스코프 치환의 원칙(LSP : Liskov's Substitution Principle)
: 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 전혀 문제가 없어야 한다.
4. 인터페이스 분리의 원칙(ISP : Interface Segregation Principle)
: 많은 기능을 가진 인터페이스를 작은 단위로 분리시킴으로써 클라이언트에게 필요한 인터페이스들만 구현하도록 하는 것. 즉, 이를 통해 클라이언트가 사용하지 않는 기능에 의존하게 되면 예상치 못한 문제가 발생하기도 하는데, 이를 방지할 수 있다.
5. 의존성 역전의 원칙(DIP : Dependency Inversion Principle)
: 의존관계를 맺을 때, 자주 변경되는 쪽이 아닌, 변경이 많이 일어나지 않는 쪽에 의존하는 것. 자기보다 변하기 쉬운 것에 의존하면 변화의 영향을 많이 받기 때문에 추상화된 인터페이스나 상위 클래스를 둬서 변화의 영향을 줄이는 것.
즉, 하나의 메소드에서 getter를 통해 값을 가지고 와, 한 곳에서 어떠한 모든 처리가 집중되어 있다면 '절차 지향 프로그래밍', 해당 책임을 가진 객체에게 메시지를 통해 협력하도록 구현하는 방식은 '객체지향 프로그래밍'
높은 음집도와 낮은 결합도.
위 2가지는 객체지향 설계를 할 때 매우 중요한 요소.
즉, 음집도가 높은, 비슷한 것들은 하나로 모은다. 그리고 다른 성격의 것들은 분리시킴으로, 비슷한 것들끼리는 음집도를 높이고, 다른 것들끼리는 분리를 시킨다는 것.
높은 음집도와 낮은 결합도의 장점은, 음집도가 높은 것끼리 모아두면, 어떤 변경이 생겼을 때 변경의 포인트가 하나로 집중될 수 있다는 것. 즉, 영양 범위를 파악하는 것이 한 곳에 집중되어 있다는 것.
객체지향에 있어서, 변경에 대한 요구사항이 들어왔을 때, 특정 한 부분만 수정을 하면 되는 것은 음집도가 높다는 것. 그리고 어떤 변경이 생겼을 때, 다른 곳에 영향을 미치지 않는 것이 낮은 결합도라고 할 수 있음.
유지부수와 관련이 있다.
객체지향 설계를 하는 가장 큰 이유 중 하나는, 어떤 변경이 생겼을 때, 높은 음집도와 낮은 결합도를 가지고 빠르고 유연하게 대응할 수 있다는 것이다.
도메인을 구성하는 객체에는 어떤 것들이 있는지 고민
객체들 간의 관계를 고민
동적인 객체를 정적인 타입으로 추상화하여 도메인 모델링 하기
협력을 설계
객체들을 포괄하는 타입(클래스)에 적절한 책임을 할당
구현
※ 객체지향 세계에서는 모든 객체가 능동적인 존재이다.