나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-11-15 15:53:38

조건문(프로그래밍)


프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all"<colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C(포인터 · 구조체 · size_t) · C++(자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript · Haskell(모나드)
마크업 문법 HTML · CSS
개념과 용어 함수(인라인 함수 · 고차 함수 · 람다식) · 리터럴 · 상속 · 예외 · 조건문 · 반복문 · 참조에 의한 호출 · eval · 네임스페이스
기타 #! · == · === · deprecated · NaN · null · undefined · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}

1. 개요2. 구조
2.1. If2.2. Else2.3. Else-If2.4. If-Else의 반환값
3. 언어별 상세4. 기타5. 관련 문서

1. 개요

Conditionals

프로그래밍 언어에서 특정한 조건식(conditon expression)을 평가한 후 참이라면 특정 프로그램을 실행하고 거짓이라면 실행하지 않는 것 또는 그것을 나타내는 문법.

2. 구조

BASIC, C, PHP, Lua, Python 등등 대단히 많은 프로그래밍 언어에서 제어문 명령어로 if를 사용한다. 그 외에 while, for, switch 등도 있지만, if가 제일 대표적이다. if문을 세계 최초로 사용한 사람은 해석기관을 담보로 프로그래밍을 창안한 에이다 러브레이스. 사실상 에이다 러브레이스가 세계의 고급 프로그래밍 언어 구조 대부분을 설계했다. 어떻게 보면 에이다 러브레이스의 창안이 너무 충격적이라서 그 이후의 컴퓨터 시스템이 에이다의 방식대로 따라간 것일지도 모른다.

2.1. If

제어문은 프로그램 실행 시 조건이 맞을 경우에만 실행하는 부분을 표시하는 것으로, 언어마다 문법은 조금씩 다르지만 명령어로 if를 쓰는 것은 거의 전 언어 공통이라고 봐도 된다.

일반적으로 아래와 같은 형태이며 then은 언어에 따라 생략되는 경우도 있다.
#!syntax basic
if (<조건식>) then {
    <조건식이 참일 경우>
}

if문의 조건식 부분에는 어떠한 식도 올 수 있으나 해당 식에는 반드시 반환값이 존재해야 하며 반환값의 타입은 TRUE/FALSE 만을 표현하는 boolean 값이어야 한다. C언어계열 언어는 이 검사가 느슨해서 integer값을 반환하는 식을 넣어도 정상적으로 동작한다. 이 경우 평가된 값이 0일 경우 거짓, 0이 아닐 경우(양수, 음수 모두) 참으로 판단한다. Java계열 언어는 조건식의 타입이 boolean 값이 아닐 경우 컴파일 에러가 난다. 참도 거짓도 아닌 '중간 상태'는 존재하지 않는다. 만약 전자회로에서 3-state 입력(플로팅 게이트)을 if문에 그냥 때려박을 경우 해당 if문은 CPU에서 평가될 때마다 참과 거짓이 랜덤으로 평가된다.[1]

if 문의 조건식 부분에 식(expression)이 아닌 문(statement)을 넣으면 컴파일 에러가 난다. 따라서 식 부분에 중괄호 문법은 사용할 수 없다.

2.2. Else

if는 보통 else와 세트를 이룬다. if에서 조건이 맞지 않을 경우에 실행되는 부분도 필요한 경우가 많기 때문이다. 그래서인지 else와 합체되는 경우도 있는데 else if나 elif 등으로 표현되기도 한다.

많은 프로그래밍 언어에서 else 문은 생략 가능한 문법이지만 일부 프로그래밍 언어는 문법의 모호함을 엄격하게 회피하기 위해 else 문을 강제하기도 한다.

else는 if에서 유도될 수 있다. conditon의 조건을 부정하면 else가 되기 때문. 의사 코드로 예시를 들면
#!syntax cpp
if (<expr>) {
    <stmt1>;
} else {
    <stmt2>;
}
#!syntax cpp
result = <expr>;
if (result) {
    <stmt1>;
}
if (not result) {
    <stmt2>;
}
와 같이 else를 if만으로 구현할 수 있다. 대신 코드가 길어질 뿐더러 클린코드라고 할 수 없기에 특수한 경우가 아닌이상 지양하는 것이 좋다.

