?:

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

1. 개요

?:는 조건에 따라 두 값 중 하나를 선택하는 데 사용되는 삼항 연산자이다. ALGOL 60에서 조건 표현식을 도입한 이후 다양한 프로그래밍 언어에서 사용되며, `조건 ? 참일 때 값 : 거짓일 때 값` 형태로 표현된다. C, C++, Java, JavaScript, Swift 등 많은 언어에서 `?:` 연산자를 지원하며, Python, Ruby, Visual Basic, PHP 등은 각 언어의 특성에 맞는 방식으로 조건 연산자를 구현한다. 조건 연산자를 지원하지 않는 언어는 논리 연산자의 단락 평가 또는 if 식을 사용하여 유사한 기능을 구현하기도 한다. 관련 연산자로는 널 병합 연산자, 엘비스 연산자, 널 조건 연산자 등이 있다.

?:
개요
종류연산자
연산 대상 개수3개
표기법중위 표기법
형태
C 스타일조건식 ? 참일_경우_값 : 거짓일_경우_값
APL 스타일조건식 {참일_경우_값} {거짓일_경우_값}
OCaml 스타일if 조건식 then 참일_경우_값 else 거짓일_경우_값
Visual Basic 스타일If(조건식, 참일_경우_값, 거짓일_경우_값)
📚 더 읽어볼만한 페이지
  • 조건문 - 패턴 매칭
    패턴 매칭은 데이터 구조나 문자열에서 특정 패턴을 찾아 식별하는 기법으로, 다양한 프로그래밍 언어와 시스템에서 사용되며 데이터 필터링, 추출 및 선언적 프로그래밍에 중요한 역할을 수행한다.
  • 조건문 - Switch 문
    Switch 문은 변수나 표현식 값에 따라 프로그램 제어 흐름을 분기하는 제어문으로, 다양한 프로그래밍 언어에서 구현되어 여러 실행 경로 중 하나를 선택적으로 실행하며, 폴스루 동작 처리 방식에서 언어별 차이를 보인다.
  • 코드 예시에 관한 문서 - 순서도
    순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다.
  • 코드 예시에 관한 문서 - 람다 대수
    람다 대수는 알론조 처치가 수학기초론 연구를 위해 도입한 형식 체계로, 초기 체계의 모순 수정 후 유형 없는 람다 대수와 단순 유형 람다 대수가 발표되었으며, 프로그래밍 언어와의 관계가 명확해지면서 컴퓨터 과학과 언어학에서 중요한 위치를 차지하며 함수형 프로그래밍 언어의 기반이 되었고, 튜링 완전성을 가지는 등 다양한 분야에 응용된다.
  • 연산자 (프로그래밍) - 중위 표기법
    중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다.
  • 연산자 (프로그래밍) - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.

2. 역사

조건 연산자는 1960년 ALGOL 60에서 처음 도입되었다. 이후 C 언어에서 `?:` 연산자로 구체화되었으며, C++, Java, JavaScript 등 C 계열 언어에 널리 채택되었다.

"If #転송 Then #転송 Else #転송"에 해당하는 삼항 연산자는 프로그래밍 언어에서 거의 유일하게 사용되는 일반적인 삼항 연산자이다. 삼항 연산자는 조건식, 참(true)일 때의 식, 거짓(false)일 때의 식, 이렇게 세 개의 피연산자를 묶는다. "If #転송 Then #転송 if"에 해당하는 이항 연산자도 있다. 이항 연산자는 조건식과 참 식 또는 거짓 식 중 하나, 이렇게 두 개의 피연산자를 묶는다.

조건문과 삼항 연산자의 차이점은 다음과 같다.

* 삼항 연산자에서 참 식과 거짓 식은 식(statement)이다. 조건문에서 절(clause)처럼 문장(sentence)을 놓을 수 없다.
* 삼항 연산자는 식이므로 값을 가진다.

3. 구문 및 의미

조건 연산자는 `조건식 ? 참일 때 값 : 거짓일 때 값` 형태로 사용된다. 조건식이 참이면 '참일 때 값'이, 거짓이면 '거짓일 때 값'이 반환된다.

대부분의 언어에서 조건 연산자는 오른쪽 결합을 가지지만, PHP는 예외적으로 왼쪽 결합을 가진다. 언어에 따라 부작용이 있는 표현식 허용 여부, 단락 회로 평가 지원 여부, 평가 순서 등이 다를 수 있다.

