모듈의 결합도와 응집도

반응형
SMALL

모듈

  • 모듈은 모듈화를 통해 분리된 시스템의 각 기능으로, 서브 루틴, 서브 시스템, 소프트웨어 내의 프로그램, 작업 단위 등을 의미한다.
  • 모듈의 기능적 독립성은 소프트웨어를 구성하는 각 모듈의 기능이 서로 독립됨을 의미한다.
  • 하나 또는 몇 개의 논리적인 기능을 수행하기 위한 명령어들의 집합이라고도 할 수 있다.
  • 모듈의 독립성은 결합도와 응집도에 의해 측정된다.

결합도

  • 결합도는 모듈 간에 상호 의존하는 정도 또는 두 모듈 사이의 연관 관계이다.
  • 결합도가 약할수록 품질이 높고, 강할수록 품질이 낮다.
  • 결합도의 종류와 강도
  • 내용 결합도>>공통 결합도>> 외부 결합도>> 제어 결합도>> 스템프 결합도>> 자료 결합도
  • 짜로 외제스탬프 찍고 자료 받는다.

결합도의 종류

  • 내용 결합도
    • 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정할 때의 결합도이다.
    // A 모듈
    class ModuleA {
        public int data = 42;
    }
    
    // B 모듈 (내용 결합도: A 모듈의 내부 데이터에 직접 접근)
    class ModuleB {
        public void modifyAData(ModuleA moduleA) {
            moduleA.data = 99;  // A 모듈의 내부 데이터를 직접 수정
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleA moduleA = new ModuleA();
            ModuleB moduleB = new ModuleB();
            
            System.out.println("Before modification: " + moduleA.data);  // 42 출력
            moduleB.modifyAData(moduleA);
            System.out.println("After modification: " + moduleA.data);   // 99 출력
        }
    }
    
    
  • 공통 결합도
    • 공유되는 공통 데이터 영역을 여러 모듈이 사용할 때의 결합도이다.
    • 파라미터가 아닌 모듈 밖에 선언된 전역 변수를 사용하여 전역 변수를 갱신하는 방식으로 상호작용하는 때의 결합도이다.
    // 전역 변수 (공통 결합도)
    public class SharedData {
        public static int sharedData = 0;
    }
    
    // A 모듈
    class ModuleA {
        public void modifySharedData() {
            SharedData.sharedData = 10;  // 전역 변수 수정
        }
    }
    
    // B 모듈
    class ModuleB {
        public void printSharedData() {
            System.out.println("Shared Data: " + SharedData.sharedData);  // 전역 변수 참조
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleA moduleA = new ModuleA();
            ModuleB moduleB = new ModuleB();
            
            moduleA.modifySharedData();  // 전역 변수 수정
            moduleB.printSharedData();   // 전역 변수 출력
        }
    }
    
    
    Shared Data: 10
    
    
  • 외부 결합도
    • 어떤 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도이다.
    // A 모듈에서 변수 선언
    public class ModuleA {
        public static int externalData = 5;
    }
    
    // B 모듈 (외부 결합도: A 모듈에서 선언한 변수를 참조)
    class ModuleB {
        public void useExternalData() {
            System.out.println("External Data: " + ModuleA.externalData);  // 외부에서 선언된 변수를 참조
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleB moduleB = new ModuleB();
            moduleB.useExternalData();  // 외부 변수를 참조하여 출력
        }
    }
    
    
    External Data: 5
    
    
  • 제어 결합도
    • 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해 제어 신호나 제어 요소를 전달하는 결합도이다.
    // A 모듈
    class ModuleA {
        public void controlFunction(String controlSignal) {
            if ("START".equals(controlSignal)) {
                System.out.println("Start operation");
            } else if ("STOP".equals(controlSignal)) {
                System.out.println("Stop operation");
            }
        }
    }
    
    // B 모듈 (제어 결합도: A 모듈에 제어 신호 전달)
    class ModuleB {
        public void sendControlSignal() {
            ModuleA moduleA = new ModuleA();
            moduleA.controlFunction("START");  // 제어 신호 전달
            moduleA.controlFunction("STOP");   // 제어 신호 전달
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleB moduleB = new ModuleB();
            moduleB.sendControlSignal();  // 신호에 따른 동작 출력
        }
    }
    
    
    Start operation
    Stop operation
    
    
    • 하위 모듈에서 상위 모듈로 제어 신호가 이동하여 하위 모듈이 상위 모듈에게 처리 명령을 내리는 권리 전도 현상이 발생하게 된다.
  • 스템프(검인) 결합도
    • 모듈 간의 인터페이스로 배열이나 레코드 등의 자료 구조가 전달될 때의 결합도이다.
    // 데이터 구조 (예: HashMap)
    import java.util.HashMap;
    import java.util.Map;
    
    // A 모듈
    class ModuleA {
        public void processData(Map<String, Object> info) {
            System.out.println("Name: " + info.get("name") + ", Age: " + info.get("age"));
        }
    }
    
    // B 모듈 (스템프 결합도: 자료 구조를 전달)
    class ModuleB {
        public void sendData() {
            Map<String, Object> dataStructure = new HashMap<>();
            dataStructure.put("name", "Alice");
            dataStructure.put("age", 30);
            
            ModuleA moduleA = new ModuleA();
            moduleA.processData(dataStructure);  // B 모듈에서 자료 구조 전달
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleB moduleB = new ModuleB();
            moduleB.sendData();  // 전달된 자료 출력
        }
    }
    
    
    Name: Alice, Age: 30
    
    
  • 자료 결합도
    • 모듈 간의 인터페이스가 자료 요소로만 구성될 때의 결합도이다.
    // A 모듈
    class ModuleA {
        public void processValue(int value) {
            System.out.println("Value: " + value);
        }
    }
    
    // B 모듈 (자료 결합도: 단순 데이터 전달)
    class ModuleB {
        public void sendValue() {
            ModuleA moduleA = new ModuleA();
            moduleA.processValue(42);  // B 모듈에서 단일 데이터 전달
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ModuleB moduleB = new ModuleB();
            moduleB.sendValue();  // 단일 값 출력
        }
    }
    
    
    Value: 42
    
    

