함수는 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 안에 저장된 객체는 first
와 second
로 접근할 수 있습니다.
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번째 객체를 리턴하는 third
와 component3()
가 추가되었습니다.
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을 이용하여 여러 객체를 간단히 리턴할 수 있습니다. 리턴과 동시에 변수에 할당할 수 있기 때문에 변수의 이름을 잘 짓는다면 리턴되는 객체가 어떤 것인지 쉽게 알 수 있습니다. 그래서 배열을 리턴하는 것보다 코드가 간결하고 가독성이 좋아질 수 있습니다.
참고
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크