363. 객체지향 메트릭 (CK 메트릭스) - WMC, DIT, NOC, CBO, RFC, LCOM

핵심 인사이트 (3줄 요약)

  1. 본질: CK 메트릭스(CK Metrics)는 1994년 Chidamber와 Kemerer가 제안한 6가지 객체지향 소프트웨어度量指標 체계로, 클래스와 메서드의 복잡도, 상속 구조, 결합도를 측정하여 객체지향 설계 품질을定量的으로 평가한다.
  2. 가치: 높은 결합도(CBO)나 낮은 응집도(LCOM)는 유지보수 어려움을 의미하며, 깊은 상속 트리(DIT)는 예층치 못한 버그 전파 위험이 있다. 따라서 설계 단계에서 CKメ트릭스를 분석하면 기술 부채를早期 발견할 수 있다.
  3. 융합: SonarQube, JDepend 등 정적 분석 도구가 자동 계산하여 CI/CD 파이프라인에서 활용되며, 아키텍처评审(ATAM)과 결합되어 설계 의사결정의定量的 근거로 활용된다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: CK 메트릭스는 객체지향 프로그래밍의 특성을 반영한 품질 지표로, 전통적인 순환 복잡도나 코드 행 수(LOC)와 달리 클래스 간 관계, 상속 깊이, 메서드 복잡도를 측정한다. 이는 객체지향 설계가 "객체"와 그들 간의 "관계"를核心으로 하기 때문이다.

  • 필요성:オブジェクト指向設計が優れていても、数値化しなければ改善の余地がある。 CK Metricsを適用하면 "このクラスは結合度が高すぎて変更が難しい"とか "この継承階層は深すぎてテストが困难"などの問題を客观的に指摘できる。

  • 💡 비유: CK 메트릭스는 **'건물 구조 건강검진 결과지'**와 같다. 건물도 구조적으로 문제가 없으면 층간 소음이 적고(결합도 낮음), 공간 활용이 효율적이지만(응집도 높음), 설계가 잘못되면 한 벽을 허물면 전체 건물이 흔들린다. CK Metrics는 객체지향 程序의 이러한 구조적 건강을 측정한다.

  • 등장 배경 및 발전 과정:

    1. 1994년 CK 제안: Chidamber와 Kemerer가 "A Metrics Suite for Object Oriented Design" 논문에서 6가지 Metrics 제안
    2. 2000년대 도구화: JDepend, SonarQube 등이 CK Metrics 자동 계산 기능 제공
    3. 현재: 애자일/TDD 시대에 리팩토링 판단 기준으로 널리 활용
  • 📢 섹션 요약 비유: CK 메트릭스는 **'아파트 단지의 구조 검사 결과지'**이다. 어떤 동(클래스)은 층간 방음이 잘 되고(결합도 낮음), 각 세대(메서드)가 독립적으로 생활하므로(응집도 높음) 편안하지만, 어떤 동은 벽이 다 들이끼며(강한 결합), 하나가 고장나면 전체에 영향(높은 CBO)이라 개선이 필요하다.


Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

6가지 CK Metrics 상세