2.3. Else-If

여러 조건문이 동시에 실행되는 경우 if-else-if-else 패턴을 사용한다.

C 패밀리의 언어라면 다음과 같이 사용한다.
#!syntax cpp
if (<cond1>) {
    <stmt1>;
} else if (<cond2>) {
    <stmt2>;
} else {
    <stmt3>;
}

이는 <cond1>이 참이라면 stmt1을 실행하고, <cond1>이 거짓이고 <cond2>가 참이라면 <stmt2>를 실행하고, 둘다 거짓이라면 <stmt3>을 실행하라는 것이다.

이때 <cond2>가 참이라도 <cond1>이 참이라면 <stmt1>이 실행된다는 점에 주의하자.

C의 if문은 블록 내부에 문장(statement)이 하나만 오면 생략할 수 있다. if-else는 이것이 생략된 형태이며 명시적으로 블록을 표시한다면 다음과 같다.
#!syntax cpp
if (<cond1>) {
    <stmt1>;
} else {
    if (<cond2>) {
        <stmt2>;
    } else {
        <stmt3>;
    }
}

초보자가 하기 쉬운 실수이지만 if를 여러 개 쓰는 것과 else-if를 여러 개 쓰는 것은 구별해야 한다. 예를 들어var이 0인 경우
#!syntax cpp
if (var == 0) ++var;
if (var == 1) ++var;
라고 쓰면 두 번의 제어문을 거쳐서 var 변수는 2가 될 것이지만,
#!syntax cpp
if (var == 0) ++var;
else if (var == 1) ++var;
이라고 쓰면 var가 0일 경우 첫 번째 브랜치에서 if문을 빠져나오며 var은 1이 된다.

2.4. If-Else의 반환값

if문과 다르게 둘중 하나는 반드시 실행됨이 자명한 if-else문은 언어에 따라 반환값이 존재하는 경우가 존재한다.[2]

if문이 반환값을 갖는 경우에는 조건식을 검사하고 그것이 참일 경우 조건식이 참인 부분의 '문'을 평가한 결과(보통 문의 마지막 식을 평가한 결과값)를 반환하며 거짓일 경우에는 거짓 부분의 문을 평가한 값을 반환한다. if 문이 반환값을 갖지 않는 경우에는 if문 좌변에 대입문을 사용할 경우 컴파일 에러가 난다. 이는 언어마다 다르며 보통 명령형 언어에서는 if문이 반환값이 없고 논리 프로그래밍 언어, 함수형 프로그래밍 언어에서는 if문에 반환값이 있다.

일반 if-else문과는 다르게 생긴 별도의 문법이 있는 언어도 존재한다. 예를 들어 Python의 경우
#!syntax python
result = <expr1> if <cond> else <expr2>
처럼 쓸 경우 조건이 참이라면 result변수에는 <expr1>의 값이, 거짓일 경우 <expr2>가 담기게 된다.

C 패밀리의 경우 삼항 연산자가 비슷한 역할을 대신한다.

보통 if-else문만 반환값이 있지만 if에만 있는 언어도 존재한다. 이 경우 조건식이 거짓인 경우 nil등 적당한 값을 반환한다.

강타입 언어의 경우 if와 else 브랜치가 반환하는 값이 반드시 T로 같아야 하거나 T | U와 같이 유니온으로 계산되냐에 따라 갈린다.

3. 언어별 상세

4. 기타

5. 관련 문서


[1] 참과 거짓이 균일하게 랜덤으로 나오지도 않는다. 대부분의 경우 어느 한 쪽에 크게 치우친다.[2] 이 경우 언어의 스펙 문서에 if '문'이 아닌 if '표현식'이라는 용어를 쓴다

파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는
문서의 r61
, 3번 문단
에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r61 (이전 역사)
문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)

문서의 r (이전 역사)