의존관계를 맺을 때 자주 변경되는 쪽이 아니라, 변경이 거의 일어나지 않는 쪽에 의존한다.
자기보다 변하기 쉬운 것에 의존하게 되면 변화의 영향을 많이 받기 때문에 추상화 된 인터페이스나 상위 클래스를 두어서 변화의 영향을 많이 받지 않게 하기 위한 것이다.
하지만, 많은 사람들이 앞서 살펴본 객체지향의 4가지 특징이나 5가지 설계 원칙에 대해서는 각자 나름대로의 견해를 가지고 있지만 객체지향에 대한 질문에 대해서는 대답을 명확하게 못하는 경우가 많습니다.
강의에서 제시되는 객체지향의 설명은 다음과 같습니다.
객체 지향 패러다임
객체지향이란 "적절한 객체에게 적절한 책임을 할당하여 서로 메시지를 주고 받으며 협력하도록 하는 것" 자체를 말하는 것입니다.
그리고 객체지향이 등장하게된 배경은점점 증가하는 SW(Software) 복잡도를 낮추기 위해객체지향 패러다임이 대두되었습니다.
개인적으로 생각하는 두 가지 중요 포인트는 다음과 같습니다.
이름 자체가 객체 지향인 만큼 클래스가 아닌객체에 초점을 맞추는 것
객체들에게 얼마나 적절한역할과책임을 할당하는지
이 부분은 개념적으로 설명은 드렸지만 이와 관련된 코드는 다시한번 아래에서 살펴보도록 할 것입니다.
절차지향 프로그래밍 vs. 객체지향 프로그래밍
두 패러다임을 구분 짓는 요소는 다음과 같은 두 가지가 있습니다.
책임이 한 곳에 집중 돼 있는 방식 (getter)
책인이 여러 객체로 적절히 분산되어 있는 방식
책임이 한 곳에 집중 되어 있다면절차지향, 책임이 여러 객체로 적절히 분산되어 있다면객체지향으로 생각할 수 있는 것입니다.
즉, 하나의 메소드에서 getter를 통해 값을 가져 온 다음에 이곳에서 어떤 모든 처리가 집중되어 있다면 절차지향이지만,
getter로 무언가를 가져와서 처리하는 것이 아닌 해당 책임을 가진 객체에게 메세지를 통해 협력하도록 구현하는 방식을 객체지향 방식으로 보는 것입니다.
high cohesion, loose coupling
객체지향 설계에 있어서, 가장 좋은 표현은 high cohesion, loose coupling 이라고 합니다. 한국어 뜻은 높은응집도, 낮은 결집도 인데요.
이 부분을 객체지향 설계를 할 때 가장 염두에 두면 좋습니다.
이는서랍 정리라는 개념으로 비유할 수 있습니다.
응집도가 높은, 즉서로 비슷한 것끼리는 하나로 모아놓습니다.
그리고다른 성격의 것들은 분리시킴으로써 비슷한 것들끼리는 응집도를 높이고 서로 다른 것들끼리는 분리를 시키는 것을 말하고 싶었습니다.
그렇다면 이렇게 하면 무엇이 좋은 것일까요?
응집도가 높은 것들끼리 모아놓으면 무언가 변경이 되었을 때, 변경의 포인트가 하나로 집중될 수 있다는 것입니다. 즉, 파악해야 할 영향 범위가 굉장히 한 곳에 집중되어 있다는 것입니다.
우리는 프로그래밍을 하다보면 수정에 대한 요구사항을 받을 때가 있는데, "영향 범위를 모르겠어요", "어디까지 영향을 주는지 모르겠어요" 등의 표현을 가끔 쓰는 데요. 이러한 표현을 쓰게 된 것 자체에는 객체지향을 온전히 사용하지 못했다는 것을 반증해 주는 표현이라고 생각합니다.
객체지향에 있어서는 요구사항이 들어왔을 때 특정 한 부분만 수정을 하면 된다는 것은 응집도가 높다는 부분이고,
어떤 변경이 생겼을 때, 다른 곳에 영향을 끼치지 않는다면 낮은 결합도라고 생각합니다.
즉, 어떤 변화가 생겼을 때 다른 곳에 미치지 않는다면 high cohsion, loose coupling 인 것입니다.
생각해보면 이 표현은유지보수와 굉장히 밀접한 관련이 있습니다. 즉, 객체지향 설계를 하는 이유는 어떠한 변경이 생겼을 때 아주 빠르게 그리고 높은 응집도와 낮은 결집도를 가지고 유연하게 대응할 수 있기 때문이라고 생각합니다.