티스토리 뷰

출처: https://s3.ap-northeast-2.amazonaws.com/grepp-cloudfront/programmers_imgs/learn/thumb-course-java-intermediate.jpg

#_ Condition Operator, What the fun!?


삼항연산자의 활용에 대해 물어보면 시니어 프로그래머라면 잘 아시겠지만, 주니어 프로그래머의 경우 알고는 있지만  사용하지 않는다던가, 처음 들어보는 경우가 있을겁니다.

 

나는 입문할 당시 책에서 배웠었나? 하는 궁금증이 생겨 책장에 있는 자바 책을 뒤적여 봤습니다. Java 입문서로 널리 알려진 Head First Java 책의 47페이지 조건문에 따른 분기문 챕터에서는 언급하고 있지 않네요.. 남궁성님이 집필하신 자바의 정석에서는 다루고 있군요. 그도 그럴것이 삼항연산자는 몰라도 괜찮은(?) 녀석이기 때문입니다. 우리에겐 강력한 if/else가 있으니까요.

 

책 head first java의 표지. 재미있는 비유들로 가득한 설명이 특징이다.

수년간 자바를 통해 개발을 해온 제 입장에서 삼항 연산자는 안써도 좋지만 쓰면 더 좋은! 그런 녀석입니다. 이 좋은 친구에 대해 제 경험을 토대로 이야기 해보고자 합니다. 이 글을 읽으시는 분 들 중에 이친구에 대해 전혀 모르시는 분이 계실지도 모르니 정의부터 시작해보겠습니다.

 

 

#_ 삼항연산자(Condition Operator) 란?


if/else 문과 비슷하지만 심플한 분기문을 처리하는데 특화되어 있는 녀석으로, 문법은 아래와 같습니다.

 

Condition ? A : B

 

한줄로 끝나는 아주 간단한 형태입니다. 식에 사용되는 키워드인 `?` 와 `:` 사이에 들어가는 값들은 규칙을 가지고 있는데 아래와 같습니다.

 

Keyword Description
Condition True 혹은 False 값을 반환하는 조건식 입니다.
? 뒤에 오는 값이 Condtion에 따른 리턴값임을 알려주는 약속어 입니다.
A Condition의 결과가 true일 때 반환될 값입니다.
: True/False 에 따른 반환값을 구분하는 구분자입니다.
B Condtion의 결과가 false일 때 반환될 값입니다.

 

간단하지요? 이녀석 어떨 때 쓰면 좋을까요? 

 

 

#_ 삼항연산자의 특징 > 읽기 쉬운 코드작성


여기 간단하지만 명료한 예제를 준비했습니다. 정수형 변수인 a 와 b 중 더 큰 수를 bigger라는 변수에 저장한다고 생각해봅시다. 일반적인 if/else 문을 활용한다면 아래와 같이 표현할 수 있습니다.

int bigger;
if (a > b) {
	bigger = a;
} else {
	bigger = b;
}

조건에 따라 처리되는 코드가 한줄이라면 아래와 같이 조금 더 깔끔하게 표현할 수 있겠죠?

int bigger;
if (a > b) 
	bigger = a;
else
	bigger = b;

프로그래밍을 하다보면 위와같은 condition에 따른 분기처리를 하는 경우가 많습니다. 하지만 우리는 자바를 잘 이해하고 있다는 걸 보여주기 위해 삼항연산자를 이용해 한줄로 같은 동작을 하는 코드를 작성할 수 있습니다. 바로 아래처럼요.

int bigger = (a > b) ? a : b;

어떤가요? 같은 로직이지만 삼항연산자는 이 코드가 어떤 동작을 하고있는지 보다 직관적으로 나타내고 있습니다. 그럼 한줄짜리 분기처리를 위해 삼항연산자가 존재하는 걸까요? 

 

 

#_ if/else는 가지지 못한, 삼항연산자는 가지고 있는


잠시 쉬어가자는 의미로 퀴즈를 하나 내보겠습니다. 남들은 다 있지만 저만 없는건 뭘까요? 정답: 여자친구

삼항연산자는 가지고 있지만 if/else는 가지지 못한것은 무엇일까요?

답을 말씀드리기 전에 문(statement)과 식(expression)의 차이점에 대해 이야기를 해보겠습니다. 제가 요즘 읽고있는 Kotlin in Action 이라는 책에서는  문과 식의 차이점에 아래와 같이 설명하고 있습니다.

문(statement)과 식(expression)의 구분
... 
식은 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있는 반면 문은 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로 존재하며 아무런 값을 만들어내지 않는다는 차이가 있다. 
...
출처 : Kotlin in Action / page. 62

왜 뜬금없이 문과 식에 대해 이야길 꺼냈는지 짐작이 가시나요? 제 문제의 답은 바로 값(value) 입니다.

전설의_없어요_짤.jpeg

그리고 값은 식이 만들어냅니다. 위 내용을 토대로 if/else와 삼항연산자의 차이점을 정리를 해보면 아래와 같습니다.

 

  • if/else - 문(statement) 으로서 if 자체로는 아무런 값을 만들어내지 않는다.
  • 삼항연산자 - 식(expression) 으로서 값을 만들어낸다.

이러한 이유로,  if/else 는 못하는 걸 삼항연산자는 해냅니다. 바로 아래처럼요.

String message = String.format("%d와 %d중 더 큰 수는 %d입니다.", a, b, (a > b) ? a : b);

저는 이런 특성을 이용해 많은 parameter를 전달해야 하는 메서드 호출 시 상황에 따른 값을 넘겨줘야 할 때 삼항연산자를 자주 사용합니다.

void Build(int width, int height, String title){ ... }

...

int screenWidth = WindowManager.getWidth();
int screenHeight = WindowManager.getHeight();
String userName = client.getUserName();

ScreenBuilder builder = 
	new ScreenBuilder(isPip ? 1 : screenWidth, isPip ? 1 : screenHeight, isUser ? userName : "관리자");

 

 


 

#_ 마치며


삼항연산자를 알고 있지만 어떻게 써야할지 몰라 활용하지 못하는 분들이 많은 것 같아 제 경험을 토대로 정리를 해보았습니다. 머릿속으론 알고있는 개념을 읽기좋게, 맛있게 풀어서 쓰려다 보니 몇 시간이 걸렸네요. 그래도 이 글이 많은 분들에게 도움이 되었으면 좋겠습니다.

 

읽어주셔서 감사합니다. 좋은하루 되십시오.

 

 

* 하트 버튼과 구독하기 그리고 광고를 클릭해주시면 포스팅을 이어나가는데 힘이 됩니다!

댓글