함수의 선조건, 후조건

2026.05.18. 13:12

프로그래밍에서 함수의 선조건(Precondition)과 후조건(Postcondition)은 함수와 이를 호출하는 코드 사이의 '신뢰 계약(Contract)'과 같습니다.

안전하고 버그 없는 코드를 짜기 위한 이 두 가지 개념을 핵심만 쏙쏙 골라 정리해 드릴게요.


1. 선조건 (Precondition)

"너 나 부를 때 이것만큼은 똑바로 지켜서 불러줘!"

선조건은 함수가 올바르게 실행되기 위해 함수 호출 직전에 반드시 참(True)이어야 하는 조건입니다.

  • 책임: 함수를 호출하는 쪽(Caller)에 있습니다.

  • 특징: 선조건을 만족하지 못하고 함수를 실행하면, 함수가 에러를 뿜거나 엉뚱한 결과를 내놓아도 함수 탓을 할 수 없습니다. (계약 위반이니까요!)

  • 예시:

    • 나눗셈 함수 divide(a, b)에서: "나누는 수 b는 절대 0이 아니어야 한다."

    • 스마트폰 배터리 충전 함수 charge(amount)에서: "amount는 양수(+)여야 한다."

    • 배열 검색 함수에서: "검색할 배열이 null이 아니어야 한다."


2. 후조건 (Postcondition)

"선조건만 잘 지켜줬지? 그럼 내가 이 결과는 무조건 보장할게!"

후조건은 선조건이 만족된 상태에서 함수가 실행을 마쳤을 때 반드시 보장되어야 하는 결과나 상태입니다.

  • 책임: 함수 자체(Callee)에 있습니다.

  • 특징: 선조건이 지켜졌음에도 후조건이 만족되지 않았다면, 그건 함수 내부에 버그가 있다는 뜻입니다.

  • 예시:

    • 정렬 함수 sort(array) 실행 후: "배열의 모든 요소가 오름차순으로 정렬되어 있어야 한다."

    • 제곱근 함수 sqrt(x) 실행 후: "결과값의 제곱은 원래 입력값 x와 같아야 한다."

    • 회원가입 함수 실행 후: "데이터베이스에 새로운 회원 정보가 안전하게 저장되어 있어야 한다."


한눈에 비교하기

항목선조건 (Precondition)후조건 (Postcondition)확인 시점함수가 시작될 때함수가 끝날누구의 책임?함수를 부르는 사람 (Caller)함수를 만든 사람 (Callee)쉽게 말해?"입력값 검사""출력값/결과 보장"위반 시 범인호출한 코드 (인자를 잘못 넘김)함수 내부 코드 (로직에 버그가 있음)


💡 왜 중요할까요? (계약에 의한 설계)

이 두 가지를 명확히 정의하는 것을 소프트웨어 공학에서는 계약에 의한 설계(Design by Contract)라고 부릅니다.

실무에서는 이를 프로그래밍 언어의 assert 구문이나 예외 처리(Exception), 또는 문서화 주석을 통해 명시합니다. 선조건과 후조건을 명확히 해두면 "이 버그가 왜 터졌지? 누구 잘못이지?"를 찾을 때 디버깅 시간이 기적처럼 단축되는 효과를 볼 수 있습니다.