C 언어에서는 다음과 같이 사용된다.

```c
result = a > b ? x : y;
```

이는 `if-else` 문을 사용한 다음과 동일하다.

```c
if (a > b) {
result = x;
}
else {
result = y;
}
```

조건 연산자는 조건에 따라 다른 값을 변수에 할당하는 경우에 코드를 간결하게 만들어 준다.

C++에서는 조건 연산자가 lvalue를 반환할 수 있어, 조건에 따라 다른 변수에 값을 할당하는 것도 가능하다.

파이썬에서는 `x if a > b else y`와 같이 피연산자 순서가 다른 형태를 사용한다.

3.1. 다양한 언어에서의 조건 연산자

python
result = x if a > b else y
```

파이썬의 조건 연산자는 피연산자 순서가 일반적인 `?:` 연산자와 다르다. 위와 같은 형태를 사용한다. `x`는 일반적인 값이고, `y`는 예외적인 경우로 간주된다.

파이썬 2.5 이전에는 조건 연산자와 비슷하게 동작하는 방법이 있었지만, 내장 연산자에 비해 단점이 있었다.

4. 논리 연산자를 이용한 모방

Lua는 전통적인 조건 연산자를 가지고 있지 않다. 하지만, `and`와 `or` 연산자의 단락 평가 동작을 통해 이와 유사한 동작을 구현할 수 있다.

```lua
-- var = cond ? a : b; 와 동일
var = cond and a or b
```

이는 `a`가 논리적으로 거짓(즉, `false` 또는 `nil`)이 아닌 한 성공한다. 이 경우, 표현식은 항상 `b`를 반환하므로, 이를 무시하면 예상치 못한 동작이 발생할 수 있다.

논리 연산자의 단락 평가를 이용하면 조건 연산자와 같은 처리를 작성할 수 있다. 단락 평가를 하는 논리 연산자에서 논리곱 `expr1 AND expr2`는 좌변의 식 `expr1`이 거짓값(논리 연산에서 `false`와 같은 값)이면 우변의 식 `expr2`는 평가되지 않는다. 마찬가지로, 논리합 `expr1 OR expr2`는 좌변의 식 `expr1`이 참값(논리 연산에서 `true`와 같은 값)이면 우변의 식 `expr2`는 평가되지 않는다.

따라서 좌변 `expr1`을 조건식으로 하고, 그 결과가 참값인 경우에 평가할 식을 논리곱의 우변 `expr2`에 작성하고, 좌변 `expr1`이 거짓값인 경우에 평가할 식을 논리합의 우변 `expr2`에 작성할 수 있다.

조건 연산자 또는 if-else 식을 단락 평가 논리 연산자로 모방하면 다음과 같이 쓸 수 있다.

: `(cond AND expr1) OR expr2`

(단, `expr1`의 값은 거짓값이 되지 않아야 한다.) 위 식은 `cond`가 거짓값이면 `expr1`을 평가하지 않고 `expr2`를 평가하며, `cond`가 참값(그리고 `expr1`도 참값)이라면 `expr2`를 평가하지 않는다.

다만, 논리 연산자의 평가 결과가 부울형(또는 그에 해당하는 정수형 값)으로 변환되는 프로그래밍 언어에서는 `expr1` 및 `expr2`의 값 자체를 이용할 수 없다는 점이 조건 연산자와의 차이점이다.

5. 조건 연산자와 if 식

조건 연산자를 지원하지 않는 언어라도 if가 문이 아닌 식으로 되어 있는 경우, if 식을 사용하여 동등한 기능을 실현할 수 있다. 예를 들어 F#은 내장된 조건 연산자가 없지만, 다음과 같이 if 식으로 대체할 수 있다.

```fsharp
printfn "Now %s." (if (System.DateTime.Now.Hour >= 12) then "PM" else "AM")
```

Smalltalk에서는 함수 호출에 해당하는 메시지 식에 익명 함수에 해당하는 블록을 전달함으로써 조건식을 구현한다.

```smalltalk
value := 0 < 1 ifTrue:[ 1 ] ifFalse: [ 2 ].

6. 관련 연산자

* 조건 연산자: `A ? B : C`
* 널 병합 연산자: `A ?? B` (null일 때의 기본값 설정)
* 엘비스 연산자: `A ?: B` (false일 때의 기본값 설정)
* null 조건 연산자: `A?.B` (null 검사 자동화)