엘비스 연산자

엘비스 프레슬리, 옆으로 본 연산자와 닮은 머리 특정 컴퓨터 프로그래밍 언어에서, 종종 **`?:`**로 표기되는 **엘비스 연산자**(Elvis operator)는 첫 번째 피연산자를 평가하고 그 값이 논리적으로 참(언어에 따라 달라지는 규칙, 즉 truthy 값)이면 그 값을 반환하며, 그렇지 않으면 두 번째 피연산자를 평가하여 반환하는 이항 연산자이다. 두 번째 피연산자는 반환될 경우에만 평가된다(단락 평가). 엘비스 연산자의 표기는 삼항 조건 연산자, `? :`에서 영감을 받았다. 이는 엘비스 연산자 표현식 `A ?: B`가 삼항 조건 표현식 `A ? A : B`와 거의 동등하기 때문이다. "엘비스 연산자"라는 이름은 흔히 사용되는 표기인 `?:`를 옆으로 보면 엘비스 프레슬리의 시그니처 헤어스타일을 한 이모티콘과 닮았다는 사실에서 유래했다.quote=The new operator is called Elvis operator because it uses a question mark and a colon together (?:); if you view it sideways, it reminds you of Elvis Presley. 유사한 연산자는 널 병합 연산자인데, 여기서 불리언 참(truthiness) 검사는 비-null 검사로 대체된다. 이는 일반적으로 `??`로 표기되며, C 샤프accessdate=5 December 2018 또는 다트 (프로그래밍 언어)publisher=Google와 같은 언어에서 볼 수 있다.
# 대체 구문
커먼 리스프, 클로저 (프로그래밍 언어), 루아 (프로그래밍 언어), 오브젝트 파스칼, 펄, 파이썬, 루비 (프로그래밍 언어), 자바스크립트와 같은 여러 언어에서는 엘비스 연산자가 필요하지 않다. 이는 해당 언어의 논리합 연산자(일반적으로 `||` 또는 `or`)가 단락 평가를 수행하여, 첫 번째 피연산자가 truthy 값으로 평가되면 첫 번째 피연산자를 반환하고, 그렇지 않으면 두 번째 피연산자를 반환하기 때문이다(이 경우 두 번째 피연산자는 truthy 또는 falsy 값일 수 있으며, C 및 C++처럼 불리언 참 또는 거짓 값이 아니다). 이러한 의미론은 엘비스 연산자와 동일하다.
# 예시

## 불리언 변형
엘비스 연산자를 지원하는 언어에서 다음과 같은 코드: :` x = f() ?: g() ` 는 `f()`의 결과가 truthy이면 `x`를 `f()`의 결과로 설정하고, 그렇지 않으면 `g()`의 결과로 설정한다. 이는 조건 삼항 연산자를 사용하는 다음 예시와 동등하다: :` x = f() ? f() : g() ` 단, `f()`가 truthy 값을 반환하더라도 두 번 평가하지 않는다. `f()`가 항상 동일한 결과를 반환하는 상태 독립 함수가 아닌 경우 임의의 동작이 발생할 가능성에 유의하라.
## 객체 참조 변형
널 병합 연산자 이 코드는 null이 아님이 보장된 객체에 대한 참조를 반환한다. 함수 `f()`는 불리언 대신 객체 참조를 반환하며, null을 반환할 수 있다. null은 일반적으로 falsy로 간주된다: :` x = f() ?: "기본값" `
# 엘비스 연산자를 지원하는 언어
* GNU C (프로그래밍 언어) 및 C++ (즉, GCC 확장 기능이 있는 C 및 C++에서) 삼항 연산자의 두 번째 피연산자는 선택 사항이다.website=gcc.gnu.org 이는 적어도 GCC 2.95.3 (2001년 3월)부터 그랬으며, 원래 엘비스 연산자로 보인다.website=gcc.gnu.org * Groovy (프로그래밍 언어)에서는 "엘비스 연산자" `?:`가 별도의 연산자로 문서화되어 있다.title=Elvis Operator (?: ) 이 기능은 Groovy 1.5website=groovy-lang.org (2007년 12월)에 추가되었다. Groovy는 GNU C나 PHP와 달리 삼항 `?:`의 두 번째 피연산자를 단순히 생략하는 것을 허용하지 않고, 대신 이항 `?:`를 공백 없이 단일 연산자로 작성해야 한다. * PHP에서는 PHP 5.3부터 삼항 연산자의 중간 부분을 생략할 수 있다.accessdate=2014-02-17 (2009년 6월). * Fantom 프로그래밍 언어는 첫 번째 피연산자를 `null`과 비교하는 `?:` 이항 연산자를 가지고 있다. * Kotlin에서는 엘비스 연산자가 왼쪽 피연산자가 null이 아니면 왼쪽 피연산자를 반환하고, 그렇지 않으면 오른쪽 피연산자를 반환한다.website=Kotlin 일반적인 패턴은 다음과 같이 `return`과 함께 사용하는 것이다: 1=val foo = bar() ?: return * Gosu에서는 `?:` 연산자가 왼쪽 피연산자가 null인 경우에도 오른쪽 피연산자를 반환한다. * C 샤프에서는 null 조건부 연산자 `?.`가 "엘비스 연산자"로 불리지만,page=59 동일한 기능을 수행하지는 않는다. 대신 널 병합 연산자 `??`가 그 역할을 한다. * 콜드퓨전 및 CFML에서는 `?:` 구문을 사용하여 엘비스 연산자가 도입되었다. * Xtend 프로그래밍 언어는 엘비스 연산자를 가지고 있다.website=eclipse.org * 구글의 클로저 템플릿에서는 엘비스 연산자가 널 병합 연산자이며, `isNonnull($a) ? $a : $b`와 동등하다.date=29 October 2021 * Ballerina에서는 엘비스 연산자 `L ?: R`은 `L`이 nil이 아니면 `L`의 값을 반환한다. 그렇지 않으면 `R`의 값을 반환한다.url-status=dead * 자바스크립트에서 null 병합(`??`) 연산자는 왼쪽 피연산자가 `null` 또는 `undefined`일 때 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자이다.language=en-US * 펄에는 논리 단락 평가를 수행하는 논리합 `||`과 유사한 낮은 우선순위의 `or`가 있다.access-date=2025-07-09 이들은 단락 평가 없이 두 피연산자를 모두 평가하는 비트별 or 연산자 `|`와는 다르다. 또한 해당하는 할당 연산자 `||=`는 오른쪽 피연산자를 평가하고 왼쪽 피연산자의 논리 값이 참이 아닌 경우에만 이를 왼쪽 피연산자에 할당한다. 또한 정의된-or 연산자 `//`는 왼쪽 피연산자가 정의되지 않은 경우에만 오른쪽 피연산자를 평가하고 그 값을 반환한다. 마지막으로 해당하는 할당 연산자는 `//=`이다. 유사한 배타적-or 연산자들은 단락 평가를 하지 않으므로 엘비스 연산자가 아니다. 다른 단락 평가 연산자로는 논리적-and 연산자 `&&`와 `and`가 있지만, 이들의 동작은 엘비스 연산자와 반대이다.