맨위로가기

계약에 의한 설계

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

계약에 의한 설계(Design by Contract, DbC)는 베르트랑 메이어가 에펠 프로그래밍 언어 설계를 통해 처음 제시한 소프트웨어 설계 방법론이다. DbC는 클라이언트와 공급자 간의 계약을 핵심 개념으로 하며, 클래스의 불변 조건, 메서드의 사전 조건과 사후 조건으로 구성된다. 이러한 계약은 클라이언트와 공급자 간의 의무와 이익을 정의하며, 코드 재사용과 소프트웨어 문서화를 용이하게 한다. DbC는 예외 처리를 통해 계약 위반을 처리하며, 상속 관계에서도 계약의 일관성을 유지한다. 다양한 프로그래밍 언어에서 DbC를 지원하며, 소프트웨어의 정확성을 높이는 데 기여한다.

더 읽어볼만한 페이지

  • 소프트웨어 설계 - 구조적 분석
    구조적 분석은 1960년대에서 1980년대 소프트웨어 개발의 복잡성을 해결하기 위해 개발된 기법으로, 다이어그램과 데이터 사전을 활용하여 시스템을 분석하고 설계했으며, 객체 지향 프로그래밍의 등장으로 활용도가 감소했다.
  • 소프트웨어 설계 - 지속적 배포
    지속적 배포(CD)는 소프트웨어 릴리스 프로세스를 자동화하는 접근 방식이며, 배포 파이프라인을 통해 구현되고 시장 출시 시간 단축, 제품 품질 향상 등의 이점을 제공하지만 테스트 자동화 부족 등의 과제도 존재한다.
  • 프로그래밍 패러다임 - 지식 표현
    지식 표현은 컴퓨터가 인간의 지식을 이해하고 활용하도록 정보를 구조화하는 기술이며, 표현력과 추론 효율성의 균형, 불확실성 처리 등을 핵심 과제로 다양한 기법과 의미 웹 기술을 활용한다.
  • 프로그래밍 패러다임 - 의도적 프로그래밍
    의도적 프로그래밍은 프로그래머의 의도를 명확히 포착하고 활용하여 소프트웨어 개발 생산성을 향상시키기 위한 프로그래밍 패러다임으로, 트리 기반 저장소를 사용해 코드 의미 구조를 보존하고, WYSIWYG 환경에서 도메인 전문가와 협업하며, 코드 상세 수준 조절 및 자동 문서화를 통해 가독성과 유지보수성을 높이는 데 중점을 둔다.
계약에 의한 설계
개요
유형소프트웨어 개발 방법론
개발자베르트랑 메이어
개발 시기1986년
주요 개념
사전 조건메서드 실행 전에 참이어야 하는 조건
사후 조건메서드 실행 후에 참이어야 하는 조건
클래스 불변성 조건객체의 모든 메서드 실행 전후에 참이어야 하는 조건
장점
이점코드의 정확성 향상
소프트웨어의 신뢰성 향상
유지보수 용이
관련 개념
관련 개념단위 테스트
테스트 주도 개발
예시 (Java)
예시 설명은행 계좌 클래스에서 인출 메서드에 대한 사전 조건, 사후 조건, 불변성 조건을 보여주는 예제.
언어 지원
지원 언어Eiffel (기본 지원)
Ada
C++ (제한적)
C# (Code Contracts 이용)
D
Java (다양한 라이브러리 및 도구 이용)
Perl (관용적)
Python (관용적)
Ruby (관용적)
Scala
SPARK
참고 자료
참고 서적Object-Oriented Software Construction by Bertrand Meyer, Prentice Hall, 1988, 1997. Second edition

2. 역사

