기준에 의한 리팩토링 - 응집도가 높은지를 판단하는 척도

오브젝트<조영호> 책의 내용에 근거해 코드를 리팩토링 하고 있습니다. 책에 있는 내용을 잘 정리 해놓은 블로그가 있어서 참고하고 있는데 포스팅 저자님께서 '응집도가 높고 낮음'을 판단하는 부분에 대해 코드를 다음번에 올려주신다고 하여 제가 직접 찾아보고 이 포스팅을 작성 합니다.

 

오브젝트 | 조영호 - 모바일교보문고

 

용어 정리

응집도(Cohesion) - 모듈 또는 클래스의 내부 요소들이 얼마나 밀접하게 관련되어 있는지를 나타내는 개념입니다. 높은 응집도는 밀접한 관련성을 나타내며, 낮은 응집도는 모듈이나 클래스의 내부 요소들 간의 관련성이 낮음을 나타냅니다.
 

결합도(Coupling) - 모듈 또는 클래스 간의 상호 의존성을 나타내는 개념입니다. 높은 결합도는 모듈이나 클래스 간에 강력한 의존성을 나타내며, 낮은 결합도는 모듈이나 클래스 간에 약한 의존성을 나타냅니다.

 

 

응집도의 높고 낮음을 판단하는 조건

다음 내용은 아래 블로그에서 발췌한 내용입니다.

 


응집도 관련한 기준들이 몇가지 있습니다. 응집도가 낮을수록 유연하지 않은 설계입니다.
응집도가 높고 낮음을 판단하기 위한 척도가 필요하겠죠?


1.클래스가 하나 이상의 이유로 변경되야 한다면 응집도가 낮다
2.클래스의 인스턴스들을 초기화하는 시점에 경우에 따라 서로 다른 속성을 초기화 하면 클래스를 분리해야 한다
3.메서드들이 인스턴스 변수를 사용하는 정도가 높다면 응집도가 낮은 것이다

 

https://huisam.tistory.com/entry/Object

 예제 코드를 첨부 합니다.

 

1. 클래스가 하나 이상의 이유로 변경되야 한다면 응집도가 낮다

낮은 응집도의 예시: 하나의 클래스가 여러 가지 역할을 수행하며 변경되어야 하는 경우
높은 응집도의 예시: 하나의 클래스가 특정 기능이나 책임을 담당하고 있어서 해당 기능이 변경될 때만 클래스가 변경되는 경우

 

// 낮은 응집도의 예시
class MixedResponsibilitiesClass {
    void processPayment() {
        // payment processing logic
    }
    
    void generateReport() {
        // report generation logic
    }
}
// 높은 응집도의 예시
class PaymentProcessor {
    void processPayment() {
        // payment processing logic
    }
}

class ReportGenerator {
    void generateReport() {
        // report generation logic
    }
}

 

2. 클래스의 인스턴스들을 초기화하는 시점에 경우에 따라 서로 다른 속성을 초기화하면 클래스를 분리해야 한다.

초기화 로직이 서로 다른 속성을 다뤄야 하는 경우 클래스를 분리하는 것이 바람직합니다.

// 초기화 로직이 서로 다른 속성을 다루는 클래스
class MixedInitializationClass {
    private String name;
    private int age;
    
    MixedInitializationClass(String name) {
        this.name = name;
        // name에 따라 다른 초기화 로직 수행
        if (name.equals("John")) {
            // John에 대한 초기화
        } else {
            // 다른 경우에 대한 초기화
        }
    }
}

 

// 초기화 로직이 서로 다른 속성을 다루는 클래스를 분리
class Person {
    private String name;
    private int age;
    
    Person(String name) {
        this.name = name;
        // 초기화 로직 수행
    }
}

class JohnInitializer {
    void initialize(Person person) {
        // John에 대한 초기화 로직
    }
}

class OtherPersonInitializer {
    void initialize(Person person) {
        // 다른 경우에 대한 초기화 로직
    }
}

 

3. 메서드들이 인스턴스 변수를 사용하는 정도가 높다면 응집도가 낮은 것이다.

클래스의 메서드가 클래스의 인스턴스 변수를 자주 사용한다면, 클래스는 여러 책임을 수행하는 것으로 간주할 수 있습니다.

 

// 메서드가 인스턴스 변수를 자주 사용하는 클래스
class HighCouplingClass {
    private int value;

    HighCouplingClass(int value) {
        this.value = value;
    }

    void process() {
        // value를 사용하는 로직
    }

    void update() {
        // value를 업데이트하는 로직
    }
}

 

인스턴스 변수였던 value를 파라메터로 변경하여 리팩터링

// 메서드가 인스턴스 변수를 사용하지 않고 외부에서 주입받아 사용하는 클래스
class LowCouplingClass {
    void process(int value) {
        // 주어진 value를 사용하는 로직
    }

    void update(int value) {
        // 주어진 value를 업데이트하는 로직
    }
}

Read more

Claude Code와 Obsidian MCP 연동 가이드

Claude Code와 Obsidian MCP 연동 가이드

소개 Claude Code는 Anthropic의 공식 CLI 도구로, MCP(Model Context Protocol)를 통해 다양한 외부 도구와 연동할 수 있습니다. 이 가이드에서는 Claude Code와 Obsidian을 연동하여 AI 에이전트가 여러분의 노트를 읽고 편집할 수 있도록 설정하는 방법을 소개합니다. MCP(Model Context Protocol)란? MCP는 AI 모델이 외부 데이터 소스 및 도구와 상호작용할

By Kyeongrok.kim
기술뉴스, 2025-09-25

기술뉴스, 2025-09-25

끝없이 수정하다 AI 성과 무너뜨린다··· ‘둠프롬프팅’의 함정최근 LLM과 AI 에이전트 결과물을 무한 반복 수정하는 ‘둠프롬프팅’ 현상이 관찰되고 있다. 이는 성과 저하와 막대한 비용을 초래할 수 있다.CIOGrant Gross초보를 위한 Claude Code 안내서Claude Code의 등장으로 코딩의 패러다임이 완전히 바뀌었습니다. AI 시대의 개발이란? 개발자의 역할은 무엇일까요?Subicura's BlogsubicuraShould we revisit Extreme

By Hyonsok
[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

개발자라면 한 번쯤 들어봤을 말, "Don't Repeat Yourself", 줄여서 DRY 원칙. 이건 소프트웨어 개발에서 아주 중요한 원칙이에요. 중복을 줄이면 버그도 줄고, 유지 보수도 쉬워지고, 코드도 깔끔해지죠. 그런데… Terraform 같은 IaC 세계에서도 DRY가 무조건 좋을까요? 🤔 DRY가 뭔데? DRY 원칙의 핵심은 딱 하나: "같은 걸 반복해서 쓰지 마." * 상수 값, 로직, 설정

By Chansong