티스토리 뷰
응집도?
객체 지향의 이상적인 설계를 위한 많은 원칙들을 한줄로 요약하면, "응집도는 높이고, 결합도는 낮춘다!" 입니다. 설계 부분은 이러한 개념적인 부분이 많아 경험이 수반 되지 않으면 초보개발자들이 완전히 이해하기 어려운 측면이 많이 있습니다. 특히 저는 응집도를 이해하기가 어려웠습니다. 응집도를 높이기 위해 연관된 사항들을 이것 저것 넣게 되면 SRP(단일 책임 원칙)에 크게 위반하게 될 것 같은데, 아이러니 하게도 응집도를 높이는것이 SRP(단일 책임 원칙)을 지키게 되는 지름길이라는 겁니다. 이러한 의문을 풀기위해서 먼저 응집도의 의미부터 정확하게 하기 위해서 찾아보았습니다.
하나의 프로그램을 구성하는 각각의 모듈이 그 고유의 기능을 잘 처리할 수 있는지를 나타내는 정도. - (한국정보통신기술협회 IT용어사전)
제가 생각하기에 가장 핵심이 되는 키워드는 고유의 기능이 되는 것 같습니다. 객체 설계시의 여러 기능을 모두 짊어지는 것보다 객체 고유의 기능이 무엇인지 생각해보는 것입니다. 만약 한 객체가 여러가지의 고유의 기능을 가질 수 있다면 그 객체는 여러 객체로 나눌 수 있는 가능성이 생기는 겁니다.
응집도를 높이지 않는다면 유지보수시에 어떠한 기능을 수정하기 위해서 코드를 분석하는 작업에 상당한 시간이 소요 될 것이며, 응집도가 높지 않은 객체를 의존하게 되는 경우에 필요하지 않은 기능 또한 의존하게 되어서 역시나 유지보수의 어려움을 겪게됩니다.
응집도의 척도
여전히 경험이 수반되지 않은 상태에서는 뜬 구름 같은 느낌이 듭니다. 응집도를 단번에 판단할 수 있는 척도는 없을까 고민하던 참에, 로버트 C 마틴이 쓴 클린코드에 자세히 서술 되어 있었습니다. (유레카~)
각 클래스 메서드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 일반적으로 메소드가 변수를 더 많이 사용 할 수록 메서드와 클래스의 응집도가 더 높다. . . . (중략) . . . 응집도가 높다는 말은 클래스에 속한 메소드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미기 때문이다.(클린코드 177쪽)
정리하자면 다음과 같습니다. 먼저 클래스의 메소드들이 클래스의 인스턴스 변수를 하나 이상 사용하고 있는지 확인해봅니다. 이러면 일단 어느정도의 응집도가 있다고 할 수 있겠습니다. 응집도를 더 높이기 위해서는 몇몇 메소드 만이 사용되는 인스턴스 변수가 있는지 확인해봅니다. 이런 경우 응집도가 있는 클래스를 응집도가 더 높은 2개이상의 다른 클래스들로 쪼갤 수 있다는 겁니다.
(사실 이러한 과정 이전에 함수를 작고 매개변수는 적게하라는 전략이 먼저 수반됩니다. (자세한 내용은 클린코드에 있습니다.) 함수를 추출하는 과정에서 여러 변수(3개이상)을 넘기게 된다면 그 변수들을 별개의 클래스를 선언하고 그 클래스 필드로 선언 합니다.)
'Design Pattern' 카테고리의 다른 글
템플릿/콜백 패턴이란? (1) | 2019.04.01 |
---|---|
전략 패턴 (strategy pattern) (0) | 2019.01.23 |
객체지향의 4대 특성 (2) | 2018.12.31 |
객체의 추상화 (Abstraction) (0) | 2018.12.04 |
객체의 캡슐화(Encapsulation), 접근제어자 (0) | 2018.11.21 |