베르트랑 메이어가 에펠 프로그래밍 언어를 설계하면서 "계약에 의한 설계"라는 용어를 처음 만들었다. 1986년부터 시작된 여러 논문[1][2][3]과 그의 저서 ''객체 지향 소프트웨어 구성''의 두 차례 개정판(1988년, 1997년)에서 처음 기술되었다. 에펠 소프트웨어(Eiffel Software)는 2003년 12월 "계약에 의한 설계"에 대한 상표 등록을 신청했고, 2004년 12월에 등록되었다.[4][5] 이 상표의 현재 소유자는 에펠 소프트웨어이다.[6][7]

계약에 의한 설계는 형식적 검증, 형식 명세 및 호어 논리에 대한 연구에서 그 뿌리를 두고 있다. 원래 기여는 다음과 같다.


  • 설계 과정을 안내하는 명확한 비유
  • 특히 재정의 및 동적 바인딩에 대한 형식주의를 포함하여 상속에 대한 적용
  • 예외 처리에 대한 적용
  • 자동 소프트웨어 문서화와의 연결

3. 주요 개념

"계약에 의한 설계"(DbC)의 핵심 개념은 클라이언트공급자 간의 '''계약''' (contract영어)이다. DbC에서 계약은 클래스의 인스턴스와 해당 메서드 사용에 관한 조건을 형식적으로 명시한 것으로, 클래스 불변 조건, 메서드의 사전 조건 및 사후 조건으로 구성된다.

불변 조건, 사전 조건, 사후 조건은 각각 클래스의 동작을 정의하며, 클라이언트에게 공개된 (생성자를 포함하는) 메서드에 적용된다.

계약은 클라이언트와 공급자에게 발생하는 의무와 이익으로 특징지어진다. 클라이언트 설계자는 클래스 인터페이스로 제시된 사전 조건을 준수할 의무가 발생하는 한편, 사후 조건이 충족될 것을 기대할 수 있다. 반대로 공급자 설계자는 클라이언트가 사전 조건을 충족하여 클래스를 사용할 것을 기대할 수 있는 한편, 사후 조건을 준수할 의무가 발생한다. 이러한 클라이언트와 공급자 양측에 발생하는 의무와, 의무를 지켰을 때 보장된 상태를 얻을 수 있는 이익이 나타나는 점에서, 프로그래밍에서의 "계약"과 일반적인 의미의 계약 간의 유사성을 찾을 수 있다.

명시는 미리 기술해 둠으로써, 구현자는 해당 명시에 따라 프로그램을 작성할 수 있다. 일반적으로 명시는 정적인 기술이며, 반드시 프로그램 동작 시 의미를 갖는 것은 아니지만, DbC를 지원하는 프로그래밍 언어에서는 프로그램 실행 시 명시 위반 여부를 감시할 수 있다. 실행 시 명시 위반 감시와 관련하여, 예외 기구를 이용하여, 실행 시 명시 위반을 예외로 클라이언트가 처리하도록 할 수 있다.

클래스 A가 클래스 B에 관한 엔티티 (지역 변수 정의 및 메서드 호출)의 기술을 포함하는 경우, B는 A에 대한 공급자, A는 B에 대한 클라이언트가 된다. 클라이언트와 공급자는 동일 클래스여도 되며, 예를 들어 this를 통한 메서드 호출이 해당한다.

3. 1. 계약의 구성 요소

"계약에 의한 설계"(DbC)는 소프트웨어 시스템의 요소들이 "의무"와 "혜택"을 바탕으로 상호 협력하는 방식을 비즈니스에서의 "고객"과 "공급자" 간의 "계약"에 비유하여 설명한다.

객체 지향 프로그래밍에서 클래스의 메서드가 특정 기능을 제공하는 경우에도 계약이 적용된다. 이 계약은 호어 삼단논법과 의미론적으로 동일하며, 설계자는 다음 "세 가지 질문"에 답해야 한다.

  • 계약은 무엇을 예상하는가? (전제 조건)
  • 계약은 무엇을 보장하는가? (사후 조건)
  • 계약은 무엇을 유지하는가? (클래스 불변식)


