[Kotlin] 5-1. 분리 선언

분리 선언

때때로 다음 예처럼 객체를 여러 변수에 분리해서 할당하는 것이 편리할 때가 있다

val (name, age) = person

이런 구문을 분리 선언이라고 부른다. 분리 선언은 한 번에 여러 변수를 생성한다. name과 age의 두 변수를 선언했고 각자 따로 사용할 수 있다

println(name)
println(age)

분리 선언은 다음과 같은 코드로 컴파일된다

val name = person.component1()
val age = person.component2()

component1()과 component2() 함수는 코틀린에서 광범위하게 사용하는 관례 규칙예다. 필요한 개수의 component함수를 호출할 수만 있으면 무엇이든 분리 선언의 오른쪽에 위치할 수 있다. 물론 component3()과 component4() 등이 존재할 수 있다.
componentN()함수에 operator키워드를 붙여야 분리 선언에서 그 함수를 사용할 수 있다

분리 선언은 또한 다음과 같이 for루프에서도 동작한다

for((a,b) in collection) { ... }

변수 a와 b는 콜렉션 요소의 component1()과 component2() 함수가 리턴한 값을 구한다

예제: 함수에서 두 값 리턴하기

함수에서 두 값을 리턴하고 싶다고 하자. 예를 들어 어떤 종류의 결과 객체와 상태를 리턴해야 한다고 가정하자. 코틀린에서 이를 간략하게 처리하는 방법은 데이터 클래스를 선언하고 그 클래스의 인스턴스를 리턴하는 것이다

data class Result(val result: Int, val status: Status)
fun function(...): Result {
  // computations
  return Result(result, status)
}

// 이제 이 함수를 사용한다
val(result, status) = function(...)

데이터 클래스는 자동으로 componentN() 함수를 선언하므로 여기서 분리 선언이 작동한다

예제: 분리 선언과 맵

맵을 순회하는 가장 나은 방법은 아마도 다음일 것이다

for((key, value) in map) {
  // 키와 값으로 무엇을 함
}

사용하지 않는 변수를 위한 밑줄

분리 선언에서 변수가 필요 없으면 이름 대신에 밑줄을 사용할 수 있다

val(_, status) = getResult()

이 방식으로 생략한 component에 대해 componentN() 연산자 함수를 호출하지 않는다