{{위키데이터 속성 추적}}
[[파일:If-Then-Else-diagram.svg|섬네일|If 플로 다이어그램.]]
[[파일:IF-THEN-ELSE-END flowchart.svg|섬네일|If-then-else 플로차트.]]
[[컴퓨터 과학]]에서 '''조건문'''(條件文, conditional)이란 어떤 조건이 주어질 때 어떤 동작을 수행하도록 하는, 즉 주어진 조건의 만족 여부에 따라 선택적으로 실행하고자 할 때 사용되는 문장이다. [[프로그래머]]가 명시한 [[불리언 자료형]] 조건이 참인지 거짓인지에 따라 달라지는 계산이나 상황을 수행하는 [[프로그래밍 언어]]의 특징이다.

== C 언어에서의 조건문 ==
C에서는 if를 사용하여 조건문을 만든다. if의 조건이 참이 아닐 때 수행할 동작은 else 문에서 지정 가능하며, if와 else 사이에 else if를 통해 새로운 조건을 넣을 수 있다. C의 영향을 받은 [[C++]], [[자바 (프로그래밍 언어)|자바]] 등도 같은 형식을 따른다.

<syntaxhighlight lang="c" line="1">
#include <stdio.h>

int main(void){
     int a = 2, c = 5;
     if(a == c){
          printf("a는 c와 같다.");
     }
     else {
          printf("a는 c와 다르다.");
     }
     return 0;
}
</syntaxhighlight>

이 소스는 a라는 변수에 2를 저장하고 c라는 변수에 5를 저장한 뒤, a와 c가 같은지 확인하고 출력한다. 이 소스는 밑의 소스처럼 좀 더 줄일 수 있다.

<syntaxhighlight lang="c">
#include <stdio.h>

int main(void){
     int a = 2, c = 5;
     a == c ? printf("a는 c와 같다.") : printf("a는 c와 다르다.");
     return 0;
}
</syntaxhighlight>

위의 소스는 삼항 연산자를 사용해 if를 사용한 소스와 같은 동작을 수행하는 프로그램을 작성한 것이다. 그러나 이 소스는 else if처럼 다른 조건에서 동작하는 지의 여부를 알 수 없다.

<syntaxhighlight lang="c">
#include <stdio.h>

int main(void){
     int a = 2, c = 5;
     if(a > c){
          printf("a는 c보다 크다.");
     } else if(a < c) {
          printf("a는 c보다 작다.");
     } else {
          printf("a는 c와 같다.");
     }
     return 0;
}
</syntaxhighlight>

이 소스는 else if까지 추가시켜서 만든 조건문이다.

== case와 switch 문 ==
{{본문|Switch 문}}
[[switch 문]] (일부 언어의 경우 case 문이나 다방향 브랜치라고도 함)은 지정된 상수의 값을 비교한 다음, 일치하는 첫 상수에 따라 동작을 취한다.

{| class="wikitable"
|-
! [[파스칼 (프로그래밍 언어)|파스칼]]:
! [[C (프로그래밍 언어)|C]]:
! [[셸 스크립트]]:
|-
|<syntaxhighlight lang="pascal">
case someChar of
  'a': actionOnA;
  'x': actionOnX;
  'y','z':actionOnYandZ;
  else actionOnNoMatch;
end;
</syntaxhighlight>
|<syntaxhighlight lang="c">
switch (someChar) {
  case 'a': actionOnA; break;
  case 'x': actionOnX; break;
  case 'y':
  case 'z': actionOnYandZ; break;
  default: actionOnNoMatch;
}
</syntaxhighlight>
|<syntaxhighlight lang="bash">
case $someChar in
   a)    actionOnA; ;;
   x)    actionOnX; ;;
   [yz]) actionOnYandZ; ;;
  *)     actionOnNoMatch  ;;
esac
</syntaxhighlight>
|}