많은 프로그래밍 언어가 어설션 기능을 제공하지만, DbC는 계약을 소프트웨어 정확성의 핵심 요소로 간주하여 설계 프로세스에 포함해야 한다고 강조한다. DbC는 어설션을 먼저 작성할 것을 권장한다.

계약은 메서드/프로시저 수준까지 확장되며, 각 메서드의 계약은 일반적으로 다음 정보를 포함한다.

  • 허용 가능한 입력 값 또는 유형 및 해당 의미
  • 반환 값 또는 유형 및 해당 의미
  • 발생할 수 있는 오류 및 예외 조건, 값 또는 유형 및 해당 의미
  • 부작용
  • 전제 조건
  • 사후 조건
  • 불변식
  • (드물게) 사용된 시간 또는 공간에 대한 성능 보장


상속 계층 구조에서 하위 클래스는 전제 조건을 약화(강화는 안 됨)하고 사후 조건 및 불변식을 강화(약화는 안 됨)할 수 있다. 이는 행동 서브타이핑과 관련된다.

모든 클래스 관계는 클라이언트 클래스와 공급자 클래스 간의 관계로, 클라이언트는 공급자 기능 호출 시 클라이언트 호출에 의해 위반되지 않는 결과 상태를 보장해야 한다. 공급자는 클라이언트의 상태 요구 사항을 위반하지 않는 반환 상태 및 데이터를 제공해야 한다.

공급자는 계약 조건을 확인하지 않으며, 이는 공격적인 프로그래밍과 다르다. DbC는 "강력하게 실패"하도록 하여 디버깅을 단순화한다.

이는 공급자가 전제 조건 위반 시 대처 방법을 파악해야 하는 방어적 프로그래밍과 대조적이다.

DbC는 소프트웨어 모듈의 정확성 기준을 다음과 같이 정의한다.

  • 클라이언트가 공급자를 호출하기 전 클래스 불변식 AND 전제 조건이 참이면, 서비스 완료 후 불변식 AND 사후 조건이 참이 된다.
  • 소프트웨어 모듈은 공급자 호출 시 공급자의 전제 조건을 위반하면 안 된다.


DbC는 코드 재사용을 용이하게 하며, 모듈 계약은 소프트웨어 문서 형식으로 간주될 수 있다.

3. 2. 의무와 이익

DbC(계약에 의한 설계)의 핵심은 소프트웨어 시스템 요소들이 서로 "의무"와 "이익"을 바탕으로 협력하는 방식을 비유를 통해 설명하는 것이다. 이 비유는 비즈니스에서 "고객"과 "공급자" 간의 "계약" 관계에서 유래되었다.

  • 공급자는 특정 제품을 제공해야 할 의무가 있으며, 고객이 수수료를 지불했다는 것을 기대할 이익(권리)이 있다.
  • 고객은 수수료를 지불해야 할 의무가 있으며, 제품을 받을 이익(권리)이 있다.
  • 양 당사자는 모든 계약에 적용되는 법률 및 규정과 같은 특정 의무를 충족해야 한다.


마찬가지로, 클래스의 메서드가 특정 기능을 제공하는 경우에도 다음과 같은 의무와 이익이 존재한다.

  • 메서드를 호출하는 클라이언트는 메서드의 전제 조건을 보장해야 할 의무가 있다. 이는 공급자(메서드)의 이익이 된다. (전제 조건 외의 경우를 처리할 필요가 없기 때문)
  • 메서드는 종료 시 사후 조건을 보장해야 할 의무가 있다. 이는 클라이언트의 이익이 된다.
  • 메서드는 클래스 불변식을 유지해야 한다.


이 계약은 호어 삼단논법과 의미론적으로 동일하며, 설계자는 다음 "세 가지 질문"에 답해야 한다.

  • 계약은 무엇을 예상하는가? (전제 조건)
  • 계약은 무엇을 보장하는가? (사후 조건)
  • 계약은 무엇을 유지하는가? (불변식)


