객체지향의 특징과 설계원칙에는 기존에 익히 들어왔던 4가지 특징과 5가지 설계원칙을 들 수 있다.
특징
객체지향방식의 설계를 한다는 것은 위의 원칙을 하나씩 따져가며 구현하는 것이 아니라고 생각한다.
설계를 하는 도중 발생하는 문제지점을 해결하는 것부터 시작된다.
예를 들어 구체화된 객체를 받아와 해당 객체를 사용하는 객체를 만들었다고 가정해보자.
처음에 이를 쓸때는 큰 문제없이, 받아온 객체를 이용해 service로직을 이용할 수 있을것이다.
그런데 이제는 해당 구체화된 객체를 사용하지 않고 다른 구체화된 객체를 사용한다면, 이미 곳곳에 퍼져있는 객체를 수정하는 일은 여간 힘든일이 아닐 것이다.
이제 역으로 개념을 생각해보면 위의 문제는 의존성 역전 원칙을 어김으로써 문제가 발생함을 알 수 있다.
그렇기 때문에 해당 객체들이 가지는 특성을 모은 인터페이스를 만들고, 인터페이스에 의존하게 만들어야 한다는 생각이 자연스럽게 든다.
처음부터 매우 추상화된 형태로 설계를 하는 것은 어디서부터 시작을 해야할지, 범위를 어디까지 나눠야 할까라는 생각을 마주치게 된다.
그렇기 때문에 적절한 프로세스를 통해 작은 부분부터 객체지향 설계를 잘 생각해 구현해야 한다.
생각하는 프로세스는 다음과 같다.
도메인을 구성하는 객체에는 어떤 것들이 있을까의 고민
학점 계산기 도메인에는 이수한 과목, 과목의 학점을 계산해 줄수 있는 객체가 있을 수 있다.
객체들 간의 관계를 고민
학점 계산기 객체가 과목 객체를 받아 어떤 연산을 해줄 수 있다.
동적인 객체를 정적인 타입으로 추상화하기
자료구조, 알고리즘, 운영체제같은 구체적인 객체를 과목이라는 추상적인 객체로 바꾸자
객체들간 적절한 책임을 담당하고 협력을 설계하기
학점 계산기는 학점을 계산한다는 책임이 있고, 과목 객체는 과목에 대한 정보 및 연산을 담당한다는 책임이 있다. 또한 학점 계산기는 과목을 받아서 연산한다는 협력이 존재
구현하기