튜플(Tuple)은 스위프트에서 제공하는 조금 특별한 집단 자료형으로서 한 가지 타입의 아이템만 저장가능한 배열이나 딕셔너리와 달리 여러 타입의 아이템을 저장할 수있다. 하지만 일단 선언되고 나면 상수적 성격을 지녀 후에 값을 추가하거나 삭제하는(동적인) 활동이 불가능하다. 즉, 최초에 선언된 상태의 아이템만 사용이 가능하고 수정, 삭제, 추가 등의 변경은 불가하다는 것이다.
튜플은 대괄호를 사용하는 배열과 집합과 다르게 소괄호()를 사용해 아이템을 정의한다.
(<튜플 아이템1>, <튜플 아이템2>, ... )
튜플의 인덱스는 속성으로 다음과 같이 제공된다. 다음과 같이 점(dot)으로 인덱스를 연결해 사용할 수 있다.
let tupleValue = ("a", "b", 1, 2.5, true)
tupleValue.0 // "a"
tupleValue.1 // "b"
tupleValue.2 // 1
tupleValue.3 // 2.5
tupleValue.4 // true
튜플은 별도의 선언 구문이 없지만 타입어노테이션을 사용하기 위한 타입을 정의할 수는 있다. 이 때 정의되는 타입 어노테이션의 내용은 튜플의 아이템에 따라 달라진다.
var tpl01 : (Int, Int) = (100, 200)
var tpl02 : (Int, String, Int) = (100, "a", 200)
var tpl03 : (Int, (String, String)) = (100, ("i", "j"))
var tpl04 : (String) = ("This is sample")
tpl03을 보면 튜플의 아이템으로 튜플을 가질 수 있다는 특징을 볼 수 있다.
주의해서 보아야할 것은 tpl04인데 선언 시에 문자열 하나만 저장할 수 있도록 튜플로 선언했지만 실제 저장된 결과는 튜플이 아닌 문자열 변수로 저장된 것을 확인할 수 있다. 하나의 아이템만 있는 튜플은 아이템 타입의 일반 자료형이 되버리는 것을 기억해야한다.
튜플을 인덱스의 속성으로만 접근하는 것은 때론 불편할 수 있다. 때문에 스위프트에서는 튜플의 아이템을 개별 변수나 상수로 각각 할당받는 바인딩(Binding)방식의 구문을 제공한다.
let tupleValue : (String, Character, Int, Float, Bool) = ("a", "b", 3, 2.5, true)
let (a, b, c, d, e) = tupleValue
// a >> "a"
// b >> "b"
// c >> 3
// d >> 2.5
// e >> true
다음과 같은 방식으로 바인딩이 가능하며 이렇게 바인딩된 튜플 (a, b, c, d, e)의 각 상수들은 a, b, c, d, e의 순서로 개별 아이템을 할당받아 독립적인 사용이 가능하다.
print(a)
print(b)
print(c + 2)
print(d * 2)
print(e)
/* 실행결과
a
b
5
5.0
true
튜플을 자료형이라기보다는 연산자로 보는 것이 타당하다는 의견도 있다.(실제 스위프트 공식문서에서 집단 자료형 부분에 튜플은 존재하지 않음) 다른 자료형과 비교해 제공하는 메소드나 속성이 없고 유일한게 인덱스 속성 하나이기 때문이다. 크기를 계산할 수 있는 속성이나 데이터를 읽어올 수 있는 메소드, 순회할 수 있는 순회 특성(Sequence Type)도 지원하지 않는다. 때문에 for ~ in 구문에 사용할 수도 없다.
이렇게 조금 특이한 튜플이 제대로 쓰이는 곳은 함수나 메소드에서이다. 함수나 메소드에서 둘 이상의 값을 반환하려면 번거로운 과정이 필요한데 이 때 튜플을 이용하면 아주 간단하게 전달할 수 있다.
func getTupleValue -> (String, String, Int) {
return ("t", "v", 10)
}
let (a,b,c) = getTupleValue()
// a >> "t"
// b >> "v"
// c >> 10
함수의 실행결과 반환된 값은 let (a,b,c)에 순서대로 할당된다. 이제 이 상수 a, b, c의 값은 자유롭게 사용이 가능해지는 것이다.
튜플로 반환된 결과값을 바인딩할 때 굳이 튜플의 아이템을 모두 받을 필요가 없는 경우는 다음과 같이 처리하면 된다.
...(중략)...
let (a, b, _) = getTupleValue()
// a >> "t"
// b >> "v"
이렇게 언더바(_)로 대체가 가능하다. 다만, 주의할 점은 언더바를 포함한 전체 변수나 상수의 개수는 튜플 아이템의 개수와 반드시 일치해야한다.
함수는 항상 하나의 객체만 반환할 수 있기 때문에 이렇게 튜플을 이용하는 것은 매우 효율적인 방법이다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 옵셔널(Optional) (0) | 2022.05.11 |
---|---|
스위프트(Swift) - 집단자료형(Collection Types) Ⅳ. 딕셔너리(Dictionary) (0) | 2022.05.10 |
스위프트(Swift) - 집단자료형(Collection Types) Ⅱ. 집합(Set) (0) | 2022.05.06 |
스위프트(Swift) - 집단 자료형(Collection Types) Ⅰ. 배열(Array) (0) | 2022.05.05 |
스위프트(Swift) - 제어 전달문(Control Transfer Statements) (0) | 2022.05.04 |