많은 프로그래밍 언어에는 이러한 어설션을 작성하는 기능이 있다. DbC는 이러한 계약이 소프트웨어 정확성에 매우 중요하다고 간주하여 설계 프로세스의 일부가 되어야 한다고 강조한다. DbC는 어설션을 먼저 작성하는 것을 권장한다.

계약 개념은 메서드 수준까지 확장되며, 각 메서드의 계약에는 일반적으로 다음 정보가 포함된다.

  • 허용 가능한 입력 값 및 의미
  • 반환 값 및 의미
  • 발생 가능한 오류 및 예외 조건 값 및 의미
  • 부작용
  • 전제 조건
  • 사후 조건
  • 불변식
  • (드물게) 성능 보장


상속 계층 구조에서 하위 클래스는 전제 조건을 약화(강화는 안 됨)하고, 사후 조건 및 불변식을 강화(약화는 안 됨)할 수 있다. 이는 행동 서브타이핑과 관련된다.

모든 클래스 관계는 클라이언트 클래스와 공급자 클래스 간의 관계이다. 클라이언트는 공급자의 결과 상태가 클라이언트 호출에 의해 위반되지 않는 공급자 기능을 호출해야 한다. 공급자는 클라이언트의 상태 요구 사항을 위반하지 않는 반환 상태 및 데이터를 제공해야 한다.

DbC는 방어적 프로그래밍과 달리, 공급자가 전제 조건이 깨질 때 어떻게 해야 할지 파악할 필요가 없다. 대신, 계약 검증은 안전망 역할을 하며, "강력하게 실패"하도록 하여 디버깅을 단순화한다.

DbC는 소프트웨어 모듈의 정확성에 대한 기준을 정의한다.

  • 클래스 불변식 AND 전제 조건이 클라이언트가 공급자를 호출하기 전에 참이면, 서비스 완료 후 불변식 AND 사후 조건이 참이 된다.
  • 공급자를 호출할 때 소프트웨어 모듈은 공급자의 전제 조건을 위반해서는 안 된다.


DbC는 각 코드 조각에 대한 계약이 문서화되어 있으므로 코드 재사용을 용이하게 하며, 모듈에 대한 계약은 해당 모듈 동작에 대한 소프트웨어 문서 형식으로 간주될 수 있다.

4. 계약과 예외 처리

「계약에 의한 설계」(DbC)의 핵심은 클라이언트와 공급자[21] 간의 '''계약''' (contract영어)이다. DbC에서 계약은 클래스[22]인스턴스[23]와 해당 메서드[24] 사용 조건을 형식적으로 명시한 것이다. 이는 클래스 불변 조건, 메서드의 사전 조건 및 사후 조건으로 구성된다.

불변 조건, 사전 조건, 사후 조건은 클래스 동작을 정의하며, 클라이언트에게 공개된 (생성자를 포함하는) 메서드에 적용된다.

계약은 클라이언트와 공급자에게 발생하는 의무와 이익으로 특징지어진다.


  • 클라이언트 설계자는 클래스 인터페이스로 제시된 사전 조건을 준수할 의무가 있고, 사후 조건이 충족될 것을 기대할 수 있다.
  • 공급자 설계자는 클라이언트가 사전 조건을 충족하여 클래스를 사용할 것을 기대할 수 있고, 사후 조건을 준수할 의무가 있다.


프로그래밍에서 "계약"은 이러한 의무와 이익이 나타난다는 점에서 일반적인 의미의 계약과 유사하다.

명시를 미리 기술하여 구현자는 해당 명시에 따라 프로그램을 작성할 수 있다. DbC를 지원하는 프로그래밍 언어에서는 프로그램 실행 시 명시 위반 여부를 감시할 수 있다. 실행 시 명시 위반 감시와 관련하여, 예외를 이용하여 실행 시 명시 위반을 클라이언트가 처리하도록 할 수 있다.