== 언어별 비교 참조 ==
{| class="wikitable"
|-
! rowspan=2 | [[프로그래밍 언어]]
! colspan=3 | 구조화된 if
! rowspan=2 | [[switch 문|switch]] 선택
! rowspan=2 | 산술 if
! rowspan=2 | 패턴 일치{{ref label|pattern matching|A|none}}
|-
! then
! else
! else–if
|-
|{{rh}}| [[에이다 (프로그래밍 언어)|에이다]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[C (프로그래밍 언어)|C]], [[C++]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|1}}
| {{yes|Fall-through}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[C 샤프]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|2}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[코볼]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|2}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[에펠]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes|[[switch 문|예]]}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[F 샤프|F#]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice const|C|1}}
| {{no}}
| {{yes}}
|- 
|{{rh}}| [[포트란 90]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
|- 
|{{rh}}| [[고]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|1}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[하스켈]]
| {{yes}}
| {{yes|필요}}
| {{no|불필요}}{{ref label|choice else if|B|3}}
| {{no|불필요}}{{ref label|choice const|C|2}}
| {{no}}
| {{yes}}
|- 
|{{rh}}| [[자바 (프로그래밍 언어)|자바]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|4}}
| {{yes|Fall-through}}<ref name="JLS">[http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf Java.sun.com], Java Language Specification, 3rd Edition.</ref>
| {{no}}
| {{no}}
|- 
|{{rh}}| [[ECMAScript]] ([[자바스크립트]])
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|5}}
| {{yes|Fall-through}}<ref name="ECMA-262">[http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Ecma-international.org] {{웨이백|url=http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf |date=20150412040502 }} ECMAScript Language Specification, 5th Edition.</ref>
| {{no}}
| {{no}}
|-
|{{rh}}| [[메스메티카]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{yes}}
|-
|{{rh}}| [[오베론]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[펄]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[PHP]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes|Fall-through}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[파스칼 (프로그래밍 언어)|파스칼]], [[오브젝트 파스칼]] ([[델파이]])
| {{yes}}
| {{yes}}
| {{no|불필요}}
| {{yes}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[파이썬]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[퀵베이직]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[루비 (프로그래밍 언어)|루비]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{yes|<code>case</code> w/ [[정규 표현식|Regexp]]}}{{ref label|case regexp|D|none}}
|-
|{{rh}}| [[스칼라]]
| {{yes}}
| {{yes}}
| {{no|불필요}}{{ref label|choice else if|B|4}}
| {{yes|Fall-through}}
| {{no}}
| {{yes}}
|-
|{{rh}}| [[SQL]]
| {{yes}}{{ref label|SQL|S|1}}
| {{yes}}
| {{yes}}
| {{yes}}{{ref label|SQL|S|2}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[비주얼 베이직]], 클래식
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|-
|{{rh}}| [[비주얼 베이직 닷넷]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes}}
| {{no}}
| {{no}}
|- 
|{{rh}}| [[윈도우 파워셸]]
| {{yes}}
| {{yes}}
| {{yes}}
| {{yes|Fall-through}}
| {{no}}
| {{no}}
|}

== 같이 보기 ==
* [[브랜치 (컴퓨터 과학)]]
* [[동적 디스패치]]
* [[관계연산자]]
* [[Test (유닉스)]]
* [[요다 조건]]
== 각주 ==
; 내용주
<ol type="A">
<small>
<li> {{note label|pattern matching|A|none}} This refers to pattern matching as a distinct conditional construct in the programming language – as opposed to mere string pattern matching support, such as [[정규 표현식|regular expression]] support.</li>
<li> {{note label|choice else if|B|1}} {{note label|choice else if|B|2}} {{note label|choice else if|B|3}} {{note label|choice else if|B|4}} {{note label|choice else if|B|5}}The often-encountered <code>else if</code> in the C family of languages, and in COBOL and Haskell, is not a language feature but a set of nested and independent ''if then else'' statements combined with a particular source code layout. However, this also means that a distinct else–if construct is not really needed in these languages.</li>
<li> {{note label|choice const|C|1}} {{note label|choice const|C|2}} In Haskell and F#, a separate constant choice construct is unneeded, because the same task can be done with pattern matching.</li>
<li> {{note label|case regexp|D|none}} In a Ruby <code>case</code> construct, [[정규 표현식|regular expression]] matching is among the conditional flow-control alternatives available. For an example, see [http://stackoverflow.com/questions/6803647/how-to-write-a-ruby-switch-statement-case-when-with-regex-and-backreferences this] Stack Overflow question.</li>
<li> {{note label|SQL|S|1}}{{note label|SQL|S|2}} SQL has two similar constructs that fulfill both roles, both introduced in [[SQL-92]]. A "searched <code>CASE</code>" expression <code>CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END</code> works like <code>if ... else if ... else</code>, whereas a "simple <code>CASE</code>" expression: <code>CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END</code> works like a switch statement. For details and examples see [[Case (SQL)]].</li>
</small>
</ol>
; 참조주
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [http://everythingfla.com/courses/video/8/69/ IF NOT (ActionScript 3.0)] {{웨이백|url=http://everythingfla.com/courses/video/8/69/ |date=20111101061553 }} video

[[분류:조건문| ]]
[[분류:프로그래밍 구성체]]