디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

응집도와 결합도-우리는 우리의 코드를 어떻게 망치는가?

ㅆㅇㅆ(113.192) 2025.04.13 21:57:41
조회 695 추천 8 댓글 15
														

3eb8c877abc236a14e81d2b628f172689228e8bb

(명저 중의 명저 코드 컴플리트)


왜 우리는 항상 '모듈화'가 중요하다는 소리를 듣는데


거기서 모듈화의 핵심을 제대로 이해하지 못하는 사람들은 종종 이런 소리를 한다


'코드를 나누면 좋다'라고 말이다


그런데 이상하게도 코드를 더 잘게 쪼갰는데도 더 복잡해지는 경우가 많다.


예를들어서 서비스 클래스를 분명히 도메인별로 나눴지만, 하나의 데이터 흐름이 여러 클래스를 오가며 오히려 파편화되어 추적이 어려워진다라거나 말이다.


이 글은 왜 그런가에 대한 이야기이다.


3eb8c874abc236a14e81d2b628f175650dd0901b

(1974년 Yourdon & Constantine의 구조적 설계 논문)


구조적 설계(Structured Design)는 복잡성을 줄임으로써 코드 작성, 디버깅, 수정 작업을 더 쉽게, 더 빠르게, 더 저렴하게 만들기 위한 일반적인 프로그램

설계 고려사항과 기법들의 집합이다.


이 주요 아이디어들은 거의 10년에 걸친 콘스탄타인(Mr. Constantine)의 연구 결과이다.

이 논문에서는 그 결과들을 소개하지만, 이론과 유도 과정 자체는 다루지 않는다.


이러한 아이디어들은 마이어스(Mr. Myers)에 의해 복합 설계(Composite Design)라고도 불렸다.

저자들은 이러한 프로그램 설계 기법이 HIPO6의 문서화 기법이나 구조적 프로그래밍의 코딩 기법과 호환되며 상호 보완적이라고 믿는다.


이러한 비용 절감형 설계 기법들은 항상 시스템의 다른 제약 조건들과 균형을 맞춰야 한다.

하지만 프로그래머의 시간 비용이 계속 상승함에 따라, 단순하고 변경이 쉬운 프로그램을 만드는 능력은 점점 더 중요해질 것이다.

-1974년 Yourdon & Constantine의 구조 디자인 논문

---

결합도와 응집도는 무엇이고 어째서 시작되었는가?


1960년대~1970년대 초반 모듈화(Modularity)에 대한 논의는 존재했다. 

역사적으로는 다익스트라가 구조적 프로그래밍을 주장하며 모듈식 설계의 중요성을 강조했고, 그의 논문에서도 강조했다

그리고 1968년 데이비드 파나스의 기념비적 논문 "On the Criteria To Be Used in Decomposing Systems into Modules" (1972) 에서 정보은닉과 모듈 경계 설계를 제안했다


즉 이제 거대한 시스템을 만들기 위한 초기단계에 프로그래머들은 들어서게 되고, 모듈화라는 것이 그 도구가 될 것이 분명했다.


3eb8c875abc236a14e81d2b628f1776dbd4772bb

1971년 니클라우스 비르트(Niklaus Wirth)는 모듈화를 점진적 정제(Stepwise Refinement)과정으로 설명했다.


여기서 모듈화는 점진적 문제(Stepwise Refinement)란 무엇인가?


복잡한 문제를 해결하기위해서 하향식 설계(탑 다운)를 이야기한다.


1. 추상적인 수준에서 시작: 가장 먼저 해결 해야할 문제를 매우 높은 수준에서 정의한다. 즉 문제의 큰 그림을 그린다


2. 점진적인 구체화를 시작한다. 


3. 이후 문제의 세부사항을 추가한다


4. 구현을 반복한다.


비르트는 이러한 과정이 자연스레 모듈화로 이어진다고 말했다


각 정제단계에서 도출되는 하위 문제들이 결국에는 독립적인 기능 단위 '모듈'이 되는 것이다.


-모듈은 특정 하위 문제를 해결할 것이며


