💡 구조적 프로그래밍
구조적 프로그래밍이란
- 절차식 프로그래밍의 하위 개념
- 저수준 / 고수준의 구조들을 조합하여 개발하는 방식
- 저수준 구조
- 언어에 있어 기본적인 동작 방식의 구조
- 순차적 구조 ( concatenation ) / 선택적 구조 ( selection ) / 반복적 구조 ( repetition )로 이루어 짐
- 순차적 구조
- 구문 순서에 따라서 실행되는 구조 ( 위 → 아래로 코드 실행 )
- 선택적 구조
- 프로그램의 상태에 따라 여러 구조 중 한가지를 선택해서 실행되는 구조
- if / else / switch 문법이 이 구조를 위한 언어적 장치
- 반복적 구조
- 특정 상태에 도달 할 때 까지 특정 구문을 반복해서 실행하거나, 집합의 각 원소들에 대해 어떤 구문을 수행하는 구조
- for / while 등의 문법이 이 구조를 위한 언어적 장치
- 고수준 구조
- 전체 프로젝트 코드를 이해하기 쉽도록 개발자가 쪼개놓은 구조
- 하나의 모듈 / 함수 등으로 코드를 쪼개어 놓은 구조
구조적 프로그래밍의 특징
- 제어 흐름을 제어하는 것을 제한함
- goto 문법을 사용 금지 또는 매우 제한적으로 사용
- 절차식 프로그래밍처럼 위 → 아래로 흐르는 코드 플로우를 제어하고 싶다면 주어진 구조( 위에서 서술한 저수준 구조에 해당하는 문법 )만 사용하여 조작 해야 함
- 제어 흐름을 방해하는 문법 ( java의 break와 같은 )의 사용은 한정된 범위나 조건에서만 사용 가능 함
- 종합하면, 내부적으로 goto 문법을 사용하는 규칙을 정했으며 이 규칙 이외에는 goto 문법은 사용 할 수 없도록 되어있음
- 프로그램을 소규모 기능들로 분해 함
- 전체 프로그램을 위한 코드를, 한곳에 작성하는 것이 아니라 기능별, 필요 별로 묶어 관리
- 하나의 구조는, 시작점이 있으면 종료점도 반드시 있어야 함
과학 / 수학에 대한 반증 가능성
- 수학은, 어떤 현상이 있을때 이를 수학적으로 완벽히 증명 할 수 있음
- 하지만 과학은, 어떤 현상이 있을 때 이를 수학적으로 증명 할 수는 없고, 관찰을 통해 해당 현상이 틀리지 않음을 이야기 함
- 과학에서 $F = ma$ 가 옳다는 것을 증명 할 수는 없지만 많은 증거들이 틀리지 않다고는 이야기 함
- 즉, 과학은 반증은 가능하지만 증명은 불가능한 상태이고 이렇게 발전 해 왔음
- 정리하자면 수학은 이미 증명된 논제라면 반증이 나올 수 없는 구조이지만, 과학은 특정 이론에 대해 반증이 나온다면 언제든지 규칙이 깨질 수 있음
- 즉, 수학은 증명 가능한 서술이 참임을 입증하는 원리이지만, 과학은 증명 가능한 서술이 거짓임을 입증하는 원리
테스트 코드와 반증 가능성
- 테스트 코드를 통해 프로그램이 잘못되었음을 증명 해 줄 순 있지만, 버그가 없다고 증명 할 수는 없음
- goto 문법을 남발한다면, 특정 로직을 수행하는 코드가 잘못 되었는지 아닌지 테스트 하는 것이 거의 불가능에 가까워지는데, 이는 goto 문법을 제거하는 논지의 뒷받침이 됨
- 테스트 코드는 해당 함수, 기능이 거짓인지 아닌지 판단하는 기준이 되어줌
- 따라서 적절한 테스트 코드를 작성 함으로써 기능의 반증가능성을 줄여 나가야 하고, 이 테스트를 다 통과한 코드라면 충분히 참이라고 여길 수 있음
- 구조적 프로그래밍을 통해, 코드를 기능 단위로 쪼갬으로써 테스트 코드 작성이 가능 해 졌고 이를 통해 반증 가능한 단위로 코드를 쪼갤 수 있음