클래스 A가 클래스 B에 관한 엔티티(지역 변수 정의 및 메서드 호출)를 포함하면, B는 A의 공급자, A는 B의 클라이언트가 된다. 클라이언트와 공급자는 동일 클래스여도 된다. (예: this를 통한 메서드 호출)

메서드 명시 위반(사전 조건, 사후 조건, 불변 조건 중 하나라도 미충족)이 발생하거나, OS가 이상을 감지하면, 예외로 처리해야 한다.[21]

예외 처리는 메서드를 실패 또는 성공시키는 형태로 이루어져야 한다.[21]

  • 메서드 성공: 불변 조건을 포함하는 메서드의 사후 조건을 만족시키고 호출원에 제어를 반환해야 한다.

  • 메서드 실패: 시스템 상태를 메서드 실행 전 상태로 되돌리고, 클라이언트에 예외 발생을 알려야 한다. (예: DB 트랜잭션 에러 시, 공급자는 트랜잭션 롤백 후 DB 조작 실패를 클라이언트에 알림)


메서드 내 예외 핸들러에서는 메서드 본체 실행 재개 또는 클라이언트에 예외 통지 후 종료 중 하나를 수행한다. 예외 핸들러에서 클라이언트로 제어 반환 시, 클래스 불변 조건을 위반하면 안 된다.[21]

계약 프로그래밍에서 형식적으로는 수치 계산에서의 오버플로0으로 나누기, 메모리 영역 확보 실패, 파일 접근/쓰기 실패 등은 시스템과 클라이언트 간 암묵적 계약 위반으로 간주할 수 있다.[21]

5. 계약의 상속

클래스는 개방/폐쇄 원칙에 따라 설계되어야 한다. 즉, 클래스 인터페이스 사양은 안정적이고 클라이언트 입장에서의 동작은 바뀌지 않아야 하는 동시에, 미래의 기능 추가나 사양 변경을 수용할 수 있어야 한다. 후자의 모듈 개방성을 실현하기 위한 방법 중 하나로 클래스의 상속이 있다

"계약에 의한 설계"(DbC)에서는 클래스 인스턴스의 추상적인 동작(behaviour영어)을 불변 조건과 각 메서드의 사전 조건 및 사후 조건으로 정의한다[28]。DbC에 따라 프로그래밍할 때, 클라이언트는 사전 조건을 만족하면 사후 조건을 만족하는 상태를 얻을 수 있다고 기대하며 공급자 클래스의 엔티티를 기술하게 된다. 한편, 다형성 때문에 클라이언트가 기술한 공급자 클래스 자체가 항상 구현을 제공하는 것은 아니며, 프로그램 실행 시에는 동적 바인딩된 서브클래스[29]의 인스턴스 구현이 사용될 수 있다

서브클래스 인스턴스의 동작은 서브클래스 자신의 불변 조건 및 각 메서드의 사전 조건과 사후 조건에 의해 정의되지만, 한편 서브클래스 인스턴스는 클라이언트와 상속 원본 슈퍼클래스[30]의 계약에 구속되어 슈퍼클래스 인스턴스로서도 동작해야 한다(리스코프 치환 원칙). 따라서 클라이언트와 상속 원본 슈퍼클래스 간의 계약을 실현하기 위해, 서브클래스는 슈퍼클래스의 불변 조건을 항상 만족해야 하며(따라서 서브클래스의 불변 조건은 자신의 불변 조건과 모든 슈퍼클래스의 불변 조건의 논리곱이 된다), 또한 서브클래스의 사전 조건은 슈퍼클래스의 사전 조건보다 약하게(또는 같게), 서브클래스의 사후 조건은 슈퍼클래스의 사후 조건보다 강하게(또는 같게) 해야 한다

여기서 "조건 A가 조건 B보다 '''강하다'''"는 것은 A가 성립하면 B도 반드시 성립하고, 반대는 성립하지 않는 것을 말한다。예를 들어 실수 x에 대해 x > 2 가 성립하면 항상 x > 0 이 성립하지만, 반대는 성립하지 않는다. 이 경우 실수 x에 대한 조건 x > 2는 조건 x > 0보다 강하다고 할 수 있다. 다른 한편 "조건 A가 조건 B보다 '''약하다'''"는 것은 B가 A보다 강하다는 것을 의미한다