-모듈간의 인터페이스는 각 단계에서 정의된 데이터와 제어 흐름에 따라 결정 된다.


따라서 높은 수준의 추상화에서 구체적인 구현으로가는 과정자체가 시스템을 명확한 책임과 인터페이스를 가진 독립적 모듈로 구성하는 방법이라는 것이다.


그럼 모듈의 경계 설계와 모듈식 설계가 중요하는 것은 알겠다


그러면 자연스레 우리는 이 질문 앞에 다시 선다.


그럼 어떻게 모듈화의 품질은 어떻게 평가할 것인가?


3eb8c872abc236a14e81d2b628f1726e6f81ea


그리고 1974년 Yourdon & Constantine의 구조적 설계 논문에서 이것을 정량 평가하는 기준을 마련한다.


그 기준이


응집도(Cohesion)


결합도(Coupling)


이다.


이것을 바탕으로 '모듈화'는 단순한 코드 분할을 넘어 일종의 시스템 복잡도 관리의 핵심도구가 된다.


그리고 이것들을 바탕으로 엘런케이의 OOP가 나오고


IEEE 표준과 SEI-CMMI에서 구체화되고


그리고 명저중의 명저 '코드 컴플리트'에서 이를 설명하고 일반 프로그래머에게 알려졌다.


응집도와 결합도는 무엇인가?



3eb8c873abc236a14e81d2b628f1706c472d62


결합도와 함께 구조적 설계에서 비롯된 응집성은 일반적으로 같은 맥락에서 논의됩니다. 

응집성은 클래스 내의 모든 루틴 또는 루틴 내의 모든 코드가 중심 목적을 얼마나 잘 지원하는지, 즉 클래스가 얼마나 집중되어 있는지를 나타냅니다. 

강력하게 관련된 기능을 포함하는 클래스는 강한 응집성을 갖는다고 설명되며, 경험적 목표는 응집성을 가능한 한 강하게 만드는 것입니다.

 응집성은 복잡성을 관리하는 데 유용한 도구인데, 클래스 내의 코드가 중심 목적을 더 많이 지원할수록 뇌가 해당 코드가 수행하는 모든 작업을 더 쉽게 기억할 수 있기 때문입니다. 루틴 수준에서의 응집성에 대한 사고는 수십 년 동안 유용한 경험적 방법이었으며 오늘날에도 여전히 유용합니다. 클래스 수준에서는 응집성의 경험적 방법이 이 장의 앞부분과 6장에서 논의된 더 넓은 경험적 방법인 잘 정의된 추상화에 의해 크게 포괄되었습니다. 

추상화는 루틴 수준에서도 유용하지만, 그 세부 수준에서는 응집성과 더 동등한 위치에 있습니다.


-Code Complete 2nd Edition,  Aim for Strong Cohesion  부분



결론부터 이야기하자면 응집도는 높게, 결합도는 낮추게 하는 것이 유리하다.


응집도(Cohesion)

-모듈 내부 요소들의 기능적 연관성을 계층적 분류


결합도(Coupling)

-모듈간의 의존성 강도



그리고 이 응집도와 결합도를 판단하는 지표를 알아보자

바로 Code Complete와  Yourdon & Constantine의 논문을 바탕으로 말이다.




3eb8c870abc236a14e81d2b628f1756806cf634c




3eb8c871abc236a14e81d2b628f1756f4d4f2c01


전통적 응집도의 분류( Yourdon & Constantine)-1974



응집도 종류설명
우연적 응집 (Coincidental Cohesion)

모듈 내 작업들이 서로 전혀 관련이 없음. 단순히 물리적으로 묶여 있을 뿐.

가장 나쁜 응집도.

예: Utils.cs에 로그, 날짜 파싱, DB 커넥션이 다 들어있음.

논리적 응집 (Logical Cohesion)

관련은 있지만 작업을 선택적으로 수행함. 하나의 진입점에서 분기(switch/case)로 동작이 결정됨.

예: HandleCommand(CommandType type) 같은 메서드.

시간적 응집 (Temporal Cohesion)

시간적으로 함께 실행되는 작업을 묶은 것.