┌─────────────────────────────────────────────────────────────────┐
│                    CK 메트릭스 6가지 지표                                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  1. WMC (Weighted Methods per Class)                                 │
│     - 클래스의 모든 메서드 복잡도(순환 복잡도) 합계                           │
│     - WMC = Σ V(G) 각 메서드                                      │
│     - 값이 높으면: 해당 클래스가 수행하는 일이 많고 복잡함을 의미             │
│                                                                 │
│  2. DIT (Depth of Inheritance Tree)                                   │
│     - 클래스 상속 트리의 최대 깊이                                        │
│     - 루트 클래스에서 가장 먼 자손 클래스까지의 단계 수                       │
│     - 값이 높으면: 상속으로 인한 예측 불가능성 증가, 테스트 복잡도 상승          │
│                                                                 │
│  3. NOC (Number of Children)                                        │
│     - 해당 클래스를 직접 상속받는 하위 클래스(자식) 수                         │
│     - 값이 높으면: 해당 클래스가 중요하고, 변경 시 영향 범위가 넓음을 의미       │
│                                                                 │
│  4. CBO (Coupling Between Object classes)                           │
│     - 다른 클래스와 결합하는 수 (외부 참조 수)                              │
│     - CBO = 특정 클래스가 참조하는 클래스 수 + 특정 클래스를 참조하는 클래스 수   │
│     - 값이 높으면: 변경 시 전파 영향 범위가 넓어 유지보수 어려움                │
│                                                                 │
│  5. RFC (Response for a Class)                                      │
│     - 클래스의 메서드 수 + 호출 가능한 메서드 수                             │
│     - RFC = |R1|  (해당 클래스의 메서드 수)                              │
│            + |R2|  (외부 클래스 메서드를 호출하는 수)                        │
│     - 값이 높으면: 클래스 행위 범위가 넓어 테스트해야 할 시나리오 증가          │
│                                                                 │
│  6. LCOM (Lack of Cohesion in Methods) ★핵심                          │
│     - 메서드 간 non-cohesiveness 정도                                │
│     - LCOM 값이 높으면: 메서드들이 서로 다른 데이터를 사용하여 응집도 낮음       │
│     - LCOM > 0.5~1 이면: 클래스 분할 권장                               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

CK Metrics 계산 예시

[클래스 구조 예시]

class Animal {                // WMC = 3 (eat, sleep, move 3개 메서드 각 V(G)=1)
    String name;               // DIT = 1 (Animal이 루트)
    void eat() { ... }         // NOC = 2 (Dog, Cat가 상속)
    void sleep() { ... }       // CBO = ? (내부 구현에 따름)
    void move() { ... }        // RFC = ?
}

class Dog extends Animal {      // WMC = 2 (bark 추가)
    void bark() { ... }        // DIT = 2 (Animal->Dog)
    void eat() { ... }         // NOC = 0 (자식 클래스 없음)
}                              // CBO, RFC 내부 구현에 따라 계산

class Cat extends Animal {      // WMC = 2 (purr 추가)
    void purr() { ... }        // DIT = 2 (Animal->Cat)
}                              // NOC = 0

[ Animal 클래스의 CK Metrics ]
- WMC = 3          (3개 메서드의 복잡도 합계)
- DIT = 1          (상속 트리 깊이 1단계)
- NOC = 2          (Dog, Cat 2개 자식)
- CBO = 낮음       (Animal은 거의 다른 클래스를 참조하지 않음)
- RFC = 작음       (외부 호출 가능한 메서드가 적음)
- LCOM = 낮음      (eat, sleep, move 모두 name 필드를 공유)

[다이어그램 해설] CK Metrics는 클래스 다이어그램을 입력으로 하여 각 지표를 계산한다. 상속 트리 깊이(DIT)가 깊어질수록 하위 클래스의 행위를 예측하기 어렵고, 결합도(CBO)가 높을수록 한 클래스의 변경이 다른 클래스에 미치는 영향이 커진다.


Ⅲ. 구현 및 실무 응용 (Implementation & Practice)

권장 임계값

Metrics권장 범위위험 시 임계값
WMC낮을수록 좋음> 10~20
DIT2~5 이하> 6
NOC중간 정도 (2~5)> 10 (변경 영향过大)
CBO낮을수록 좋음> 10~15
RFC낮을수록 좋음> 50
LCOM0에 가까울수록 좋음> 0.5~0.7

리팩토링 연관성

