상세 컨텐츠

본문 제목

[Day8] Collective Types (3) : Tuple

Swift&SwiftUI

by (방울)도마토 2024. 4. 16. 18:00

본문

튜플(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, 데이터 타입이 일치하지 않음)을 생성하여 데이터 저장 후 반환

    - 딕셔너리 생성 후 데이터 저장하고 반환

    - 구조체나 클래스를 생성하여 값을 저장하고 반환

→ 튜플을 사용하면 반환할 데이터를 단순히 괄호로 묶는 것만으로 자료형 생성 (코드가 매우 단순해짐)

 

관련글 더보기

댓글 영역