예: InitAll()ShutdownAll() 같이 프로그램 시작/종료 시 동작을 모은 것.

절차적 응집 (Procedural Cohesion)

모듈 내 작업들이 특정 순서로 실행되지만 서로 직접적인 연관성은 없음.

예: 파일 열고, 로그 남기고, UI 닫기 등이 순차적으로 있는 경우.

통신적 응집 (Communicational Cohesion)

모듈 내 모든 작업이 같은 데이터 구조를 사용.

관련성은 명확하지만, 처리 작업이 다양할 수 있음. 예: 동일한 테이블을 조회, 수정, 삭제하는 기능이 하나의 모듈에 있음.

순차적 응집 (Sequential Cohesion)

한 작업의 출력이 다음 작업의 입력으로 이어짐.

예: 데이터를 읽고 → 가공하고 → 저장하는 일련의 파이프라인.

기능적 응집 (Functional Cohesion)

모듈이 하나의 명확한 기능만 수행하며, 내부 요소들이 모두 그 기능을 위해 존재. 가장 이상적인 형태.

예: CalculateTax()GenerateReport() 같은 함수


코드 컴플리트에서는 모듈 또는 루틴에 대해서 응집도를 말하는데 여기서 루틴은


'특정 작업을 수행하는 독립적 코드 블록'을 의미한다.


응집도-클래스 또는 루틴의 요소들이 얼마나 잘 서로 어울리는지를 말한다.


모듈과 루틴에 대해서 평가할때


우연적 응집을 가장 비판하고 아래로 갈수록 기능적 응집에 도달할수록 가장 이상적이라고 했다.


기능적 응집도를 가장 이상적으로 생각하고 


일반적으로 논리적 응집을 부분적으로 허용, 통신적 응집에 대해서도 목적 분산을 경계하면서도 사용하라고 하지만,


시간적 응집부터는 리팩토링의 대상임과 동시에 비판적으로 설명한다.


코드 컴플리트는 여기서 기능적 응집도를 이상으로 하면서


'한 루틴이 "한 가지" 작업만 수행할대 디버깅이 쉬워지고, 응집도의 저하의 징후로 루틴 이름에 and와 or가 포함되면, 너무 많은 매개 변수 또는 복자반 제어 흐름이 있다고 이야기한다.


코드 컴플리트에서 말하는 좋은 응집도를 만들면


'코드가 하나의 일에 집중'


'루틴 명이 설명을 대신함'


'수정이 국지적인 부분으로 국한됨'


'루틴 내 코드 라인들 간에 맥락성이 높다' 라고 이야기한다.


이제 결합도를 알아보자.




3eb8c87eabc236a14e81d2b628f1776cf2ff5c87

(Structured Design 1979년 책)

3eb8c87fabc236a14e81d2b628f17569f40a3c01

(코드 컴플리트에서 결합도)


전통적 결합도의 분류


결합도 종류설명
내용 결합 (Content Coupling)한 모듈이 다른 모듈의 내부(구현 세부사항)에 직접 접근하는 경우. 매우 강한 의존성을 가지며, 수정 시 외부 모듈에 직접 영향을 줌.
예: 함수 A가 함수 B 내부의 지역 변수나 private 함수를 직접 조작함.
공통 결합 (Common Coupling)여러 모듈이 전역 데이터를 공유하는 경우. 전역 상태를 누가 언제 수정하는지 추적이 어렵고, 부작용으로 디버깅이 힘들어짐.
예: 전역 변수 globalConfig를 여러 모듈이 동시에 참조하고 수정.
외부 결합 (External Coupling)외부 시스템, 포맷, 디바이스, 통신 규약에 의존하는 경우. 시스템 외부 변경이 내부 동작에 영향을 미칠 수 있음.
예: 파일 포맷, DB 스키마, 하드웨어 프로토콜 등과 강하게 묶인 코드.
제어 결합 (Control Coupling)한 모듈이 제어 플래그(조건)를 다른 모듈로 전달해서 내부 로직 흐름을 간접적으로 지시하는 경우. 의미 결합의 전조가 될 수 있음.
예: Process(flag)처럼 호출자가 내부 조건 분기를 지정.
스탬프 결합 (Stamp Coupling)전체 자료구조(예: 구조체, 클래스)를 전달하지만 일부 필드만 사용하는 경우. 불필요한 정보가 전달되어 결합도와 오해 가능성을 증가시킴.
예: Process(User user)에서 user.name만 씀.
데이터 결합 (Data Coupling)필요한 데이터만 인자로 전달하는 가장 이상적인 결합 형태. 모듈 간의 의존을 최소화하고 인터페이스가 명확함.
예: CalculateTax(income, regionCode)처럼 필요한 값만 전달.
결합 없음 (No Coupling)완전히 독립적인 모듈로, 서로 간에 어떤 정보도 공유하지 않음. 보통의 시스템 설계에서는 실질적으로는 존재하지 않지만, 테스트 모듈 등에서는 가능함.
예: 독립적으로 실행되는 유틸리티 함수.



 Code Complete 기반의 결합도 유형 정리

