본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생-응집도와 결합도

 

  1. 현실

이 책의 '기본'편을 통해 객체지향의 탄생 배경 지식, 객체지향의 기본 요소, 객체지향을 잘 활용하는 방법을 이해했다.

 

'패턴'편 통해 객체지향 기법을 디자인 패턴을 통해 실용적으로 활용하는 법을 배웠다.

 

'현실'편, 우리는 객체지향과 디자인 패턴 이론으로 지식을 무장하더라도 현장에서 일하다보면 일과 기술과 관련한 다양한 궁금증이 생긴다. 그래서 우리 개발자를 고민하게 만든다.

 

우리나라의 프로젝트 환경은 납기일 준수가 빠듯하게 잡혀 있어 업무강도가 강하다. 이상적인 개발 환경을 꿈꾸는 신입이라면 우리나라의 지나친 업무강도에 크게 당황한다.

 

납기일 압박이 워낙 심하다보니 시간이 없어 객체지향 기법을 쓰지 못하는 상황에 더 크게 당황한다. 이런 상황에 어떻게 대처해야 하는가에 대한 답은 나도 제시하지 못한다. 다만 왜 업무강도가 강할때 객체지향 기법을 쓰기 어려운지 이유를 얘기하고, 그나마 어려운 환경에서 더 나은 대안을 같이 고민한다.

 

'현실'편을 통해 변화무쌍한 기술적인 고민거리를 풀어보고 열악한 환경에 대처하는 마음가짐등을 함께 고민한다.

 

  1. 기술적인 고민거리
    1. 응집도와 결합도

초창기 객체 지향(80년대)에서 가장 중요시 여기던 패러다임은 '재사용'이었다. 그래서 Component와 같은 이상적인 패러다임이 나오기도 했다. 마치 레고(Lego)와 같이 조립만 하면 만들어지는 레고웨어(Legoware)를 꿈꿔 왔다.

 

하지만 레고웨어는 꿈같은 일이었다. 빈번하게 바뀌는 고객의 요구사항, 몇 명이서는 결코 만들 수 없을 만큼 거대해진 규모, 길어진 소프트웨어 생명주기를 가진 녀석들이 대부분 이었다. 때문에 소프트웨어가 가져야 할 중요한 설계 방향으로 재사용성보다는 쉽게 변화를 수용할 수 있는 유연성(Flexibility)과 확장성(Extensibility)이 이슈가 되었다. 객체지향은 유연성과 확장성을 기준으로 발전했다.

 

그래서 요즘 객체지향 개발을 선택하는 이유는 객체지향적으로 제대로 개발만 하면 유연하고 확장성 높고 유지보수 편리한 개발이 가능하기 때문이라고 한다. 객체지향적으로 개발하면 왜 유연하고 확장성 높고 유지보수가 편리하냐고 누가 묻는다면 나는 이렇게 답을 할 것이다.

 

객체지향적으로 개발하면 모듈간 응집도는 높고 결합도는 낮아지기 때문이라고 답한다. 하지만 역시 열심히 공부하려는 우리를 당혹스럽게 하는 뜬구름 잡는 얘기이기도 하다. 응집도는 높고 결합도는 낮아야 된다는 이 어려운 말은 나를 당혹스럽게 만들었다. 그러나 응집도와 결합도란 단어는 왠지 프로그래밍을 하면서 반드시 알아야 할 것 같은 위압감을 주곤 한다.

 

응집도가 높다는 말은, 비슷한 일을 하는 기능들이 하나의 모듈로 얼마나 잘 뭉쳐 있냐와 비슷한 말이고 결합도가 낮다는 말은, 그 일을 완수하기 위해서 얼마나 다른 모듈에 작게 의존하느냐와 비슷하게 말한다.

 

사람 사는 세상을 예로 들어 분업화가 철저한 어느 공장을 살펴보았다. 작업능률을 높이려면 직원마다의 임무가 비슷한 일로 통일되어 있어야 한다. 포장이면 포장, 테스트면 테스트, 제작이면 제작으로 통일되어 있어야 한다.

 

그러나 포장 했다가 테스트 했다가 때로는 짐나르기 심부름했다가 심지어 수시로 공장 청소까지 하면 어지러워서 제대로 일하지 못할것이다.

 

이 상황에 더해서 포장 공정의 일부를 몰라 다른 사람에게 물어보고, 테스트하는 방법도 몰라 다른 사람에게 물어보는 등, 모든일을 수행할때 다른 사람에게 의존하게 된다면 그 직원은 일의 능률이 바닥으로 떨어져서 조만간 해고 당하게 될것이다.

 

하나로 통일된 일을 하지 못하고 온갖 잡일 하면서 일의 능률을 떨어트리는 경우는 응집도가 낮은 경우이고, 자신에게 주어진 일을 할때 혼자 힘으로 잘 하지 못하고 여러 사람에게 물어보는 경우는 결합도가 높은 경우이다. 공장 직원과 객체는 하나의 일만 잘해야 되는데 온갖 잡일을 하므로 응집도가 낮은 것이고, 공장 직원과 객체가 남에게 조금만 의존해도 될 일을 의존하므로 결합도가 높은 것이다.

 

응집도와 결합도는 둘다 원인과 결과라는 관계로 맺어지기도 한다. 응집도가 낮으면 저절로 결합도가 높아질 것이고, 결합도가 높으면 응집도가 낮아진다. 따라서 객체지향으로 개발할때는 어플리케이션의 모듈이 하나의 일만 잘 수행해야하며 되도록 다른 모듈에게 의존하는 것을 줄여야 한다.

 

응집도를 높이고 결합도를 낮추라는 말은 개발자에게 많은 부담을 준다. 그러나 클래스는 하나의 일만 잘해야 한다~ 하위 클래스에 의존하지 말고 상위클래스에 의존하라~ 등의 객체지향 디자인 규칙과 다양한 디자인 패턴을 공부하고 적용하게 되면, 자연스럽게 높은 응집도와 낮은 결합도라는 규칙을 따를 수 있다. 객체지향은 응집도를 높이고 결합도를 낮추는데 도움을 주는 기법이다.

[높은 응집도와 낮은 결합도는 고품질 소프트웨어를 만드는 중요한 기준이다.]

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 매주 월요일 발행 예정입니다.