[정보처리기사] 응집도와 결합도 - 이건 꼭 알아야함
목차
모듈이란?
모듈은 프로그램을 구성하는 독립적이고 재사용 가능한 부분입니다. 코드를 논리적으로 분리하여 관리하고 유지보수하기 쉽게 만드는 또다른 프로그램.
우리가 흔히 마주할 수 있는 모듈은 결제 모듈을 예시로 들 수 있다. 쿠팡이나 옥션 등 온라인 결제를 할때, 결제 모듈사(이니시스, 농협, 네이버, 토스 등)의 모듈을 가져다 씁니다.
- 결합도 빠른 암기 : 낮은 순서부터 자스제외공내
- 응집도 빠른 암기 : 낮음 순서부터 우논시절통순기
모듈의 특징
독립성: 모듈은 다른 모듈에 영향을 주지 않고 독립적으로 동작합니다.
재사용성: 한 모듈을 여러 프로그램에서 재사용할 수 있어 코드의 중복을 줄입니다.
유지보수성: 모듈 단위로 코드를 구성하면 특정 기능을 변경하거나 수정할 때 해당 모듈만 수정하면 됩니다.
효율적인 모듈은?
결합도를 낮추고 응집도를 높여야 독립성이 높아짐. 복잡한 문제를 일반화고, 정보를 은닉해야하며, 큰 문제를 작게 나누어 하나씩 해결해야 효과적인 모듈이 될 수 있습니다.
모듈 작성 원칙
정명완일추
정확성(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
'정보처리기사' 카테고리의 다른 글
큐넷 CBT 체험하기 정보(feat.정보처리기사 필기) (2) | 2024.02.16 |
---|---|
정보처리가사 UML 관계 암기하기(추가. 단순 다이어그램) (1) | 2024.02.13 |
[소프트웨어 아키텍처] 2023년 실기 3회 예상문제 (0) | 2023.09.18 |
[정처기 실시] 프로젝트 계획 (0) | 2023.09.14 |
[정처기 실기] 소프트웨어 개발 방법론 (0) | 2023.09.13 |
댓글