6. 프로그래밍 언어 지원

계약에 의한 설계를 기본적으로 구현하는 언어는 다음과 같다.



공통 리스프 객체 시스템의 표준 메서드 조합에는 `:before`, `:after` 및 `:around` 메서드 한정자가 있어 보조 메서드로서의 계약 작성을 비롯한 다양한 용도로 활용할 수 있다.

6. 1. 네이티브 지원

프로그래밍 언어특징
에이다 2012해당사항 없음
Ciao해당사항 없음
클로저해당사항 없음
코브라해당사항 없음
D[10]해당사항 없음
Dafny해당사항 없음
에펠해당사항 없음
포트리스해당사항 없음
코틀린해당사항 없음
머큐리해당사항 없음
옥시젠이전에는 Chrome 및 Delphi Prism[11]
래킷고차 계약을 포함하며, 계약 위반 시 책임 당사자를 지목하고 정확한 설명을 제공해야 함[12]
세더해당사항 없음
스칼라[13][14]해당사항 없음
SPARK정적 분석을 통한 에이다 프로그램
Vala해당사항 없음
VDM해당사항 없음



또한, 공통 리스프 객체 시스템의 표준 메서드 조합에는 `:before`, `:after` 및 `:around` 메서드 한정자가 있어 보조 메서드로서의 계약 작성을 비롯한 다양한 용도로 활용할 수 있다.

7. 대한민국에서의 적용과 발전

(이전 출력이 비어있으므로, 수정할 내용이 없습니다. 원본 소스와 요약 정보가 제공되어야 '대한민국에서의 적용과 발전' 섹션 내용을 작성하고 검토할 수 있습니다.)

참조

[1] 서적 Design by Contract Interactive Software Engineering Inc. 1986
[2] 서적 Design by Contract Prentice Hall 1991
[3] 간행물 Applying "Design by Contract" http://se.ethz.ch/~m[...] 1992-10
[4] 웹사이트 United States Patent and Trademark Office registration for "DESIGN BY CONTRACT" https://web.archive.[...] 2009-06-22
[5] 웹사이트 United States Patent and Trademark Office registration for the graphic design with words "Design by Contract" https://web.archive.[...] 2009-06-22
[6] 웹사이트 Trademark Status & Document Retrieval - 78342277 http://tarr.uspto.go[...]
[7] 웹사이트 Trademark Status & Document Retrieval - 78342308 http://tarr.uspto.go[...]
[8] 웹사이트 Assertions in Managed Code 2016-11-15
[9] 문서 Official Python Docs, assert statement https://docs.python.[...]
[10] 웹사이트 D Programming Language, Contract Programming http://dlang.org/con[...] Digital Mars 2014-11-10
[11] 웹사이트 Write Cleaner, Higher Quality Code with Class Contracts in Delphi Prism https://web.archive.[...] Embarcadero Technologies 2016-01-20
[12] 논문 Contracts for Higher-Order Functions http://www.eecs.nort[...]
[13] 웹사이트 Scala Standard Library Docs - Assertions https://www.scala-la[...] EPFL 2019-05-24
[14] 문서 Strong typing https://www.scala-la[...]
[15] 기타
[16] 기타
[17] 웹사이트 Some contributions https://bertrandmeye[...] 2021-02-26
[18] 서적 Design by Contract Interactive Software Engineering Inc. 1986
[19] 서적 Design by Contract Prentice Hall 1991
[20] 간행물 Applying "Design by Contract" http://se.ethz.ch/~m[...] 1992-10
[21] 기타
[22] 기타
[23] 기타
[24] 기타
[25] 기타
[26] 기타
[27] 기타
[28] 기타
[29] 기타
[30] 기타



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com