5-3.기타 연산자

5-3-가.삼항 조건 연산자

삼항 조건 연산자는 특이하게도 피연산자를 세 개나 가지는데 다른 언어에는 없는 C언어의 독특한 연산자이다. 기본 형식은 다음과 같다.

 

(조건식) ? 1:2

 

? 앞에 조건식이 있고 ? 뒤에 :을 사이에 두고 두 개의 값이 온다. ?와 :은 한 연산자를 구성하는 짝이기 때문에 반드시 같이 와야 하며 단독으로 사용할 수는 없다. if else, do while처럼 짝을 이루어 사용되는 연산자이다. 이 연산자는 조건식을 평가해 보고 참이면 값1을 리턴하고 거짓이면 값2를 리턴한다. 조건식 자리에는 보통 변수의 값을 비교하는 관계 연산문이 오지만 조건식으로 사용될 수 있는 식이면 어떤 것이든지 가능하다. 변수나 상수, 함수호출문 등 논리값을 리턴하는 모든 식이 올 수 있다. 조건식을 감싸는 괄호는 반드시 필요한 것은 아니나 괄호가 있는 것이 보기에 좋고 안정감이 있어 보인다. 간단한 사용예를 보면 이 연산자의 동작을 쉽게 이해할 수 있을 것이다.

 

: samhang

#include <Turboc.h>

 

void main()

{

     int i=3,j=4,k;

 

     k=(i > j) ? i:j;

     printf("큰 수=%d\n",k);

}

 

i는 3이고 j는 4로 초기화되었으며 k는 삼항 조건 연산자로 i나 j중에 큰 값을 대입받는다. 보다시피 i보다 j가 더 크게 초기화되었으므로 j가 선택될 것이다. ? 연산자는 조건식 (i > j)를 평가하여 i가 j보다 더 큰지 점검한다. 점검 결과가 참이면 i를 리턴하고 그렇지 않으면 j를 리턴할 것이다. 그래서 이 연산문은 두 변수 중 큰 값을 취한다.

삼항 연산자가 들어간 문장은 ?를 우리말의 "이면"으로 바꾸고 :을 "아니면"으로 바꾸면 쉽게 읽을 수 있다. 위 예제의 연산문을 말로 바꾸면 "i > j 이면 i, 아니면 j"가 되어 금방 의미를 파악할 수 있다. 삼항 조건 연산자는 일종의 조건문이기 때문에 if else문으로 바꿀 수 있다.

 

if (i > j) {

     k=i;

} else {

     k=j;

}

 

그러나 여러 줄로 써야 할 코드를 한줄로 간편하게 표현할 수 있다는 점에서 삼항 조건 연산자가 더 간단하다. 게다가 중간 변수없이 수식내에서 바로 사용할 수 있으므로 조건에 따라 두 개의 값 중 하나를 선택할 때 주로 많이 사용된다. 위 예제에서 k변수를 따로 선언할 필요없이 삼항 조건 연산문을 printf의 인수로 바로 사용하는 것도 가능하다. 여러 개의 값 중 하나를 선택해야 한다면 삼항 조건 연산자를 중복해서 사용할 수도 있다.

 

k=(i > j) ? i: (j < 0) ? 0:j;

 

이 코드는 i가 j보다 크면 i를 취하고 j가 더 크면 j를 취하되 단, j가 음수일 경우는 0을 돌려준다. 원래 j가 있던 자리를 삼항 조건 연산문으로 대체했는데 k=(i > j) ? i:((j < 0) ? 0:j);식으로 괄호를 써 주면 좀 더 의미가 분명해질 것이다.

1과 값2는 형식에 제한없이 어떤 값이나 올 수 있지만 동일한 타입이어야 한다. 왜냐하면 연산 결과를 대입받는 변수의 타입이 가변적일 수는 없기 때문이다. 똑같이 정수형이거나 아니면 똑같이 실수형이어야 한다. 다음과 같은 표현도 가능하다.

 

printf("%s", (a==6) ? "a는 6이다.":"a는 6이 아니다.");

 

문자열 자체는 포인터 상수인데 조건에 따라 둘 중 하나를 선택할 수 있다. 다음과 같이 조금 더 압축할 수도 있다.

 

printf("a는 6이%s다.", (a==6) ? "":" 아니");

 

%s 서식 자리에 어떤 문자열을 삽입하되 a가 6이면 "", 즉 빈 문자열을 삽입하고 6이 아니면 "아니"라는 부정어를 삽입하면 된다. 결과는 동일한데 상당히 깜직하지 않은가? 이런 비슷한 예가 앞 장의 예제에도 있었다. 홀짝을 판별하는 if5예제의 경우 if문을 쓸 필요없이 다음과 같이 바로 홀짝 판별을 할 수 있다.

 

printf("%d는 %s수입니다.\n",i,i%2==0 ? "짝":"홀");

 

서식 문자열 내에 %s 서식을 넣고 i를 2로 나눈 나머지가 0이면 "짝" 아니면 "홀"과 대응시키면 된다. 또 나누기 연산의 결과를 바로 조건에 사용하면 i%2 ? "홀":"짝"으로 조금 더 압축할 수 있다. 연산자 자체의 기능은 간단하지만 실제 활용되는 곳을 보면 응용하기에 따라서는 여러 가지 역할을 할 수 있는데 이런 것을 보면 문법에는 역시 응용의 묘미가 있다. 단, 가독성과 이식성을 해치지 않는 범위에서만 응용을 해야 한다.