튜플(Tuple)
- 하나의 튜플에 여러 가지 타입의 아이템을 저장할 수 있음
- 선언되고 나면 상수적 성격을 띰
- 더이상 값을 추가하거나 삭제하는 등의 변경 불가능
- 오직 최초에 선언된 상태의 아이템만 사용할 수 있고, 수정이나 삭제, 추가 등 변경할 수 없음
( <튜플 아이템1>, <튜플 아이템2>, ... )
- 아이템 변경이 일체 제한되므로 동적 추가가 불가능
- 별도의 선언을 위한 구문이 없음
- 인덱스 속성을 이용하여 참조할 수 있음
- 배열의 인덱스와 달리 튜플의 인덱스는 속성으로 제공
- 따라서 [i] 안에 인덱스를 작성하는 배열과 달리 튜플에서는 .(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
- 별도의 선언 구문은 없지만 Type annotation을 사용하기 위한 타입을 정의할 수는 있음
var tpl01 : (Int, Int) = (100, 100)
var tpl02 : (Int, String, Int) = (100, "a", 100)
var tpl03 : (Int, (String, String)) = (100, ("t", "v"))
var tpl04 : (String) = ("Sample String")
- Type annotation을 사용하여 튜플을 선언할 시에는 아이템의 개수와 순서에 맞게 각각의 타입을 선언해야 함
- tpl04의 경우 하나의 아이템만 있는 튜플 → 문자열 변수로 선언
- 하나의 아이템만 있는 튜플은 아이템 타입의 일반 자료형이 됨
let tupleValue:(String, Character, Int, Float, Bool) = ("a", "b", 1, 2.5, true)
- Type annotation을 지정해주지 않는다면?
- 아이템 "b"의 경우 Type annotation을 지정해주지 않는 경우 타입 추론 원칙에 의해 상위 타입인 String 형태로 추론
- 아이템 2.5의 경우 또한 상위 타입인 Double로 추론
- 튜플에서 Type annotation을 하는 이유는 원치 않는 타입으로 추론되는 것을 방지하기 위해서!
튜플의 아이템을 개별 변수나 상수로 각각 할당받는 바인딩(Binding) 구문
// 5개의 아이템이 저장된 tupleValue를 (a, b, c, d, e)라는 다섯 개의 상수로 이루어진 튜플에 바인딩
let tupleValue:(String, Character, Int, Float, Bool) = ("a", "b", 1, 2.5, true)
let (a, b, c, d, e) = tupleValue
// a -> "a"
// b -> "b"
// c -> 1
// d -> 2.5
// e -> true
// 바인딩된 튜플(a, b, c, d, e)의 각 상수들은 a, b, c, d, e의 순서대로 개별 아이템을 할당받아
// 독립적으로 사용할 수 있음
print(a) // a
print(b) // b
print(c + 2) // 3
print(d * 2) // 5.0
print(e) // true
튜플을 사용하는 이유
- 프로그램이 실행되는 동안 값이 절대 변하지 않아야 하는 상수 성격
- 값이 바뀔 가능성을 근본적으로 제거해야 할 경우
- 다른 타입들을 쉽게 집단 자료형으로 구성하여 주고받을 때
- 이외에는 NSMutableArray와 같은 배열 객체를 이용하는 편이 효율적
튜플의 기타 특징
- 튜플에서 사용할 수 있는 속성은 인덱스가 유일
- 순회 특성(SequenceType)도 지원하지 않음
- for~in 구문을 사용할 수도 없음
함수나 메소드에서 사용하는 튜플
- 둘 이상의 값을 반환시 튜플을 이용하면 바로 전달할 수 있음
func getTupleValue() -> (String, String, Int) {
return ("t", "v", 100)
}
// 함수가 반환하는 튜플을 튜플 상수로 바인딩
let (a, b, c) = getTupleValue()
// a -> "t"
// b -> "v"
// c -> 100
// 튜플에서 반환되는 아이템 중 일부만 필요할 때
// 사용하지 않을 튜플 아이템은 _(언더바)로 대체
let (a, b, _) = getTupleValue()
// a -> "t"
// b -> "v"
- 튜플로 반환하는 아이템의 개수와 이를 바인딩하는 튜플 변수의 아이템 개수가 일치하지 않으면 컴파일 오류 발생
- 언더바를 포함한 전체 변수나 상수의 개수는 튜플의 아이템 개수와 일치
- 함수는 항상 하나의 객체만 반환할 수 있음 → 튜플 자료형이 제공되지 않는다면 해당 함수는 세 개의 서로 다른 데이터를 한꺼번에 반환하기 위해 여러 방법을 이용해야 함
- 배열(NSArray, 데이터 타입이 일치하지 않음)을 생성하여 데이터 저장 후 반환
- 딕셔너리 생성 후 데이터 저장하고 반환
- 구조체나 클래스를 생성하여 값을 저장하고 반환
→ 튜플을 사용하면 반환할 데이터를 단순히 괄호로 묶는 것만으로 자료형 생성 (코드가 매우 단순해짐)
[Day10] Optional (1) (0) | 2024.04.19 |
---|---|
[Day9] Collective Types (4) : Dictionary (0) | 2024.04.17 |
[Day7] Collective Types (2) : Set (0) | 2024.04.15 |
[Day6] Collective Types (1) : Array (0) | 2024.04.14 |
[Day5] 흐름 제어 구문(3) : Control Transfer Statements (0) | 2024.04.10 |
댓글 영역