튜플(Tuple)
여러 가지 타입의 아이템을 저장할 수 있는 집단 자료형
- 다른 집단 자료형 (배열, 집합, 딕셔너리)은 같은 타입의 아이템만 저장할 수 있음
튜플은 이외에도 특징이 여러가지 있음
특징을 알아보자 슈~~웃!
튜플의 특징
1. 선언되고 상수적 성격을 띠므로 오직 최초에 선언된 상태의 아이템만 사용할 수 있음
-> 즉 수정, 삭제, 추가 등 변경 불가능하단 뜻임!
2. 튜플 정의법 - 소괄호 ()
-> 소괄호 ()를 사용하여 아이템을 정의함
(<튜플아이템1>, <튜플아이템2>, ...)
3. 값의 동적 추가가 불가능해서 별도의 선언을 위한 구문이 없음
그러면 튜플에서는 선언 구문이 없는데 타입추론만 의지할까??
땡!! 타입 어노테이션을 사용하기 위한 타입을 정의하는 방법이 있음
타입 어노테이션을 이용하여 튜플을 선언할때
1. 들어갈 아이템의 개수와 순서에 맞게 각각의 타입을 선언해야 함
-> Int형으로 타입을 선언해놓고 "도도새" 이러면 당연히 오류가 나겠쥬?
2. 튜플 내의 아이템으로 튜플을 가지고 싶을때는?
-> tpl03을 보게 되면 "t"와 "v"가 인덱스를 각각 1, 2를 갖지 않고 튜플내의 아이템으로 새로 인덱스 0,1을 갖고 있는것을 볼 수 있음
3. tpl04는 튜플로 선언했지만, 문자열로 선언이 됨
왜 why?? - 하나의 아이템만 있는 튜플은 아이템 타입의 일반 자료형이 되기 때문임
쉽게 생각해서 양쪽에 ()를 둘른 것 뺴면 String타입의 변수를 선언하는 거로 보임
👨💻결론 : 튜플에서도 마찬가지로 타입 어노테이션이 필요한 경우에 사용을 해야 한다.
그렇지 않으면 "a" 같은 아이템은 문자로 쓰고 싶은데 문자열로 지정되기 때문임
타입어노테이션에 대해 궁금하면 https://01pkd95.tistory.com/65
타입 추론과 타입 어노테이션
스위프트의 특성 중 설계에 의한 안전성 (Safety by design)이라는 항목이 있음 아키텍처적인 안전성을 담보하기 위해 스위프트가 여러 장치를 도입했는데 이중 하나가 타입 추론 기능임 타입추론??
01pkd95.tistory.com
4. 튜플의 각 아이템은 인덱스 속성을 이용하여 참조할 수 있음
-> 튜플의 인덱스는 속성으로 제공됨
5. 점(dot)으로 인덱스를 연결함
-> 배열에서 인덱스를 사용하기 위해 대괄호 내부에 인덱스를 작성하지만,
튜플에서는 점(dot)으로 인덱스를 연결하여 사용함
6. 튜플도 없는 인덱스를 참조할때 오류가 발생하고, 0부터 시작함
7. 실제로 아이템이 저장될 때는 각 인덱스에 해당하는 속성값에 개별 아이템들이 저장됨
이처럼 튜플을 인덱스 속성으로만 접근하면 가독성이 떨어져서 불편 할 수 있음
🔥바인딩(Binding)🔥
때문에 스위프트에서 튜플의 아이템을 개별 변수나 상수로 각각 할당받는 바인딩(BInding) 방식의 구문을 제공함
아이템이 다섯개인 튜플 상수 tupleValue를 다섯개의 상수로 이루어진 튜플에 바인딩을 해보았음
출력해보면 바인딩된 튜플의 상수들이 아이템을 할당 받은 것을 확인 할 수 있음
이렇게 바인딩된 튜플(a,b,c,d,e)의 각 상수들은 a,b,c,d,e의 순서대로 개별 아이템을 할당받아 독립적으로 사용 할 수 있음
튜플은 바인딩 처리를 통해 개별 아이템에 대응하는 상수나 변수로 각각 할당받을 수 있으며, 배열처럼 인덱스를 사용하지만
배열과는 다르게 속성 형식으로 사용하므로 대괄호[]대신 점(.)으로 연결하여 사용한다는 점에서 배열과 차이를 보임
튜플을 사용하면 좋을때
1. 프로그램이 실행되는 동안 값이 절대 변하지 않아야 하는 상수 성격일때
2. 값이 바뀔 가능성을 근본적으로 제거하고 싶을때
3. 서로 다른 타입들은 손쉽게 집단 자료형으로 구성하여 주고받을 때
4. 그외적으로는 배열이나 NSMutableArray(파운데이션 프레임워크에서 제공)와 같은 배열 객체를 이용하는게 효율적
튜플 단점??
튜플은 배열이나 딕셔너리처럼 선언할 수 있는 키워드가 없을뿐더러 튜플로 정의된 변수라 할지라도 제공하는 메소드가 전혀 없음
튜플에서 제공하는 것은 인덱스 속성이 유일함.
튜플의 크기를 계산하거나 데이터를 읽어오는 메소드, 순회특성 모두 지원하지 않음 때문에 for ~ in 구문을 사용할 수 없음
이렇게 생각하면 튜플 왜씀?? 이라고 생각할 수 있음
근데 함수나 메소드에서 빛을 발하는 것을 볼 수 있음
함수나 메소드에서 둘 이상의 값을 반환하려면 별도의 자료형 객체를 만들거나 배열 또는 딕셔너리를 만들어 담아야 하는데,
이때 튜플을 이용하면 바로 전달할 수 있어 무척 편리함
위 코드 해석
- 함수 getTupleValue는 (String, Sting, Int)형식의 튜플로 반환할 것으로 선언되어 있음
(함수의 ->로 연결된 뒤쪽 부분이 함수가 반환할 값의 타입을 표시하는 의미임)
- return 에 실질적으로 값을 반환하고 있는데 "t", "v" , 100이 튜플로 묶인 다음 한꺼번에 반환됨
- 함수의 실행 결과로 반환된 튜플 안의 아이템 3개는 let(a,b,c)에 차례로 할당됨
즉 a= "t" b="v", c=100이 할당됨
이렇게 상수에 값이 할당되었으므로 상수들을 사용하여 반환받은 값을 필요한 곳에 사용하면 됨
튜플의 아이템을 모두 받고 싶지 않고 특정한 부위만 받고 싶을때는 ??
-> 상수를 정의하는 대신 언더바(_)로 대체할 수 있음
(컴파일러는 언더바로 표현된 부분에 해당하는 아이템은 할당하지 않고 패스함)
*주의할점*
언더바를 사용하더라도 튜플로 변환하는 아이템의 개수와
이를 바인딩하는 튜플 변수의 아이템의 개수는 같아야하기 떄문에 언더바를 쓰더라도 개수에 유의하자!
튜플의 세아이템 중 첫번째와 두번째 값만 할당이 됨
함수는 항상 하나의 객체만 반환 할 수 있음
때문에 튜플을 사용하지 않는다면 서로 다른 데이터를 한꺼번에 반환하기 위해 여러가지 방법을 사용해야함
TMI)
그 여러가지 방법
1. NSArray를 이용해 배열을 만들어 데이터를 저장한 다음 변환하는 방법
2. 딕셔너리 하나를 만들어서 거기에 값을 넣는 방법
3. 세 값을 합쳐 하나의 문자열로 만들되 값 사이에 쉼표와 같은 구분자를 넣어 전달하고,
이를 받는 쪽에서 다시 문자열을 분해하여 사용하는 방법이 있음.
4. 세 개의 반환 타입에 해당하는 자료형을 속성으로 가지는 클래스나 구조체를 만들고
값을 저장하여 반환하는 방법
B.U.T 이러한 방법들은 새로운 자료형을 정의해야 하기 떄문에 번거로울 수 있고,
함수의 반환 타입이 실제 반환하는 데이터의 형식을 반영하지 못하므로
적절한 방법이 안 될 수 있음
결론
튜플을 사용하는 이유
아이템 수정, 추가, 삭제 할 수 없지만
튜플을 사용하면 반환할 데이터들을 단순히 괄호로 묶는 것만으로 자료형이 만들어지므로 코드가
매우 단순해진다는 이점이 생김
'Swift랑 친해지기 > Swift 책보면서 정리해보기' 카테고리의 다른 글
[집단 자료형] 딕셔너리에 동적으로 아이템 추가하기 (Swift) (0) | 2022.01.29 |
---|---|
[집단 자료형] 딕셔너리 (Swift) (0) | 2022.01.28 |
[집단 자료형] 집합 연산 (Swift) (0) | 2022.01.26 |
[집단자료형] 집합 Set (Swift) (0) | 2022.01.26 |
배열 아이템 동적 할당 방법 - 스위프트 (0) | 2022.01.24 |