본문 바로가기
정보처리기사

[정보처리기사] 응집도와 결합도 - 이건 꼭 알아야함

by 공불러 2024. 1. 18.
728x90
반응형

[정보처리기사] 응집도와 결합도 - 이건 꼭 알아야함

목차

    모듈이란?

    모듈은 프로그램을 구성하는 독립적이고 재사용 가능한 부분입니다. 코드를 논리적으로 분리하여 관리하고 유지보수하기 쉽게 만드는 또다른 프로그램.

     

    우리가 흔히 마주할 수 있는 모듈은 결제 모듈을 예시로 들 수 있다. 쿠팡이나 옥션 등 온라인 결제를 할때, 결제 모듈사(이니시스, 농협, 네이버, 토스 등)의 모듈을 가져다 씁니다.

     

    - 결합도 빠른 암기 : 낮은 순서부터 자스제외공내

    - 응집도 빠른 암기 : 낮음 순서부터 우논시절통순기

    모듈의 특징

    독립성: 모듈은 다른 모듈에 영향을 주지 않고 독립적으로 동작합니다.
    재사용성: 한 모듈을 여러 프로그램에서 재사용할 수 있어 코드의 중복을 줄입니다.
    유지보수성: 모듈 단위로 코드를 구성하면 특정 기능을 변경하거나 수정할 때 해당 모듈만 수정하면 됩니다.

     

     

    효율적인 모듈은?

    결합도를 낮추고 응집도를 높여야 독립성이 높아짐. 복잡한 문제를 일반화고, 정보를 은닉해야하며, 큰 문제를 작게 나누어 하나씩 해결해야 효과적인 모듈이 될 수 있습니다.

     

    모듈 작성 원칙

    정명완일추

    정확성(Correctness) : 해당 기능이 실제 시스템 구현에 필요한지 여부를 알 수 있도록 정확하게 작성해야함

    명확성(Clarity) : 해당 기능에 대해 일관되게 이해되고 한가지로 해석될 수 있도록 작성해야함

    완성정(Completeness) : 시슻템이 구현될 때 필요하고 요구되는 모든 것을 기술
    일관성(Consistency) : 공통 기능들에 상호 충돌이 없도록 작성해야함.

    추적성(Traceability) : 공통 기능에 대한 요구사항 출처와 관련 시스템 등의 유기적 관계에 대한 식별이 가능하도록 작성해야함.

     

    결합도(Coupling)란?

    모듈 간의 관계를 이야기하는데, 하나의 모듈이 다른 모듈을 얼마나 의지하고 있는지 그 결합된 정도가 얼마인지를 이야기함. 결합도가 낮을 수록 좋다. 

    왜냐하면, 독립적으로도 충분히 쓸만한 모듈이어야하기 때문.
    자스제외공내

    낮음 : 자료(data) 결합도가 가장 낮은 결합도를 가짐!

    자료(Data) : 모듈 간의 인터페이스로 값이 전달되는 경우 = Call by Value

    스탬프(Stamp) : 모듈 간의 인터페이스로 배열이나 오브젝트, 스트럭처 등이 전달되는 경우 Call by reference

    제어(Control) : 단순 처리할 대상인 값만 전달되는 게 아니라 어떻게 처리를 해야 한다는 제어요소가 전달되는 경우

    외부(External) : 어떤 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조하는 경우

    공통(Common) 파라미터가 아닌 모듈 밖에서 선언되어 있는 전역변수를 참조하고 전역 변수를 갱신하는 식을 상호작용하는 경우

    내용(Content) : 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우

     

     

    결합도 종류 설명 예시
    자료 모듈 간의 인터페이스로 값이 전달되는 경우 (Call by Value) 함수에 값 전달
    스탬프 모듈 간의 인터페이스로 배열이나 오브젝트 등이 전달되는 경우 (Call by Reference) 배열 참조 및 수정
    제어 어떻게 처리를 해야 하는 제어 요소가 전달되는 경우 콜백 함수 전달
    외부 모듈에서 선언한 데이터(변수)를 외부 모듈에서 참조하는 경우 외부 모듈에서 변수 참조
    공통 모듈 밖에서 선언된 전역 변수를 참조하고 갱신하는 경우 전역 변수 상호작용
    내용 다른 모듈 내부의 변수나 기능을 다른 모듈에서 사용하는 경우 모듈 간 함수 호출

    예시코드

    # 자료 (Call by Value)
    def add_numbers(a, b):
        return a + b
    
    result = add_numbers(3, 5)
    
    # 스탬프 (Call by Reference)
    def modify_list(lst):
        lst.append(4)
    
    my_list = [1, 2, 3]
    modify_list(my_list)
    
    # 제어
    def process_data(data, callback_function):
        result = callback_function(data)
        return result
    
    def square_number(num):
        return num ** 2
    
    result_squared = process_data(3, square_number)
    
    # 외부
    external_variable = 10
    
    def use_external_variable():
        print("External Variable:", external_variable)
    
    # 공통
    global_variable = 5
    
    def modify_global_variable():
        global global_variable
        global_variable += 1
    
    # 내용
    class Calculator:
        def add(self, x, y):
            return x + y
    
    # 다른 모듈에서 Calculator 클래스 사용
    calc_instance = Calculator()
    result_addition = calc_instance.add(2, 3)

     

    응집도(Cohesion)란?

    응집도는 모듈의 독립성을 나타내는 개념으로 모듈 내부 구성요소 간 연관 정도를 말하며 정보 은익 개념의 확장으로 볼 수 있으며 하나의 모듈은 하나의 기느을 수행하는 것을 의미한다. 응집도는 높을 수록 좋다

     

    우논시절통순기

    기능적(functional) : 모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우

    순차적(Sequential) : 모듈 내에서 한 활동으로부터 나온 출력값을 다른 황동이 사용할 경우

    통신적(Communication) : 동일합 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여 있을 경우

    절차적(Procedural) : 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우

    시간적(Temnporal) : 연관된 기능이라기보다는 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우

    논리적(Logical) : 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우

    우연적(Coincidental) : 모듈 내부의 각 구성 요소들이 연관이 없을 경우

     

    종류 설명 예시
    기능적 모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우 계산기 모듈 - 덧셈, 뺄셈, 곱셈, 나눗셈 기능을 제공하는 모듈
    순차적 모듈 내에서 한 활동으로부터 나온 출력값을 다른 활동이 사용할 경우 주문 처리 모듈 - 주문을 받아 처리한 후 결제 모듈에 전달
    통신적 동일한 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여 있을 경우 파일 입출력 모듈 - 읽기, 쓰기, 복사 등의 기능을 제공하는 모듈
    절차적 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우 사용자 등록 모듈 - 정보 수집, 유효성 검사, 데이터 저장 등을 순차적으로 수행
    시간적 연관된 기능이라기보다는 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우 스케줄러 모듈 - 특정 시간에 작업을 예약하고 실행하는 모듈
    논리적 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우 게시판 모듈 - 글 작성, 수정, 삭제와 같은 기능을 논리적으로 분류하여 제공
    우연적 모듈 내부의 각 구성 요소들이 연관이 없을 경우 유틸리티 모듈 - 랜덤 넘버 생성, 문자열 조작, 날짜 계산과 같은 무관한 기능을 제공

    예시 코드

    # 기능적 (Functional)
    def calculate(operation, num1, num2):
        if operation == 'add':
            return num1 + num2
        elif operation == 'subtract':
            return num1 - num2
        elif operation == 'multiply':
            return num1 * num2
        elif operation == 'divide':
            if num2 != 0:
                return num1 / num2
            else:
                return "Cannot divide by zero"
    
    # 순차적 (Sequential)
    def order_processing(order):
        validate_order(order)
        process_payment(order)
    
    def validate_order(order):
        # Validate order details
        pass
    
    def process_payment(order):
        # Process payment for the order
        pass
    
    # 통신적 (Communication)
    def file_operations(data, operation):
        if operation == 'read':
            return read_file(data)
        elif operation == 'write':
            return write_file(data)
        elif operation == 'copy':
            return copy_file(data)
    
    def read_file(file_path):
        # Read data from the file
        pass
    
    def write_file(data):
        # Write data to a file
        pass
    
    def copy_file(source, destination):
        # Copy data from source to destination
        pass
    
    # 절차적 (Procedural)
    def user_registration(user_info):
        collect_user_info(user_info)
        validate_user_info(user_info)
        save_user_data(user_info)
    
    def collect_user_info(user_info):
        # Collect user information
        pass
    
    def validate_user_info(user_info):
        # Validate user information
        pass
    
    def save_user_data(user_info):
        # Save user data to the database
        pass
    
    # 시간적 (Temporal)
    def schedule_task(task, execution_time):
        # Schedule a task to run at a specific time
        pass
    
    # 논리적 (Logical)
    class BulletinBoard:
        def __init__(self):
            self.posts = []
    
        def add_post(self, post_content):
            # Add a new post to the bulletin board
            pass
    
        def delete_post(self, post_id):
            # Delete a post from the bulletin board
            pass
    
    # 우연적 (Coincidental)
    def utility_operations():
        generate_random_number()
        manipulate_string()
        calculate_date()
    
    def generate_random_number():
        # Generate a random number
        pass
    
    def manipulate_string():
        # Perform string manipulation
        pass
    
    def calculate_date():
        # Perform date calculations
        pass
    728x90
    반응형

    댓글