조건문 when

조건문 when을 이해하기 위해서는 먼저 다른 언어의 switch 문을 공부하는 것이 도움된다. 다른 언어에서의 switch문을 if문과 비교하자면 switch 문은 if문의 연산식에서 사용되는 비교 연산자 중에 ==만 사용해서 같은 값인지를 비교하는 조건문이다.

코틀린을 제외한 거의 모든 컴퓨터 언어에서는 switch라는 이름으로 사용되며 선택문이라고 불리기도 한다.

switch(변수){
	case 비교값:
		//변수값이 비교값과 같다면 이 영역이 실행된다.
}

하지만 코틀린의 when 문은 다른 언어와는 다르게 같은 값뿐만 아니라 범위 값도 처리할 수 있고 사용 방법도 더 많다. 코틀ㄹ니에서 when문은 특정 값을 선택할 수 있는 switch의 사용법에 if 문의 범위 비교 기능이 더해진 if문의 확장판이라고 생각하면 될 거 같다.

예쩨를 통해 when 문의 사용법을 알아보겠다.

일반적인 형태의 when 문 사용하기

when 다음에 괄호( () )를 작성하고 괄호 안에는 주로 비교 대상 파라미터로 사용할 변수명을 입력한다. if에서처럼 괄호 다음에 중괄호 ( {} ) 를 사용해서 when 블록을 구분하고 블록 내부에서 비교할 값은 화살표 연산자 ( → ) 를 사용해서 선택한다.

when(파라미터){
	비교값 -> {
		// 변수값이 배교값과 같다면 이 영역이 실행된다.
	}
}

앞에서 잠깐 살펴본 switch 문과 비교하면 값을 비교하는 줄 앞의 case가 없어지고 비교값 다음의 클론이 화살표 연산자 ( → )로 대체되었다. 여러 개의 값을 하나의 when 문에서 비교할 수도 있다.

when(파라미터){
	비교값 1 -> {
		// 변수값이 비교값1과 같다면 이 영역이 실행된다.
	}

	비교값 2 -> {
		// 변수값이 비교값2과 같다면 이 영역이 실행된다.
	}

	비교값 3 -> {
		// 변수값이 비교값3과 같다면 이 영역이 실행된다.
	}
}

다음 예제처럼 실제 값을 적용해보면 now의 값이 10이기 때문에 가장 마지막의 else 코드 블록이 실행된다.

package com.example.kotlinPr

import android.util.log

fun main(args: Array<String>){
	var now = 10
	when(now){
		8 -> {
			Log.d("when", "현재 시간은 8시 입니다.")
		}

		9 -> {
				Log.d("when", "현재 시간은 9시 입니다.")
		}

		10 -> {
				Log.d("when", "현재 시간은 10시 입니다.")
		}

		else -> { // 위의 모든 조건에 맞지 않으면 else 다음 코드가 실행된다.
				Log.d("when", "현재 시간은 9시가 아닙니다.")
		}
	}
}
현재 시간은 9시가 아닙니다.

콤마로 구분해서 사용하기

특정 값을 비교하는데 결과 처리가 동일하다면 콤마 ( , )로 구분해서 한번에 비교할 수 있다.

package com.example.kotlinPr

import android.util.log

fun main(args: Array<String>){
	var now = 9
	when(now){
		8, 9 -> {
			Log.d("when", "현재 시간은 8시 또는 9시 입니다.")
		}

		else -> { // 위의 모든 조건에 맞지 않으면 else 다음 코드가 실행된다.
				Log.d("when", "현재 시간은 9시가 아닙니다.")
		}
	}
}
현재 시간은 8 또는 9 입니다.

범위 값을 비교하기

in을 사용해서 범위 값을 비교할 수도 있다. if 문의 비교 연산자 중 =, ≥ 와 같은 기능을 구현할 수 있다.

package com.example.kotlinPr

import android.util.log

fun main(args: Array<String>){
	var ageOfMichael = 19
	when(ageOfMichael){
		in 10..19 -> {
			Log.d("ageOfMichael", "마이클은 10대 입니다.")
		}

		!in 10..19 -> {
			Log.d("ageOfMichael", "마이클은 10대가 아닙니다.")
		}

		else -> { // 위의 모든 조건에 맞지 않으면 else 다음 코드가 실행된다.
				Log.d("ageOfMichael", "마이클의 나이를 알 수 없습니다.")
		}
	}
}
마이클은 10대입니다.