본문 바로가기

프로그래밍/kotlin

코틀린 - 분리 선언

반응형

분리 선언

때로는 예를 들어, 객체를 변수에 분리하여 할당하는 것이 편리할 수도 있습니다.

val (name, age) = person 

이 구문을  분리 선언 이라고합니다 . 분리 선언은 한 번에 여러 변수를 만듭니다. 우리는 두 개의 새로운 변수를 선언했습니다 : name과 age, 그리고 독립적으로 사용할 수 있습니다 :

println(name)
println(age)

분리 선언은 다음 코드로 컴파일됩니다.

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

component1()와 component2()함수는 코틀린에서 널리 사용되는 관례 규칙 의 또 다른 예이다 + 와*for 루프 와 같은 연산자 참조 ). 필요한 수의 컴포넌트 함수가 호출 될 수있는 한 임의의 것이 분리 선언의 오른쪽에있을 수 있습니다. 그리고 물론 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)
}

// Now, to use this function:
val (result, status) = function(...)

데이터 클래스는 자동으로 componentN()함수를 선언하기 때문에 선언을 파기하는 것이 여기에서 가능합니다.

참고 : 우리는 또한 표준 클래스를 사용할 수 있습니다 Pair및이 function()수익을 Pair<Int, Status>하지만 데이터가 제대로 이름을 가지고하는 것이 좋습니다.

예 : 분리 선언 과 맵

맵을 통과하는 가장 좋은 방법은 다음과 같습니다.

for ((key, value) in map) {
   // do something with the key and the value
}

이 작업을하려면

  • 맵에서 값의 시퀸스로 iterator()함수 를 제공합니다. ;
  • 각 요소를 component1()하고 component2()함수를 Pair으로 제공합니다.

실제로 표준 라이브러리는 다음과 같은 확장을 제공합니다.

operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()

따라서 지도 (데이터 클래스 인스턴스의 콜렉션뿐만 아니라)를 사용 하여 -loops 에서 destructuring 선언을 자유롭게 사용할 수 있습니다 .

사용하지 않는 변수를 위한 밑줄 (1.1 이후)

분리 선언에 변수가 필요하지 않으면 이름 대신 밑줄을 사용할 수 있습니다.

val (_, status) = getResult()

componentN()연산자 함수는이 방법으로 건너 뜁니다 구성 요소에 대한 호출되지 않습니다.

람다에서의 분리 선언 (1.1 년 이후)

람다 매개 변수에 대한 분리 선언 구문을 사용할 수 있습니다. 람다에 Pair유형 의 매개 변수 (또는 Map.Entry적절한 componentN함수 가있는 다른 유형)가있는 경우 괄호 안에 넣으면 여러 매개 변수를 새로 추가 할 수 있습니다.

map.mapValues { entry -> "$!" }
map.mapValues { (key, value) -> "$value!" }

두 개의 매개 변수를 선언하고 매개 변수 대신 분리한 쌍을 선언하는 것의 차이점에 유의하십시오.

{ a -> ... } // one parameter
{ a, b -> ... } // two parameters
{ (a, b) -> ... } // a destructured pair
{ (a, b), c -> ... } // a destructured pair and another parameter 분리한 매개 변수의 구성 요소가 사용되지 않은 경우 밑줄로 대체하여 이름을 고안하지 않아도됩니다.
map.mapValues { (_, value) -> "$value!" }

전체 분리한 매개 변수 또는 특정 구성 요소의 유형을 별도로 지정할 수 있습니다.

map.mapValues { (_, value): Map.Entry<Int, String> -> "$value!" }

map.mapValues { (_, value: String) -> "$value!" }


반응형

'프로그래밍 > kotlin' 카테고리의 다른 글

코틀린 - 함수  (0) 2021.04.18
코틀린 - 고차 함수와 람다  (0) 2021.04.18
코틀린 - 인라인 함수  (0) 2021.04.18
코틀린 - 코루틴  (0) 2021.04.18
컬렉션 : List, Set, Map  (0) 2021.04.18