응집도

  • 응집도는 모듈의 내부 요소들이 서로 관련되어 있는 정도이다.
  • 응집도가 강할 수록 품질이 높고, 약할 수록 품질이 낮다.
  • 기능적 응집도>> 순차적 응집도>> 교환적 응집도>> 절차적 응집도>> 시간적 응집도>> 논리적 응집도>> 우연적 응집도
  • 능을 서대로 환하고 대적으로 간의 리를 려한다

응집도의 종류

  • 기능적 응집도
    • 모듈 내부의 모든 기능 요소들이 단일 문제와 연관되어 수행될 경우의 응집도이다.
    // A 모듈: 기능적 응집도 (로그인 관련 모든 기능을 포함)
    class UserAuthentication {
        public void login(String username, String password) {
            if (authenticate(username, password)) {
                System.out.println("Login successful!");
            } else {
                System.out.println("Login failed.");
            }
        }
    
        private boolean authenticate(String username, String password) {
            // 간단한 인증 로직
            return "user".equals(username) && "password".equals(password);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            UserAuthentication auth = new UserAuthentication();
            auth.login("user", "password");
        }
    }
    Login successful!
    
    
  • 순차적 응집도
    • 모듈 내 하나의 활동으로부터 나온 출력 데이터를 그 다음 활동의 입력 데이터로 사용할 경우의 응집도이다.
    // A 모듈: 순차적 응집도 (텍스트 처리 후 저장)
    class TextProcessor {
        public void process(String input) {
            String cleaned = clean(input);
            String formatted = format(cleaned);
            save(formatted);
        }
    
        private String clean(String text) {
            return text.trim();  // 공백 제거
        }
    
        private String format(String text) {
            return text.toUpperCase();  // 대문자로 변환
        }
    
        private void save(String text) {
            System.out.println("Saved: " + text);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            TextProcessor processor = new TextProcessor();
            processor.process("  Hello World  ");
        }
    }
    
    
    Saved: HELLO WORLD
    
    
  • 교환[통신]적 응집도
    • 동일한 입력과 출력을 사용하여 서로 다른 기능을 수행하는 구성 요소들이 모였을 경우의 응집도이다.
    // A 모듈: 교환적 응집도 (같은 데이터를 사용하여 서로 다른 처리)
    class DataHandler {
        public void printData(String data) {
            System.out.println("Printing: " + data);
        }
    
        public void saveData(String data) {
            System.out.println("Saving: " + data);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            DataHandler handler = new DataHandler();
            String data = "Report";
    
            handler.printData(data);  // 데이터 출력
            handler.saveData(data);   // 데이터 저장
        }
    }
    
    
    Printing: Report
    Saving: Report
    
    
  • 절차적 응집도
    • 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우의 응집도이다.
    // A 모듈: 절차적 응집도 (회원 가입 절차)
    class UserRegistration {
        public void register(String username, String password, String email) {
            validate(username, password, email);
            createAccount(username, password, email);
            sendConfirmationEmail(email);
        }
    
        private void validate(String username, String password, String email) {
            System.out.println("Validating user information...");
        }
    
        private void createAccount(String username, String password, String email) {
            System.out.println("Creating user account...");
        }
    
        private void sendConfirmationEmail(String email) {
            System.out.println("Sending confirmation email to " + email);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            UserRegistration registration = new UserRegistration();
            registration.register("user123", "password", "user@example.com");
        }
    }
    
    
    Validating user information...
    Creating user account...
    Sending confirmation email to user@example.com
    
    
  • 시간적 응집도
    • 특정 시간에 처리되는 몇 개의 기능을 모아 하나의 모듈로 작성할 경우의 응집도이다.
    // A 모듈: 시간적 응집도 (프로그램 초기화 시 필요한 작업)
    class Initialization {
        public void initialize() {
            loadConfiguration();
            connectToDatabase();
            initializeCache();
        }
    
        private void loadConfiguration() {
            System.out.println("Loading configuration...");
        }
    
        private void connectToDatabase() {
            System.out.println("Connecting to database...");
        }
    
        private void initializeCache() {
            System.out.println("Initializing cache...");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Initialization init = new Initialization();
            init.initialize();
        }
    }
    
    
    Loading configuration...
    Connecting to database...
    Initializing cache...
    
    
  • 논리적 응집도
    • 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들로 하나의 모듈이 형성되는 경우의 응집도이다.
    // A 모듈: 논리적 응집도 (다양한 에러 처리를 위한 모듈)
    class ErrorHandler {
        public void handleError(int errorCode) {
            if (errorCode == 404) {
                handleNotFound();
            } else if (errorCode == 500) {
                handleServerError();
            } else {
                handleUnknownError();
            }
        }
    
        private void handleNotFound() {
            System.out.println("Handling 404 Not Found error...");
        }
    
        private void handleServerError() {
            System.out.println("Handling 500 Server error...");
        }
    
        private void handleUnknownError() {
            System.out.println("Handling unknown error...");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            ErrorHandler errorHandler = new ErrorHandler();
            errorHandler.handleError(404);  // 404 에러 처리
            errorHandler.handleError(500);  // 500 에러 처리
        }
    }
    
    
    Handling 404 Not Found error...
    Handling 500 Server error...
    
    
  • 우연적 응집도
    • 모듈 내부의 각 구성 요소들이 서로 관련 없는 요소로만 구성된 경우의 응집도이다.
    // A 모듈: 우연적 응집도 (서로 관련 없는 기능들이 모여 있는 모듈)
    class MiscellaneousTasks {
        public void openFile() {
            System.out.println("Opening file...");
        }
    
        public void connectToNetwork() {
            System.out.println("Connecting to network...");
        }
    
        public void logMessage(String message) {
            System.out.println("Logging: " + message);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MiscellaneousTasks tasks = new MiscellaneousTasks();
            tasks.openFile();             // 파일 열기
            tasks.connectToNetwork();     // 네트워크 연결
            tasks.logMessage("Hello!");   // 메시지 기록
        }
    }
    
    
    Opening file...
    Connecting to network...
    Logging: Hello!
    
    
    팬인/팬아웃
  • 팬인은 어떤 모듈을 제어하는 모듈의 수
  • 팬아웃은 어떤 모듈에 의해 제어되는 모듈의 수
반응형
LIST