[Swift] 자료형 - tuple(튜플)
<개요 및 특징>
스위프트에서 튜플은 여러가지 데이터들을 묶은 데이터 타입이다.
파이썬에도 비슷한 자료형인 튜플이 있지만, 개인적인 생각으론 파이썬의 튜플보다는 C의 구조체와 더 비슷하다. 파이썬에도 여러가지 확장 튜플이 있긴 하지만.
<기본 예제>
생성
튜플의 기본적인 생성 방법은 파이썬과 크게 다르지 않게 괄호() 사이에 데이터를 묶음으로 생성 할 수 있다.
var tuple1: (Int, Double, String) = (0, 1.0, "2")
var tuple2: ((Int, Int), [Double]) = ((3, 4), [5.0 , 6.0])
print("tuple1: ", tuple1)
print("tuple2: ", tuple2)
// tuple1: (0, 1.0, "2")
// tuple2: ((3, 4), [5.0, 6.0])
위 예제 코드에서처럼 튜플 안에 묶을 수 있는 타입의 한계는 거의 없다. Integer, Double, String 뿐만 아니라 튜플, 배열, 구조체, 클래스 등등 거의 대부분의 데이터 타입이 가능하다.
내부 데이터 접근
스위프트 튜플의 접근 방법은 파이썬과는 다르게 .(dot)을 이용한다.
파이썬의 튜플처럼 인덱스가 0부터 시작하는건 같으나, 접근 할 때 대괄호[ ]를 이용하면 에러를 발생시킨다.
var tuple1: (Int, Double, String) = (0, 1.0, "2")
var tuple2: ((Int, Int), [Double]) = ((3, 4), [5.0 , 6.0])
print(tuple1.2)
print(tuple2.1)
// 2
// [5.0, 6.0]
멤버 이름 붙이기
그리고 튜플의 각 멤버(필드?)들에게 이름을 붙여 줄 수도 있다. 이 정도 왔으면 거의 C의 구조체와 근접해졌다.
var tuple1: (zero: Int, one: Double, two: String) = (0, 1.0, "2")
var tuple2: (three4: (Int, Int), five6: [Double]) = ((3, 4), [5.0 , 6.0])
print(tuple1.zero)
print(tuple2.three4)
print(tuple1.0)
print(tuple2.0)
// 0
// (3, 4)
// 0
// (3, 4)
튜플의 원소들에게 이름을 붙여주면 기존처럼 인덱스를 이용해 접근 할 수도 있고, 붙여준 이름으로도 접근 할 수 있다.
개인적으로 알고리즘 문제를 풀 때 튜플을 매우 자주 사용하는 편인데, 인덱스가 햇갈리는 경우가 종종 있어 원소 이름 붙이기도 많이 쓴다.
멤버 값 변경
또, 스위프트는 튜플 내부의 데이터를 변경 할 수 있다. 파이썬의 튜플과 큰 다른점으로 볼 수 있겠다.
단, var로 선언한 튜플만 가능하고 당연히 let으로 선언한 튜플은 멤버가 가진 데이터를 변경하지 못한다.
var tuple1: (zero: Int, one: Double, two: String) = (0, 1.0, "2")
var tuple2: (three4: (Int, Int), five6: [Double]) = ((3, 4), [5.0 , 6.0])
tuple1.zero = 2
print(tuple1.zero)
tuple2.five6 = [1.0, 2.0, 3.0]
print(tuple2.five6)
// 2
// [1.0, 2.0, 3.0]
단 변경전의 데이터 타입과 변경후의 데이터 타입이 일치해야 한다. 다음과 같은 경우엔 에러가 발생한다.
별칭 지정
마지막으로 튜플을 하나의 자료형으로 선언 할 수도 있다. 더 정확하게 말하면 특정 꼴의 튜플에게 별칭 선언을 해줄 수 있다.
typealias NumberTuple = (zero: Int, one: Double, two: String)
var tuple1: NumberTuple = (0, 1.0, "2")
print(tuple1.one)
// 1.0
이 정도쯤 왔으면 스위프트의 튜플은 C의 구조체 수준의 기능은 갖췄다고 생각된다.
파이썬에서도 그렇고 튜플이란 자료형은 진짜 자주 사용된다. 기존에 배열을 사용했던 부분이나 혹은 여러 변수로 나눠서 인자를 전달하던 부분 같은 경우에는 튜플을 이용하면 코드가 깔끔해지는 경우가 많으니 잘 활용해 보자.