결합도 종류설명
단순 데이터 결합 (Simple-data-parameter Coupling)모듈 간에 전달되는 데이터가 모두 원시형(primitive)이고, 모두 매개변수(parameter)를 통해 전달되는 경우. 일반적으로 가장 이상적인 결합 형태.
단순 객체 결합 (Simple-object Coupling)한 모듈이 다른 객체를 단순히 인스턴스화하거나 직접 사용하는 수준의 결합. 내부 동작을 의존하지 않기 때문에 안전한 결합으로 간주됨.
객체 인자 결합 (Object-parameter Coupling)한 객체가 다른 객체를 통해 제3의 객체를 전달받아 사용하는 경우. 중간 객체는 전달될 객체의 존재와 의미를 알아야 하므로 결합이 더 타이트해짐.
의미 결합 (Semantic Coupling)한 모듈이 다른 모듈의 동작 방식이나 내부 로직을 암묵적으로 이해하고 있을 때 발생. 내부 동작에 대한 사전 지식이 없으면 올바로 사용할 수 없는, 가장 위험한 결합 형태.




결합도- 모듈간 의존성의 강도를 말한다


하지만 결합도는 1974년 Structured Design 논문에도 1979년  Structured Design 책에서도 나오지 않는다


왜일까? 결합도는 논문이 아니라 보완연구에서 분류 체계를 갖추었기때문이다


또한 코드 컴플리트에서는 결합도를 다르게 이야기한다.


왜?


코드 컴플리트가 쓰인 시기는 OOP가 메인이 되던 시기이기때문에, 


'맥락(Context) 기반의 결합도가 더 현실적이라고 여겨졌고, 객체간 협력의과 인터페이스 오용등 새로운 방법의 결합도가 도입됐다.


이러한 차이로 인해서 결합도의 분류 방법을 실전 중심으로 바꾼것이다.


전통적 결합도가 설계의 이론적 척도였다면


McConnell이 분류한 결합도는 실제 OOP 지향 개발에서 마주치는 코드간 잘못된 상호작용을 더 잘보여준다.


그리고 이 응집도와 결합도는 서로 상호작용하며, 우리의 코드 품질을 이해하는 도구가 된다.


가령 논리적 응집을 가진 모듈은 제어 결합(Control Coupling)을 유발할 가능성이 높다는 등 서로가 상호 보완적인 관점을 가진다.




3eb8c877b59c32b6699fe8b115ef04655682da3c


“프로그래머는 시인처럼, 순수한 사유(思考)의 재료 근처에서 일한다.
프로그래머는 허공에, 
상상력의 힘으로 허공의 성을 짓는다."

― 프레더릭 P. 브룩스 주니어, 『맨먼스 신화: 소프트웨어 공학에 대한 에세이』



끝맺으며



소프트웨어 설계의 역사는 모듈화 원칙의 진화사라고 할 수 있다.

1974년 Yourdon & Constantine이 제시한 응집도/결합도는 단순한 이론이 아니라, 거대 시스템 시대를 연 엔지니어들이 피땀으로 얻은 통찰이다.

