?:
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
?:는 조건에 따라 두 값 중 하나를 선택하는 데 사용되는 삼항 연산자이다. ALGOL 60에서 조건 표현식을 도입한 이후 다양한 프로그래밍 언어에서 사용되며, `조건 ? 참일 때 값 : 거짓일 때 값` 형태로 표현된다. C, C++, Java, JavaScript, Swift 등 많은 언어에서 `?:` 연산자를 지원하며, Python, Ruby, Visual Basic, PHP 등은 각 언어의 특성에 맞는 방식으로 조건 연산자를 구현한다. 조건 연산자를 지원하지 않는 언어는 논리 연산자의 단락 평가 또는 if 식을 사용하여 유사한 기능을 구현하기도 한다. 관련 연산자로는 널 병합 연산자, 엘비스 연산자, 널 조건 연산자 등이 있다.
더 읽어볼만한 페이지
- 조건문 - 패턴 매칭
패턴 매칭은 데이터 구조나 문자열에서 특정 패턴을 찾아 식별하는 기법으로, 다양한 프로그래밍 언어와 시스템에서 사용되며 데이터 필터링, 추출 및 선언적 프로그래밍에 중요한 역할을 수행한다. - 조건문 - Switch 문
Switch 문은 변수나 표현식 값에 따라 프로그램 제어 흐름을 분기하는 제어문으로, 다양한 프로그래밍 언어에서 구현되어 여러 실행 경로 중 하나를 선택적으로 실행하며, 폴스루 동작 처리 방식에서 언어별 차이를 보인다. - 코드 예시에 관한 문서 - 순서도
순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다. - 코드 예시에 관한 문서 - 람다 대수
람다 대수는 알론조 처치가 수학기초론 연구를 위해 도입한 형식 체계로, 초기 체계의 모순 수정 후 유형 없는 람다 대수와 단순 유형 람다 대수가 발표되었으며, 프로그래밍 언어와의 관계가 명확해지면서 컴퓨터 과학과 언어학에서 중요한 위치를 차지하며 함수형 프로그래밍 언어의 기반이 되었고, 튜링 완전성을 가지는 등 다양한 분야에 응용된다. - 연산자 (프로그래밍) - 중위 표기법
중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다. - 연산자 (프로그래밍) - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
?: | |
---|---|
개요 | |
종류 | 연산자 |
연산 대상 개수 | 3개 |
표기법 | 중위 표기법 |
형태 | |
C 스타일 | 조건식 ? 참일_경우_값 : 거짓일_경우_값 |
APL 스타일 | 조건식 {참일_경우_값} {거짓일_경우_값} |
OCaml 스타일 | if 조건식 then 참일_경우_값 else 거짓일_경우_값 |
Visual Basic 스타일 | If(조건식, 참일_경우_값, 거짓일_경우_값) |
2. 역사
조건 연산자는 1960년 ALGOL 60에서 처음 도입되었다. 이후 C 언어에서 `?:` 연산자로 구체화되었으며, C++, Java, JavaScript 등 C 계열 언어에 널리 채택되었다.[1]
"If #転송 Then #転송 Else #転송"에 해당하는 삼항 연산자는 프로그래밍 언어에서 거의 유일하게 사용되는 일반적인 삼항 연산자이다.[1] 삼항 연산자는 조건식, 참(true)일 때의 식, 거짓(false)일 때의 식, 이렇게 세 개의 피연산자를 묶는다.[1] "If #転송 Then #転송 if"에 해당하는 이항 연산자도 있다.[1] 이항 연산자는 조건식과 참 식 또는 거짓 식 중 하나, 이렇게 두 개의 피연산자를 묶는다.[1]
조건문과 삼항 연산자의 차이점은 다음과 같다.[1]
- 삼항 연산자에서 참 식과 거짓 식은 식(statement)이다. 조건문에서 절(clause)처럼 문장(sentence)을 놓을 수 없다.[1]
- 삼항 연산자는 식이므로 값을 가진다.[1]
3. 구문 및 의미
조건 연산자는 `조건식 ? 참일 때 값 : 거짓일 때 값` 형태로 사용된다. 조건식이 참이면 '참일 때 값'이, 거짓이면 '거짓일 때 값'이 반환된다.
대부분의 언어에서 조건 연산자는 오른쪽 결합을 가지지만, PHP는 예외적으로 왼쪽 결합을 가진다.[3] 언어에 따라 부작용이 있는 표현식 허용 여부, 단락 회로 평가 지원 여부, 평가 순서 등이 다를 수 있다.
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. 다양한 언어에서의 조건 연산자
pythonresult = x if a > b else y
```
파이썬의 조건 연산자는 피연산자 순서가 일반적인 `?:` 연산자와 다르다. 위와 같은 형태를 사용한다.[19] `x`는 일반적인 값이고, `y`는 예외적인 경우로 간주된다.
파이썬 2.5 이전에는 조건 연산자와 비슷하게 동작하는 방법이 있었지만, 내장 연산자에 비해 단점이 있었다.
4. 논리 연산자를 이용한 모방
Lua는 전통적인 조건 연산자를 가지고 있지 않다. 하지만, `and`와 `or` 연산자의 단락 평가 동작을 통해 이와 유사한 동작을 구현할 수 있다.[11]
```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 식으로 대체할 수 있다.[10]
```fsharp
printfn "Now %s." (if (System.DateTime.Now.Hour >= 12) then "PM" else "AM")
```
Smalltalk에서는 함수 호출에 해당하는 메시지 식에 익명 함수에 해당하는 블록을 전달함으로써 조건식을 구현한다.[22]
```smalltalk
value := 0 < 1 ifTrue:[ 1 ] ifFalse: [ 2 ].
6. 관련 연산자
- 조건 연산자: `A ? B : C`
- 널 병합 연산자: `A ?? B` (null일 때의 기본값 설정)[1]
- 엘비스 연산자: `A ?: B` (false일 때의 기본값 설정)[1]
- null 조건 연산자: `A?.B` (null 검사 자동화)[1]
참조
[1]
논문
Fundamental Concepts in Programming Languages
[2]
서적
The BCPL Reference Manual
http://www.eah-jena.[...]
2017-03-15
[3]
웹사이트
Ternary operator associativity
http://phpsadness.co[...]
PHP Sadness
2017-09-20
[4]
웹사이트
Rationale for Ada 2012
http://www.ada-auth.[...]
ACAA
2015-12-10
[5]
문서
ISO.IEC 9899:1999 (E) 6.5.15.4
[6]
웹사이트
C++ Operator Precedence
http://en.cppreferen[...]
[7]
문서
Java 7 Specification: 15.25 Conditional Operator ? :
http://docs.oracle.c[...]
[8]
웹사이트
Control Flow · The Julia Language
https://docs.juliala[...]
2020-03-12
[9]
웹사이트
ECMA-262 Edition 5.1
http://www.ecma-inte[...]
Ecma International
2013-09-07
[10]
웹사이트
Kotlin Lang If Expression
https://kotlinlang.o[...]
2021-04-25
[11]
웹사이트
Syntax § If-then-else expressions
https://luau-lang.or[...]
2023-02-07
[12]
서적
Programming Perl
O'Reilly Media
2012-02
[13]
웹사이트
perlop: Conditional Operator
https://perldoc.perl[...]
2019-01-26
[14]
웹사이트
PHP: a fractal of bad design
http://eev.ee/blog/2[...]
2012-04-09
[15]
웹사이트
Comparison Operators, Example #3: Non-obvious Ternary Behaviour
http://php.net/terna[...]
PHP website
2013-04-26
[16]
웹사이트
PHP Bug #61915: incorrect associativity of ternary operator
https://bugs.php.net[...]
PHP website
2012-05-02
[17]
웹사이트
about_If - Using the ternary operator syntax
https://learn.micros[...]
2023-06-07
[18]
웹사이트
about_Operators - Ternary operator
https://learn.micros[...]
2024-09-03
[19]
웹사이트
The Python Language Reference
https://docs.python.[...]
[20]
웹사이트
Perl6 Operators
http://perlcabal.org[...]
2010-05-18
[21]
문서
Programming Ruby: Conditional Execution
http://ruby-doc.org/[...]
[22]
웹사이트
Remove Ternary Operator by pwoolcoc · Pull Request #1705 · rust-lang/Rust
https://github.com/r[...]
[23]
웹사이트
Remove ternary operator · Issue #1698 · rust-lang/Rust
https://github.com/r[...]
[24]
웹사이트
Zig Language Reference
https://ziglang.org/[...]
2023-08-09
[25]
웹사이트
Does Go have the ?: operator?
https://go.dev/doc/f[...]
2012-08-05
[26]
웹사이트
lo package - github.com/samber/lo - Go Packages
https://pkg.go.dev/g[...]
2023-09-30
[27]
웹사이트
If expressions
http://doc.rust-lang[...]
2015-07-21
[28]
웹사이트
Ternary operator in PowerShell
https://stackoverflo[...]
2018-10-09
[29]
문서
The Ruby Style Guide
https://github.com/r[...]
[30]
문서
(c and (x,) or (y,))[0]
のようにする。要素数がゼロ個より多いタプルはPythonではtruthyであることを利用している(ので、xの値がfalsyな値であっても誤動作しない)。
[31]
문서
PEP 308
http://www.python.or[...]
[32]
문서
Visual Basic 언어의 새로운 기능
http://msdn.microsof[...]
[33]
문서
If 연산자 (Visual Basic)
http://msdn.microsof[...]
[34]
논문
:en:Fundamental Concepts in Programming Languages
[35]
서적
The BCPL Reference Manual
http://www.eah-jena.[...]
2017-03-15
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com