클린 아키텍처 4장
구조적 프로그래밍 개요
역사적 배경
•
1968년 에츠허르 비버 데이크스트라가 발견
•
데이크스트라는 무분별한 점프(goto 문장)가 프로그램 구조에 해롭다는 사실을 제시
•
점프들을 if/then/else와 do/while/until과 같은 더 익숙한 구조로 대체
구조적 프로그래밍의 탄생 배경
•
1960년대 후반, 프로그래밍의 위기: 프로그램이 너무 복잡해져 인간의 두뇌로 감당하기 어려워짐
•
작은 세부사항 하나라도 간과하면 프로그램이 예상치 못한 방식으로 실패
•
데이크스트라의 해결책: 수학적 증명(proof) 원리 적용
데이크스트라의 접근 방식
1.
유클리드 계층 구조 적용: 공리, 정리, 따름정리, 보조정리로 구성
2.
프로그래머가 수학자처럼 입증된 구조를 사용하여 코드의 정확성을 증명
3.
goto 문장이 모듈의 재귀적 분해를 방해한다는 발견
4.
분할 정복 접근법 사용을 위해 goto 문장 제한 필요성 인식
goto 문이란?
•
프로그램의 실행 흐름을 특정 레이블이나 줄 번호로 무조건 전환하는 제어 흐름 문장
•
예시 (의사 코드)
1: x = 0
2: if x > 10 goto 5
3: x = x + 1
4: goto 2
5: print x
Plain Text
복사
goto 문의 문제점
•
프로그램 흐름을 복잡하게 만들어 가독성 저하
•
코드 구조 파악 어려움으로 디버깅과 유지보수 난이도 증가
•
'스파게티 코드' 생성: 복잡하고 얽힌 제어 흐름
구조적 프로그래밍의 핵심
•
제어 흐름의 직접적인 전환에 대한 규칙 부과
•
뵘과 야코피니의 정리:
모든 프로그램은 순차(sequence), 분기(selection), 반복(iteration) 세 가지 구조만으로 표현 가능
구조적 프로그래밍의 목적
1.
프로그램의 복잡성 관리
2.
수학적 증명 원리 적용
3.
모듈의 재귀적 분해 가능성 확보
기능적 분해
•
구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적 분해
•
문제를 고수준 기능으로 분해하고, 이를 다시 저수준 함수로 분해
•
분해 과정의 반복을 통한 세분화
•
구조적 분석과 설계 기법을 통해 대규모 시스템을 모듈과 컴포넌트로 분할
테스트와 구조적 프로그래밍
•
데이크스트라: "테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다."
•
구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적 분해
•
테스트를 통해 세부 기능들이 거짓인지를 증명하려고 시도
•
거짓임을 증명하려는 테스트가 실패하면, 해당 기능은 목표에 부합할 만큼 충분히 참으로 간주
구조적 프로그래밍의 현대적 의의
1.
반증 가능한 단위(세분화된 기능) 생성 능력
2.
소프트웨어 아키텍처에서 기능적 분해의 중요성 강조
3.
모듈, 컴포넌트, 서비스의 테스트 용이성 확보
결론
•
구조적 프로그래밍은 제한적인 규칙을 통해 프로그램의 정확성을 높이고 복잡성을 관리
•
소프트웨어 아키텍트는 구조적 프로그래밍의 원칙을 적용하여 테스트 가능하고 유지보수가 용이한 시스템 설계 필요
•
현대 소프트웨어 개발에서도 구조적 프로그래밍의 원칙은 여전히 유효하며, 복잡한 시스템을 관리 가능한 단위로 분해하는 데 중요한 역할 수행