-
Pre, Postcondition대학/자료구조 2022. 10. 15. 12:11
자료구조와 크게 상관없는 이야기 같지만...
오늘 할 얘기는 함수 작성 시 가져야할 코딩 습관에 대한 이야기이다.
소프트웨어 개발의 단계를 세 단계로 요약하면 다음과 같이 흘러간다.
- Step 1
1. 요구 스펙 파악
2. 설계
3. 코드로 구현 - Step 2
4. 만든 프로그램 분석
5. 테스팅 및 디버깅
6. 유지보수 - Step 3
7. 필요가 없어질 시 삭제
개발 단계에서 기능의 구현은 외부 라이브러리를 가져다 쓰거나, 함수의 형태로 분할하여 만들게 되는데,
기능의 구현체는 하나의 공통점을 갖는다.
바로, 어떻게 구현되었는지는 몰라도 사용할 수는 있다는 점이다.
여기서 다음의 개념이 등장한다.
- Precondition
- Postcondition
Pre, Postcondition을 하나의 주석문 쌍으로 작성하게 되는데 각각은 다음과 같은 내용을 포함해야 한다.
Precondition은 함수가 호출되기 전에 만족해야 하는 조건을 적어놓는다. 즉, 입력 조건을 설명하는 것이다.
Postcondition은 함수가 수행 후 반환되는 결과가 만족해야 할 조건을 적어놓는다. 즉, 출력 조건(결과)를 설명하는 것이다.
구현체를 사용하는 개발자는 Precondition을 준수하여 사용해야 하고,
구현체의 개발자는 Postcondition을 만족하는 출력물을 리턴하도록 구현해야 한다.
Pre, Postcondition을 사용하면 여러 장점이 있다.
- 함수를 간결하게 설명할 수 있다.
- 함수 구현 코드를 굳이 볼 마음이 들지 않게 해준다.
- 함수 재 구현을 용이하게 해준다.
- 그럼에도 불구하고 프로그램 동작에 영향이 없다.
하지만, 나같이
변태성향이 있는사람은 궁금함을 못이겨 Precondition을 만족하지 않는 인자를 넘겨보는 실험을 해보곤 한다.이런 사람 뿐 만 아니라, 계산 결과를 인자로 전달할 때, 예상치 못한 인자가 넘어가는 경우도 있을 것이다.
이런 상황에 대비하여 개발자는 Precondition을 만족하지 못하는 인자에 대한 예외 처리도 구현하는 것이 바람직하다.
c++에서는 cassert 라이브러리에 assert 함수가 정의되어 있는데,
assert()의 인자가 참이라면 아무 일이 일어나지 않지만,
assert()의 인자가 거짓이라면 에러 메세지를 출력하고 프로그램을 강제로 종료시킨다.
(참고로 #include <cassert> 아래에 #define NDEBUG를 사용하면 assert()함수를 비활성화 시킬 수 있다)
'대학 > 자료구조' 카테고리의 다른 글
Linked list (0) 2022.10.17 Dynamic array (0) 2022.10.17 Static array (0) 2022.10.16 c++ operator overloading (0) 2022.10.16 c++ class, parameter types (0) 2022.10.16 - Step 1