코드를 분할한다는 것은 분해(decomposition)가 아니라, 새로운 추상화 계층을 창조하는 행위이다.


《Code Complete》이 강조하듯, 모듈화의 성패는

->"한 루틴이 한 문장으로 설명되는가?"(기능적 응집력)

->"변경 시 얼마나 적은 파일을 건드리는가?"(낮은 결합도)

라는 현실적 질문으로 환원된다.


그리고 이 개념들은 마이크로 서비스 아키텍쳐와 도커까지 수많은 곳으로 깊이 파고들어 곳곳에 퍼졌다. 


70년대 선구자들이 남긴 유산은 변하지 않았다.

모듈화는 여전히 소프트웨어 설계의 가장 강력한 무기이고,


우리는 선배 프로그래머의 지혜를 이어받아서 당시로썬 거대한 아키텍쳐를 다룰 수 있게 되었다.


그리고 프로그래머로써 선배 프로그래머의 말 한마디에 짧은 글귀를 하나 덧붙인다


우리는 허공에 코드를 짓는다. 하지만 그 허공은, 남이 이해할 수 있어야만 한다.


추천 비추천

8

고정닉 2

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 소속 연예인 논란에 잘 대응하지 못하는 것 같은 소속사는? 운영자 25/04/21 - -
2846163 상태 정리 해보기 ㅆㅇㅆ(124.216) 04.20 45 0
2846161 음기 충전 발명도둑잡기갤로그로 이동합니다. 04.20 41 0
2846160 피임 실패 공작 발명도둑잡기갤로그로 이동합니다. 04.20 38 0
2846159 삶과 전쟁 렌즈에 담던 여성 사진가, 이스라엘 공습으로 숨져 발명도둑잡기갤로그로 이동합니다. 04.20 39 0
2846155 콜드플레이의 음악이 언제나 우리 곁에 있는 이유 발명도둑잡기갤로그로 이동합니다. 04.20 48 0
2846154 요즘 개발자 취업 못한다는거 진짜임? [8] ㅇㅇ(211.234) 04.20 291 0
2846152 컴공 졸업햇는데 코딩 하나도 모르겟음 [2] 프갤러(106.101) 04.20 110 0
2846151 상태 격리를 시킬려면 데이터의 정렬화가 필요하니까 데이터 재분류하고 ㅆㅇㅆ(124.216) 04.20 42 0
2846149 돌아가지만 재 설계해본다 ㅆㅇㅆ(124.216) 04.20 55 0
2846147 코딩할때 타건감 맛있는 기계식 키보드 추천 ㄱㄴ? [1] 프갤러(58.127) 04.20 63 0
2846144 ada 말고 nim 은 어때? [2] ㅇㅇ(183.101) 04.20 50 0
2846143 기존의 주류 심리학은 틀렸다, <김태형의 교양 심리학> 발명도둑잡기갤로그로 이동합니다. 04.20 36 0
2846141 코드 짜면서 운동량 너무 줄어든거 같아서 이제부터 의자뺴고 컴퓨터한다 [2] ㅆㅇㅆ(124.216) 04.20 70 0
2846139 어떤 종교들은 인간이 일상을 감시 당하고 심판받는게 당연하다는 발명도둑잡기갤로그로 이동합니다. 04.20 39 0
2846135 거의 다 세팅해서 자료만 오면되는데 의뢰자가 연락 안받음 ㅆㅇㅆ(124.216) 04.20 49 0
2846134 분노에 찬 냥덩이는 어둠의 노예가 되는 길로 갔네 발명도둑잡기갤로그로 이동합니다. 04.20 31 0
2846133 전한길쌤 우리 사회 문제 .... 선거6.3 6.1일날 생각해볼께요. 넥도리아(175.196) 04.20 35 0
2846132 이다예-용기송 발명도둑잡기갤로그로 이동합니다. 04.20 32 0
2846128 코딩이 너무재밋어여 [6] PyTorch갤로그로 이동합니다. 04.19 104 0
2846122 개발쪽에서 GMT 타임존은 안 쓰지 ㅇㅅㅇ? [5] 강유현갤로그로 이동합니다. 04.19 76 0
2846120 난 어느순간부터 자기혐오때문에 고립되어버림... [3] ㅇㅇ(223.38) 04.19 53 0
2846118 두분 토론 [1] 발명도둑잡기갤로그로 이동합니다. 04.19 43 0
2846117 <늑대소년> 발명도둑잡기갤로그로 이동합니다. 04.19 37 0
2846116 가정용 제면기 발명도둑잡기갤로그로 이동합니다. 04.19 31 0
2846115 연봉별 1억 모으는데 걸리는 기간 발명도둑잡기갤로그로 이동합니다. 04.19 75 0
2846114 냥덩인간⭐+ ♥냥덩소프트♥갤로그로 이동합니다. 04.19 29 0
2846113 웹으로 졸업작품할건데 도대체뭐만들까..... [2] 프갤러(1.225) 04.19 69 0
2846112 CHIP-8 발명도둑잡기갤로그로 이동합니다. 04.19 28 0
2846110 [MV] Apink(에이핑크) _ Tap Clap 발명도둑잡기갤로그로 이동합니다. 04.19 27 0
2846109 하루종일 정처기실기기출돌다보니까 드는 생각 공기역학갤로그로 이동합니다. 04.19 72 0
2846108 유럽 저가 헤츠너 호스팅 발명도둑잡기갤로그로 이동합니다. 04.19 31 0
2846107 잠 못자면 정식적으로도 건강하지 못하게 되냐?? [3] ㅇㅇ(223.38) 04.19 54 0
2846106 서울대 출신 산부인과 의사가 알려주는 난임 발명도둑잡기갤로그로 이동합니다. 04.19 43 0
2846105 Reverse engineering of Logitech Unifying 발명도둑잡기갤로그로 이동합니다. 04.19 38 0
2846104 영어 공부 매일 하시는분? [1] ㅈㅁ(211.227) 04.19 41 0
2846103 박광배 그 사람도 변호사실에 항의 했는데, 형식적이더라. 30대 남자 넥도리아(175.196) 04.19 37 1
2846102 나 넥도리아 대한민국만 생각하면 눈물 흐르는 사람이야. 연평해전도 사서 30대 남자 넥도리아(175.196) 04.19 52 0
2846100 이준석 개혁신당 대표님은 갈등을 조정하자고 하신다. [1] 넥도리아(175.196) 04.19 71 0
2846096 devterm 사용기 발명도둑잡기갤로그로 이동합니다. 04.19 25 0
2846094 저 깨달았습니다 [13] 아스카영원히사랑해갤로그로 이동합니다. 04.19 354 8
2846092 가상 콘솔 게임기 픽셀비죤8 발명도둑잡기갤로그로 이동합니다. 04.19 30 0
2846090 토모가시마 서머타임렌더 ♥냥덩소프트♥갤로그로 이동합니다. 04.19 30 0
2846089 심심이 같은 여친 ai 어케만듬 [4] 뉴진파갤로그로 이동합니다. 04.19 61 0
2846087 단편영화 <콩나물> 발명도둑잡기갤로그로 이동합니다. 04.19 37 0
2846085 몸드름이랑 썩은내 존나심한사람 ㅇㅇㅇㅇ(49.254) 04.19 43 0
2846084 나님 겅부 점 하다 주무시려구 했는댕 피궁.. [1] ♥냥덩소프트♥갤로그로 이동합니다. 04.19 39 0
2846083 콜드플레이 (Coldplay) - Viva La Vida 발명도둑잡기갤로그로 이동합니다. 04.19 106 0
2846082 지피티 별거없네 [1] 프갤러(211.235) 04.19 58 0
2846081 갓샵 새 문법 좀 당혹스럽네 ㅇㅅㅇ [9] 강유현갤로그로 이동합니다. 04.19 104 0
2846080 c++로 제한 없는 정수형 타입 만드려는데 쉬움? [2] ㅇㅇ(106.101) 04.19 71 0
뉴스 ‘음주운전’ 김호중, 2심서도 징역 2년 6개월 선고…법원 “죄질 나빠” 디시트렌드 04.25
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2