상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Kotlin과 Android/Kotlin

코틀린 제어문 If(), When() 사용법

월터제이(Walter J) 2020. 10. 22. 09:00

안녕하세요, 반갑습니다!

 

모든 프로그래밍 언어에 있는 제어문,

코틀린에도 당연히 있습니다.

 

제어문은 크게 조건문과 반복문으로 나눌수 있는데요.

그 중 대표적으로 2가지를 정리해보고자 합니다.

 

바로,

 

if() / when()

 

 

if() 는 기존의 자바에서 사용하던 함수입니다.

반면에 when() 은 코틀린에서 새로 생긴 함수 입니다.

하지만 자바의 Switch() 에 대응합니다. 따라서 기존 switch() 와 똑같이 사용할 수 있습니다.

 

1. if()

if() 원형입니다.

ifExpression (used by primaryExpression)
  : 'if' '(' expression ')'
    (controlStructureBody | ';')
  | 'if' '(' expression ')'
    controlStructureBody? ';'? 'else' (controlStructureBody | ';')
  ;

 

사용법은 기존 자바와 동일합니다.

참/거짓을 판별해서 그에 따른 처리를 하는데요.

자바와 거의 차이가 없네요.

다른 점이 있다면 자바의 삼항 연산자를 통한 방법은 코틀린에서 삭제 되었습니다.

아, 삼항 연산자가 삭제된 것이지 방법은 아래 3번째로 동일하게 사용할 수 있습니다.

// 일반적인 방법
var max = a 
if (a < b) max = b

// else 사용 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// 중괄호( '{' , '}' ) 없이 사용
val max = if (a > b) a else b	//삼항연산자와 동일, 단 처리 구문이 한 줄이어야 함

 

그리고 코틀린에서 새로운 기능도 생겼습니다.

아래 코드처럼 식으로도 사용할 수 있습니다.

//식으로도 사용 가능
val max = if (a > b) {
    print("Choose a")	//"Choose a" 를 출력하고 max 에 a를 대입
    a
} else {
    print("Choose b")	//"Choose b" 를 출력하고 max 에 b를 대입
    b
}

개인적으로 식으로 사용하는 방법을 선호하는 편입니다.

쓸데 없이 변수를 만들 필요도 없고, 저는 자바보다 직관적인 것 같습니다.

 

 

2. when()

when() 의 원형입니다.

원형만 보더라도 기존 자바의 switch 보다 더 많은 기능이 있음이 보이네요.

whenSubject (used by whenExpression)
  : '(' (annotation* 'val' variableDeclaration '=')? expression ')'
  ;
  
whenExpression (used by primaryExpression)
  : 'when' whenSubject? '{' whenEntry* '}'
  ;
  
whenEntry (used by whenExpression)
  : whenCondition (',' whenCondition)* ','? '->' controlStructureBody semi?
  | 'else' '->' controlStructureBody semi?
  ;
  
whenCondition (used by whenEntry)
  : expression
  | rangeTest
  | typeTest
  ;

 

사용법은 기본적으로 기존 자바의 switch와 같습니다.

차이가 있다면 단순히 문법의 차이가 있겠네요.

'case''default' 가 사라지고 심플하게 '값 ->''else' 로 대체되었습니다.

//일반적인 방법
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

 

아래처럼 사용할 수도 있습니다.

콤마( , ) 를 사용해서 두 개 이상의 값을 하나로 처리할 수도 있습니다.

//콤마(,) 를 사용해서 두개 이상의 값을 하나로 처리
when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

 

또한 범위를 지정해서 처리할 수도 있죠.

//범위 처리
when (x) {
    in 1..10 -> print("x is in the range")	//x 가 1~10 이내(in) 일 때,
    in validNumbers -> print("x is valid")	
    !in 10..20 -> print("x is outside the range")	//x 가 10~20 이 외(!in) 일 때,
    else -> print("none of the above")
}

 

if() 와 같이 식으로도 사용할 수 있습니다.

아래 처럼 hasPrefix()의 반환값으로 when() 을 사용해서 x가 문자열인지 확인,

x 의 시작 글자가 "prefix" 인지 검사해서 참/거짓을 반환할 수 있습니다.

//식으로 사용
fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
}

 

if() 의 if - else if 와 같이 사용할 수도 있습니다.

이 때는 when() 에서 기준이 되는 값이 없는데요. 단, 이때는 참/거짓만을 조건으로 할 수 있습니다.

//기준이 되는 값 없이 사용
when {
    x.isOdd() -> print("x is odd")
    y.isEven() -> print("y is even")
    else -> print("x+y is even.")
}

 

when() 의 조건을 식으로도 줄 수도 있네요?

이건 몰랐던 방법인데요ㅎ

코틀린 버전 1.3 부터 가능한 문법이라고 합니다.

참고하셔서 더 다양하고 아름답게 코딩하시면 좋겠네요.

//when() 의 파라미터를 조건식으로 줄 수도 있음
fun Request.getBody() =
        when (val response = executeRequest()) {
            is Success -> response.body
            is HttpError -> throw HttpException(response.status)
        }

 

 

 

코틀린 공식 문서에서 참고했습니다.

그런데 제가 몰랐던 when() 의 기능이 또 있었네요ㅎ

이래서 개발자는 공식 문서를 끼고 살란 말이 괜히 있는게 아닌 것 같습니다.

 

이제 알았으니 저도 조금 더 아름다운 코드를 작성할 수 있겠죠?

(언제 할 수 있을지..ㅠ)

 

이정도면 다른 조건문인 for() 와 while() 에 대해서도 궁금한데요.

다음 포스팅은 for() 와 while() 에 대해서 정리 해보도록 하겠습니다.

 

감사합니다!

반응형