관심사의 분리(Separation of Concerns, SoC)는 소프트웨어 설계의 중요한 원칙 중 하나로, 시스템을 서로 독립적인 부분으로 나누어 각 부분이 특정한 기능이나 책임을 갖도록 하는 것을 의미합니다. 이를 통해 코드의 유지 보수성, 재사용성, 가독성을 높일 수 있습니다.
파이썬에서 병합 정렬을 구현하고 테스트할 때, 관심사의 분리를 적용하는 방법을 예시로 설명하겠습니다. 여기서는 세 가지 주요 관심사로 코드를 분리하겠습니다:
- 병합 정렬 알고리즘 구현
- 입출력 처리
- 테스트
병합 정렬 알고리즘 구현
병합 정렬 알고리즘을 별도의 모듈로 구현합니다.
merge_sort.py
python
코드 복사
def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_half = merge_sort(arr[:mid]) right_half = merge_sort(arr[mid:]) return merge(left_half, right_half) def merge(left, right): sorted_array = [] left_index, right_index = 0, 0 while left_index < len(left) and right_index < len(right): if left[left_index] < right[right_index]: sorted_array.append(left[left_index]) left_index += 1 else: sorted_array.append(right[right_index]) right_index += 1 sorted_array.extend(left[left_index:]) sorted_array.extend(right[right_index:]) return sorted_array
입출력 처리
입출력 처리를 별도의 모듈로 분리하여, 사용자가 데이터를 입력하고 결과를 출력하는 부분을 구현합니다.
main.py
python
코드 복사
from merge_sort import merge_sort def main(): # 사용자로부터 입력을 받습니다. user_input = input("정렬할 숫자들을 공백으로 구분하여 입력하세요: ") unsorted_array = list(map(int, user_input.split())) # 병합 정렬을 수행합니다. sorted_array = merge_sort(unsorted_array) # 정렬된 배열을 출력합니다. print("정렬된 배열:", sorted_array) if __name__ == "__main__": main()
테스트
테스트 코드를 별도의 모듈로 분리하여, 병합 정렬 함수들을 테스트합니다.
test_merge_sort.py
python
코드 복사
import unittest from merge_sort import merge_sort class TestMergeSort(unittest.TestCase): def test_merge_sort(self): test_cases = [ { "input": [38, 27, 43, 3, 9, 82, 10], "expected": [3, 9, 10, 27, 38, 43, 82] }, { "input": [5, 2, 9, 1, 5, 6], "expected": [1, 2, 5, 5, 6, 9] }, { "input": [0], "expected": [0] }, { "input": [], "expected": [] } ] for case in test_cases: input_data = case["input"] expected_output = case["expected"] result = merge_sort(input_data) self.assertEqual(result, expected_output, f"Failed for input: {input_data}") if __name__ == "__main__": unittest.main()
설명
- merge_sort.py:
- 병합 정렬 알고리즘과 병합 함수를 정의합니다.
- 이 모듈은 병합 정렬 알고리즘의 핵심 로직을 포함합니다.
- main.py:
- 사용자로부터 입력을 받고, 병합 정렬을 수행한 후 결과를 출력합니다.
- 이 모듈은 입출력 처리에 대한 로직을 포함합니다.
- test_merge_sort.py:
- unittest 모듈을 사용하여 병합 정렬 함수를 테스트합니다.
- 여러 테스트 케이스를 정의하고, 각 케이스에 대해 결과를 확인합니다.
- 이 모듈은 테스트에 대한 로직을 포함합니다.
이러한 구조는 코드의 각 부분이 명확한 책임을 가지도록 하여, 코드의 유지 보수성, 재사용성, 가독성을 크게 향상시킵니다. 관심사의 분리를 통해 각 모듈이 독립적으로 동작하며, 필요할 때 쉽게 수정하거나 확장할 수 있습니다.