엘비스 연산자

특정 컴퓨터 프로그래밍 언어에서, 종종 ?:로 표기되는 엘비스 연산자(Elvis operator)는 첫 번째 피연산자를 평가하고 그 값이 논리적으로 참(언어에 따라 달라지는 규칙, 즉 truthy 값)이면 그 값을 반환하며, 그렇지 않으면 두 번째 피연산자를 평가하여 반환하는 이항 연산자이다. 두 번째 피연산자는 반환될 경우에만 평가된다(단락 평가). 엘비스 연산자의 표기는 삼항 조건 연산자, ? :에서 영감을 받았다. 이는 엘비스 연산자 표현식 A ?: B가 삼항 조건 표현식 A ? A : B와 거의 동등하기 때문이다.

"엘비스 연산자"라는 이름은 흔히 사용되는 표기인 ?:를 옆으로 보면 엘비스 프레슬리의 시그니처 헤어스타일을 한 이모티콘과 닮았다는 사실에서 유래했다.

유사한 연산자는 널 병합 연산자인데, 여기서 불리언 참(truthiness) 검사는 비-null 검사로 대체된다. 이는 일반적으로 ??로 표기되며, C 샤프 또는 다트 (프로그래밍 언어)와 같은 언어에서 볼 수 있다.

 대체 구문 
커먼 리스프, 클로저 (프로그래밍 언어), 루아 (프로그래밍 언어), 오브젝트 파스칼, 펄, 파이썬, 루비 (프로그래밍 언어), 자바스크립트와 같은 여러 언어에서는 엘비스 연산자가 필요하지 않다. 이는 해당 언어의 논리합 연산자(일반적으로 || 또는 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++에서) 삼항 연산자의 두 번째 피연산자는 선택 사항이다. 이는 적어도 GCC 2.95.3 (2001년 3월)부터 그랬으며, 원래 엘비스 연산자로 보인다.
 Groovy (프로그래밍 언어)에서는 "엘비스 연산자" ?:가 별도의 연산자로 문서화되어 있다. 이 기능은 Groovy 1.5 (2007년 12월)에 추가되었다. Groovy는 GNU C나 PHP와 달리 삼항 ?:의 두 번째 피연산자를 단순히 생략하는 것을 허용하지 않고, 대신 이항 ?:를 공백 없이 단일 연산자로 작성해야 한다.
 PHP에서는 PHP 5.3부터 삼항 연산자의 중간 부분을 생략할 수 있다. (2009년 6월).
 Fantom 프로그래밍 언어는 첫 번째 피연산자를 null과 비교하는 ?: 이항 연산자를 가지고 있다.
 Kotlin에서는 엘비스 연산자가 왼쪽 피연산자가 null이 아니면 왼쪽 피연산자를 반환하고, 그렇지 않으면 오른쪽 피연산자를 반환한다. 일반적인 패턴은 다음과 같이 return과 함께 사용하는 것이다: 
 Gosu에서는 ?: 연산자가 왼쪽 피연산자가 null인 경우에도 오른쪽 피연산자를 반환한다.
 C 샤프에서는 null 조건부 연산자 ?.가 "엘비스 연산자"로 불리지만, 동일한 기능을 수행하지는 않는다. 대신 널 병합 연산자 ??가 그 역할을 한다.
 콜드퓨전 및 CFML에서는 ?: 구문을 사용하여 엘비스 연산자가 도입되었다.
 Xtend 프로그래밍 언어는 엘비스 연산자를 가지고 있다.
 구글의 클로저 템플릿에서는 엘비스 연산자가 널 병합 연산자이며, isNonnull($a) ? $a : $b와 동등하다.
 Ballerina에서는 엘비스 연산자 L ?: R은 L이 nil이 아니면 L의 값을 반환한다. 그렇지 않으면 R의 값을 반환한다.
 자바스크립트에서 null 병합(??) 연산자는 왼쪽 피연산자가 null 또는 undefined일 때 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자이다.
 펄에는 논리 단락 평가를 수행하는 논리합 ||과 유사한 낮은 우선순위의 or가 있다. 이들은 단락 평가 없이 두 피연산자를 모두 평가하는 비트별 or 연산자 |와는 다르다. 또한 해당하는 할당 연산자 ||=는 오른쪽 피연산자를 평가하고 왼쪽 피연산자의 논리 값이 참이 아닌 경우에만 이를 왼쪽 피연산자에 할당한다. 또한 정의된-or 연산자 //는 왼쪽 피연산자가 정의되지 않은 경우에만 오른쪽 피연산자를 평가하고 그 값을 반환한다. 마지막으로 해당하는 할당 연산자는 //=이다. 유사한 배타적-or 연산자들은 단락 평가를 하지 않으므로 엘비스 연산자가 아니다. 다른 단락 평가 연산자로는 논리적-and 연산자 &&와 and가 있지만, 이들의 동작은 엘비스 연산자와 반대이다.

 같이 보기 
?: 또는 조건 연산자, 삼항 연산자로 사용될 때
 널 병합 연산자,  연산자
 안전 탐색 연산자, 종종 ?.
 우주선 연산자 <=>
 옵션 타입

 각주 

분류:엘비스 프레슬리
분류:이항연산
분류:코드 예시에 관한 문서
분류:조건문
분류:연산자 (프로그래밍)