HOME > kotlin > basic

Kotlin - Pair와 Triple 사용 방법

JSFollow07 Jun 2019

함수는 1개의 객체를 리턴합니다. 대부분의 경우 1개의 객체만 리턴하기 때문에 불편함 없이 사용합니다. 하지만 간혹 2개의 값을 리턴하고 싶을 때가 있습니다. 이럴 때 클래스를 만들어 그 안에 필요한 값을 저장하고 리턴하는 방법이 있습니다. 또는 배열을 만들어 그 안에 저장하로 리턴할 수 있겠죠. 물론 이런 방법으로 해결은 할 수 있지만 매번 클래스를 만드는 것은 귀찮습니다.

코틀린은 Pair와 Triple 객체를 기본으로 제공하여 이런 불편함을 해소하려고 하였습니다. Pair는 두개의 객체를 저장할 수 있는 객체이고, Triple은 3개의 객체를 저장하는 객체입니다. 가독성 측면에서 클래스를 만들어 리턴하는 것이 좋을 수 있습니다. 하지만 Pair와 Triple을 잘 사용하면 가독성을 해치지 않고 간단히 2개 또는 3개의 객체를 리턴할 수 있습니다.

이 글에서 어떻게 Pair와 Triple을 사용하는지 알아보겠습니다.

Pair 사용 방법

Pair는 이렇게 객체를 생성하고 두개의 객체를 넣을 수 있습니다. 안에 들어가는 객체의 클래스 또는 자료형은 중요하지 않습니다. 두개가 동일해도 되고 달라도 됩니다.

val pair1 = Pair("Hello", "World")
val pair2 = Pair("Hello", 1234)

위에서 Pair의 타입은 생략되었지만 명시적으로 타입을 쓰고 싶다면 Pair 옆에 <타입, 타입>을 써주시면 됩니다.

val pair1 = Pair<String, String>("Hello", "World")
val pair2 = Pair<String, Int>("Hello", 1234)

Pair 안에 저장된 객체는 firstsecond로 접근할 수 있습니다. first는 첫번째, second는 두번째 객체를 의미합니다.

val pair = Pair("Hello", 1234)
System.out.println(pair.first)
System.out.println(pair.second)

결과를 보면 첫번째와 두번째 객체가 출력이 됩니다.

Hello
1234

또, 다른 방식으로 Pair의 객체를 읽을 수도 있습니다. Pair의 component1()함수는 첫번째 객체를 리턴합니다. component2()함수는 두번째 객체를 리턴합니다. 이 코드의 출력 결과는 위와 동일합니다.

val pair = Pair("Hello", 1234)
System.out.println(pair.component1())
System.out.println(pair.component2())

새로운 변수를 정의할 때 Pair를 이용하여 쉽게 값을 할당할 수 있습니다.

val (hello, number) = Pair("Hello", 1234)
System.out.println(hello)
System.out.println(number)

위의 코드 val (hello, number)에서 hello는 Pair의 첫번째 객체가 할당되고, number는 두번째 객체가 할당됩니다. 변수들은 괄호 안에 정의해야 하며 첫번째로 정의된 변수에 Pair의 첫번째 객체가 할당됩니다. 이름은 중요하지 않습니다.

함수에서 리턴되는 Pair를 변수에 바로 할당하게 만들수도 있습니다. 함수는 Pair 객체를 리턴하고 선언한 변수에 바로 할당되었습니다. 함수를 정의해줄 때 어떤 타입의 Pair객체를 리턴할지 명시적으로 정의해줘야 합니다.

fun makePair(first: String, second: String) : Pair<String, String>  {
    return Pair(first, second)
}

val (hello, world) = makePair("Hello", "World")

코틀린에서 기본으로 제공하는 Infix 함수 to 를 사용하면 Pair 객체를 생성할 수 있습니다.(Infix 함수에 대한 설명은 여기를 참고해주세요) 아래 코드 "Hello" to "World"에서 to 이전의 문자열은 Pair의 첫번째, to 이후의 문자열은 Pair의 두번째 객체로 생성이 됩니다.

val pair : Pair<String, String> = "Hello" to "World"
val (hello, world) = "Hello" to "World"

Pair 객체를 리스트로 변환할 수도 있습니다. toList()를 사용하면 리스트로 리턴됩니다.

val list = pair.toList()
System.out.println(list[0])
System.out.println(list[1])

Triple 사용 방법

Triple도 Pair의 특성과 동일합니다. Triple 생성 및 출력은 아래와 같습니다. Pair와 다른 점은 3번째 객체를 리턴하는 thirdcomponent3()가 추가되었습니다.

val triple = Triple<String, String, Int>("Hello", "World", 1234)
System.out.println(triple.first)
System.out.println(triple.second)
System.out.println(triple.third)

System.out.println(triple.component1())
System.out.println(triple.component2())
System.out.println(triple.component3())

Triple을 변수에 할당하는 방법도 Pair와 동일합니다.

val (hello, world, number) = Triple("Hello", "World", 1234)

Pair처럼 리스트로 변환할 수도 있습니다.

val list = triple.toList()
System.out.println(list[0])
System.out.println(list[1])
System.out.println(list[2])

정리

Pair와 Triple 사용방법에 대해서 알아보았습니다. 클래스로 객체를 리턴하는 것이 과한 경우 Pair와 Triple을 이용하여 여러 객체를 간단히 리턴할 수 있습니다. 리턴과 동시에 변수에 할당할 수 있기 때문에 변수의 이름을 잘 짓는다면 리턴되는 객체가 어떤 것인지 쉽게 알 수 있습니다. 그래서 배열을 리턴하는 것보다 코드가 간결하고 가독성이 좋아질 수 있습니다.

참고