맨위로가기

?:

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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. 다양한 언어에서의 조건 연산자

python

result = 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