디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(113.192) 2025.04.13 21:57:41
조회 525 추천 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/14 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 43311 65
2845949 어제 저녁 모 프갤러들과 나눈 한끼 식사 딱님갤로그로 이동합니다. 13:18 3 0
2845948 [ 나님 ] 카페가는 중 딱님갤로그로 이동합니다. 13:17 0 0
2845947 떠먹여주는 국가 포인트 발명도둑잡기갤로그로 이동합니다. 13:09 2 0
2845946 받는만큼 일하고 더 해주지 마라 [2] 프갤러(110.8) 12:48 20 0
2845945 회사, 개인 캘린더 따로 쓰시는분? ㅈㅁ(211.227) 12:42 10 0
2845944 [자유 대한민국] 염전노예의 진실 프갤러(121.172) 12:25 23 0
2845941 강간 ♥냥덩소프트♥갤로그로 이동합니다. 12:15 16 0
2845939 [자유 대한민국] 염전노예의 진실 프갤러(121.172) 12:13 12 0
2845935 llm으로 코딩 반자동화가 가능하겠는데..?? *루비*갤로그로 이동합니다. 12:04 24 0
2845934 50대 남성 일가족 살해 후 신상 공개 안되어 경기도 용인 30대 남자 넥도리아(175.196) 12:02 15 0
2845932 제미니한테 함수 작동 명세 주니까, 지가 막 코드 작성함 ㅎㅎ *루비*갤로그로 이동합니다. 11:58 21 0
2845930 인텔리센스가 안되노 ㅇㅇ(113.59) 11:56 25 0
2845929 장래희망을 잘못 골랐어 프갤러(49.165) 11:54 20 0
2845926 읽으려는책 주변 도서관 전부 대출중이네 [1] 프갤러(1.242) 11:44 15 0
2845925 트럼프 대통령 한덕수 대행과 직접 만남 희망 대선 최대 변수로 ♥냥덩소프트♥갤로그로 이동합니다. 11:40 13 0
2845924 와 대박이다 llm ㅎㅎ *루비*갤로그로 이동합니다. 11:38 15 0
2845923 유연한 설계=병신들의 밑닦이 되는 지름길 [1] 프갤러(110.8) 11:31 36 0
2845922 ai 누나... [1] ㅇㅇ(183.101) 11:24 24 0
2845921 설계를 단순하게 생각하면 [3] ㅇㅇ(14.56) 11:24 39 0
2845919 뉴프로 댓글알림 도입안내 [10] 헬마스터갤로그로 이동합니다. 11:14 50 0
2845918 기술중심 사고란- 프갤러(121.172) 11:12 36 0
2845917 거이씝 존나리 덥넹 ♥냥덩소프트♥갤로그로 이동합니다. 11:11 13 0
2845916 잔다 ㅇㅅㅇ [2] ㅇㅅㅇ(121.157) 11:10 19 0
2845915 기술 커뮤니티는 구조중심 사고가 일종의 우월성 취급이라 그런걸까 [3] ㅆㅇㅆ(124.216) 11:07 46 0
2845914 [자유 대한민국] 이재명 최강의 권력자로 등극하는가? [1] 프갤러(121.172) 11:06 25 1
2845913 야 근데 갤에 지피티한테 나를 분석해줘<<라고 올라오는 애들 글 봤는데 [2] ㅆㅇㅆ(124.216) 11:00 37 0
2845912 지피티한테 상호작용했던 내용들을 바탕으로 나를 분석해달라고 해봤어 [1] ㅇㅇ(223.38) 10:53 21 0
2845911 솔직히 지금 AI 멍청해서 안도한 것도 있음 [2] ㅇㅇ(14.56) 10:51 39 0
2845910 나님 조만간 다시 장거리 뛰뛰 하실 예정⭐+ [4] ♥냥덩소프트♥갤로그로 이동합니다. 10:48 25 0
2845909 로보트한테 이모티콘을 쓸 필요가 있나? [2] 발명도둑잡기갤로그로 이동합니다. 10:47 18 0
2845908 [애니 뉴스] 문화 콘텐츠의 중심 프갤러(121.172) 10:46 25 0
2845907 AI는 그냥 지금 조립불가능한 부품 생성기임. ㅆㅇㅆ(124.216) 10:44 28 0
2845905 물리에 관심을 가지면 세상을 다른 시각으로 보게 됨 [4] ㅇㅇ(14.56) 10:31 49 0
2845904 보통 젠킨스 쓰는 용도가 빌드셔틀임 ㅇㅅㅇ? [9] 강유현갤로그로 이동합니다. 10:30 37 0
2845903 AI 그냥 검색만해도 환각 존나 심하고, 틀린 내용도 꽤 많은데다가 [3] ㅆㅇㅆ(124.216) 10:24 39 0
2845902 유튜브 영상제작 <---이런거 배우는데 시간이 ㅇㅇ(183.97) 10:22 19 0
2845901 [실화]나는 살면서 천재를 한명 본 적 있음 [3] 아스카영원히사랑해갤로그로 이동합니다. 10:20 56 0
2845900 화교 커리큘럼 프갤러(211.210) 10:19 15 0
2845899 나는 내가 아이큐가 딸려서 그른가 솔직히 뭐 그러려니하게되던데 ㅆㅇㅆ(124.216) 10:12 24 0
2845897 cursor 개비싸네 ㅇㅅㅇ 뉴진파갤로그로 이동합니다. 10:04 23 0
2845896 내가 좋아하는 언어는 C#인데, 막상 돈 벌어주는 언어는 파이썬임 [3] ㅆㅇㅆ(124.216) 10:00 52 0
2845895 쿼티 개불편해서 다시 드보락 쓰는 중. *루비*갤로그로 이동합니다. 09:57 15 0
2845894 difficult 와 faculty 어원이 같구나 발명도둑잡기갤로그로 이동합니다. 09:55 12 0
2845893 아.. 오늘 내일 중으로 끝내는 걸 목표로 해야지 *루비*갤로그로 이동합니다. 09:55 12 0
2845891 두피타투 하고왔더니 코딩이 갑자기 잘된다 카드캡터체리갤로그로 이동합니다. 09:52 17 0
2845890 제미니한테 혼나니까 기분 꿀꿀하네 ㅎㅎ *루비*갤로그로 이동합니다. 09:51 18 0
2845889 자유 민주주의 VS 공산주의 프갤러(121.172) 09:50 16 1
2845888 포인터 쉽다고 지랄 발광하더니 딱 그 정도 수준만 써왔나보구나 [1] 프갤러(110.8) 09:48 38 0
2845887 빌드봇은 보통 어떤일함? ㅇㅇ갤로그로 이동합니다. 09:45 12 0
뉴스 장윤주 심은데 장윤주 났다…8세 딸의 비범한 패션센스 ‘눈길’ 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2