문제 징후권장 리팩토링
WMC 높음메서드 추출 (Extract Method), 클래스 분할
DIT 너무 깊음상속 구조를 구성(Composition)으로 전환 검토
CBO 너무 높음관찰索要分离 (Tell, Don't Ask), 중개자 제거
LCOM 높음메서드와 데이터再配置, 새 클래스로 분리
RFC 높음rait_on_Demand (필요할 때만 로드) 적용

도구 활용

도구제공 Metrics특징
SonarQubeWMC, CBO, LCOM, RFCCI/CD 통합, 품질 대시보드
JDependCBO, DIT, NOCJava专用, 의존성 분석
IntelliJ IDEA모든 CK MetricsIDE 내 실시간 분석

Ⅳ. 품질 관리 및 테스트 (Quality & Testing)

CK Metrics와 품질 속성 관계

품질 속성연관 Metrics영향 방향
유지보수성CBO, LCOMCBO 높으면 유지보수 어려워짐
테스트 용이성RFC, WMC높을수록 테스트 케이스 증가
재사용성DIT, CBODIT 높으면 재사용 어려워짐
신뢰성DIT깊을수록 결함 전파 위험 증가

설계 문제 진단 흐름

┌─────────────────────────────────────────────────────────────────┐
│                    CK Metrics 설계 진단 흐름                                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  [1단계: 측정]                                                     │
│     SonarQube로 프로젝트 전체 CK Metrics 수집                          │
│                                                                 │
│  [2단계: 임계값 비교]                                                │
│     CBO > 15 ? ──Yes──> 🚨 높은 결합도 의심                           │
│         │                                                          │
│     LCOM > 0.7 ? ──Yes──> 🚨 낮은 응집도 의심                         │
│         │                                                          │
│     DIT > 6 ? ──Yes──> 🚨 깊은 상속 트리 의심                        │
│         │                                                          │
│  [3단계: 타겟 선정]                                                 │
│     문제 클래스를 우선순위화하여 리팩토링 타겟 결정                        │
│                                                                 │
│  [4단계: 개선 후 측정]                                               │
│     개선 전/후 Metrics 비교하여 개선 효과 검증                         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: CK Metrics는 **'아파트 단지의 건강검진 6가지 지표'**이다. 층간 소음(결합도 CBO), 세대 내 공간 활용도(응집도 LCOM), 빌딩 높이(상속 깊이 DIT), 세대 수(자식 수 NOC), 각 세대의 가전제품 수(메서드 수 WMC), 외부와의 교류 빈도(RFC)를 종합적으로 보면 단지의 구조적 건강이 완전하게 평가된다.

최신 동향

  1. AI 기반 설계 분석: LLM이 클래스 다이어그램을 분석하여 CK Metrics를予測し、设计の問題을 사전에 지적
  2. 마이크로서비스 환경 적용: 모놀리스 → MSA 전환 시, 서비스 간 결합도를 CBO 개념으로 확장하여 분석
  3. 정량적 아키텍처 의사결정: ATAM(Architecture Trade-off Analysis Method)에 CK Metrics를 결합하여 설계 대안 비교

한계점 및 보완

  • 동적特性 무시: 런타임 다형성으로 인한 복잡도는 포착 불가
  • 언어 차이: 언어 특성에 따라 Metrics 해석이 다를 수 있음 (e.g., Python은 동적 타입)
  • 정밀한 응집도 측정 어려움: LCOM alone으로는正確な 응집도 평가가 어려워, 결합도(CBO)와 함께 해석 필요

CK 메트릭스는 객체지향 설계 품질을定量的으로評価하는 핵심 도구이다. 단일 Metrics로 판단하지 않고, 6가지 Metrics를 종합적으로 분석하여 설계 문제를早期発見하고 리팩토링의 근거로 활용해야 한다. 특히 CBO(결합도)와 LCOM(응집도)은 객체지향設計의核心 원칙이므로, 이 두 가지 Metrics에 우선적으로注目하여 유지보수 가능한 소프트웨어 개발에 기여해야 한다.

  • 📢 섹션 요약 비유: CK Metrics는 **'축구팀 전술 건강검진 6가지 지표'**와 같다. 각 선수의 능력(WMC), 팀의 전술 체계 깊이(DIT), 상대 팀의 전술 종류(자식 수 NOC), 선수 간連携程度(결합도 CBO), 경기 중 가능한 대응 전술 수(RFC), 같은 공을 향한 노력의 일치도(응집도 LCOM)를 종합적으로 보면 그 팀의戰闘力を客观적으로 평가할 수 있다.

참고

  • 모든 약어는 반드시 전체 명칭과 함께 표기: API (Application Programming Interface)
  • 일어/중국어 절대 사용 금지 (한국어만 사용)
  • 각 섹션 끝에 📢 요약 비유 반드시 추가
  • ASCII 다이어그램의 세로선 │와 가로선 ─ 정렬 완벽하게
  • 한 파일당 최소 800자 이상의 실질 내용