본문 바로가기
프로그래밍 팁/Swift

1-12. Swift - 튜플(Tuples) 문법 개념 정리

by Archivers 2020. 11. 10.

 

튜플(Tuples)

튜플은 여러 개의 값을 하나의 복합된 값으로 무리 짓습니다. 어떤 타입이든 튜플에 속할 수 있으며, 튜플 안에 속한 값들이 서로 같은 타입일 필요도 없습니다.

let http404Error = (404, "Not Found")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

http404Error 상수에 두 개의 값으로 이루어진 튜플을 저장하고자 합니다. 이 값은 404라는 정수(Int) 값과 Not Found라는 문자열(String) 값입니다. 앞으로 자세히 설명하겠지만, 튜플은 괄호 안에 값을 가지는 형태를 가집니다. 여러 값을 가질 때는 쉼표(,)로 구분합니다. 따라서 (404, "Not Found") 튜플이 담긴 http404Error 상수는 (Int, String)로 이루어진 튜플 타입을 가집니다.

 

참고로 '404 Not Found'는 HTTP 상태 코드의 일종으로, 사용자가 요청한 웹페이지가 존재하지 않을 때 반환되는 특별한 값입니다.

 

튜플을 만들 때는 어떤 타입이든 다양하게 조합할 수 있습니다. 이를테면 (Int, Int, Int) 또는 (String, Bool)과 같은 튜플 타입도 만들 수 있습니다.

 

반대로 튜플에 속한 내용물을 상수나 변수로 꺼낼 수도 있습니다.

let (statusCode, statusMessage) = http404Error
print("HTTP 상태 코드는 \(statusCode)입니다.")
print("HTTP 상태 메시지는 \(statusMessage)입니다.")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

아까 http404Error 상수에 (404, "Not Found") 튜플을 저장했습니다. 이번에는 그 튜플에 속한 값을 각각statusCode와 statusMessage라는 상수에 저장하고자 합니다. 즉 http404Error 상수에 담긴 튜플 중 첫 번째 값인 404라는 Int 값을 statusCode에 저장하고, 두 번째 값인 Not Found라는 String 값을 statusMessage에 저장하고자 합니다. 참고로 만약 괄호 없이 let statusCode, statusMessage = http404Error로 작성한다면 오류가 발생니다. (let statusCode, statusMessage) 이렇게 괄호 안에 넣어야 튜플 타입으로 작성하는 것이 됩니다. 결과적으로 statusCode 상수에는 404가 저장되며, statusMessage 상수에는 Not Found가 저장됩니다. 따라서 첫 번째 print 함수는 'HTTP 상태 코드는 \(statusCode)입니다.'에서 \(statusCode)가 404로 대체되며, 'HTTP 상태 코드는 404입니다.'를 출력하게 됩니다. 참고로 상수나 변수명을 \()안에 넣으면 해당 상수나 변수에 담긴 값으로 대체됩니다. 이를 문자열 보간법(String interpolation)이라고 부릅니다. 그리고 두 번째 print 함수는 'HTTP 상태 메시지는 \(statusMessage)입니다.'에서 \(statusMessage)가 Not Found로 대체되므로, 'HTTP 상태 메시지는 Not Found입니다.'를 출력하게 됩니다.

 

튜플에 속한 내용물을 꺼낼 때 굳이 모든 내용물을 꺼낼 필요 없이 일부만 꺼낼 수도 있습니다. 이 경우 꺼내지 않고자 하는 내용물이 담긴 자리에는 밑줄 표시(_)를 입력합니다.

let (justTheStatusCode, _) = http404Error
print("HTTP 상태 코드는 \(justTheStatusCode)입니다.")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

아까 http404Error 상수에 (404, "Not Found") 튜플을 저장했습니다. 이 튜플에 담긴 내용물을 꺼내기 위해 (justTheStatusCode, _)이라는 튜플 타입으로 작성을 하고 각 상수에 저장하고자 하는데, 이 경우 404 값만 꺼내어 저장하고, Not Found는 꺼내지 않으려고 합니다. 즉 404 값만 필요한 상황입니다. 이를 위해 (justTheStatusCode, _)로 표현하였습니다. 결과적으로 justTheStatusCode라는 이름의 상수에 404 값이 저장됩니다. 그리고 print 함수는 'HTTP 상태 코드는 404입니다.'를 출력할 것입니다.

 

또는 튜플에 속한 내용물을 인덱스 숫자(index number)로 접근하는 방법도 있습니다. Swift에서 인덱스 숫자는 0, 1, 2, 3, 4...처럼 0부터 시작합니다. 즉 개수를 셀 때 1, 2, 3, 4...으로 세는 게 아니라 0, 1, 2, 3, 4...로 세는 것입니다. 이 방식으로 튜플에 속한 내용물을 지칭할 수 있습니다. 튜플에 담긴 첫 번째 내용물은 0번으로, 두 번째 내용물은 1번으로 지칭하는 것입니다. 지칭하는 방법은 튜플이 담긴 상수의 이름 뒤에 점(.)을 찍고 접근하고자 하는 내용물의 인덱스 숫자를 입력하면 됩니다.

print("HTTP 상태 코드는 \(http404Error.0)입니다.")
print("HTTP 상태 메시지는 \(http404Error.1)입니다.")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

http404Error 상수에 담긴 튜플의 내용물 중 가장 첫 번째, 즉 0번인 내용물에 접근하고자 합니다. 아까 http404Error 상수에 (404, "Not Found") 튜플을 저장했습니다. 따라서 0번 내용물은 404입니다. 그리고 1번 내용물은 Not Found가 됩니다. 따라서 첫 번째 print 함수는 'HTTP 상태 코드는 404입니다.'를 출력하고, 두 번째 print 함수는 'HTTP 상태 코드는 Not Found입니다.'를 출력합니다.

 

또한 튜플을 정의할 때 튜플에 속한 각 내용물을 지칭하는 이름을 정할 수도 있습니다.

let http200Status = (statusCode: 200, description: "OK")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

http200Status라는 이름의 상수를 선언하고자 합니다. 이 상수에는 튜플을 저장하고자 하는데 이 튜플에는 두 개의 요소가 있습니다. 200이라는 정수 값과 OK라는 문자열 값입니다. 그리고 이 두 요소를 지칭하는 이름을 정하고자 합니다. 200은 statusCode로 부르고자 하며, OK는 description으로 부르고자 합니다.

 

튜플의 각 요소를 지칭하는 이름을 정했다면 앞으로 해당 요소를 접근하고자 할 때 해당 요소가 위치한 자리의 인덱스 숫자를 사용하는 대신, 해당 요소의 이름을 사용하면 더욱 직관적으로 해당 요소에 접근할 수 있습니다. 튜플이 저장된 상수의 이름 뒤에 점(.)을 찍고 접근하고자 하는 요소의 이름을 입력하면 됩니다.

print("HTTP 상태 코드는 \(http200Status.statuscode)입니다.")
print("HTTP 상태 메시지는 \(http200Status.description)입니다.")

 

위 코드는 다음과 같이 글로 표현할 수 있습니다.

 

아까 http200Status라는 상수에 튜플 (statusCode: 200, description: "OK")를 저장했습니다. 200이라는 정수 값에 statusCode라는 이름을 부여했습니다. 그리고 OK라는 문자열 값에 description이라는 이름을 부여했습니다. 따라서 첫 번째 print 함수는 'HTTP 상태 코드는 200입니다.'를 출력합니다. 그리고 두 번째 print 함수는 'HTTP 상태 메시지는 OK입니다.'를 출력합니다.

 

튜플 타입은 주로 함수의 반환값에 유용하게 사용됩니다. 일반적으로 함수는 하나의 타입으로 된 값 하나만을 반환할 수 있는데, 이처럼 여러 타입의 요소를 담을 수 있는 튜플 타입을 사용하여 함수의 반환값으로 반환하면 더욱 유용한 정보를 다룰 수 있게 됩니다.

NOTE

튜플은 서로 관련이 있는 값들을 간단한 형태로 그룹화하는데 유용합니다. 반면 복잡한 형태의 데이터 구조를 만드는데 튜플은 적합치 않습니다. 데이터의 구조가 복잡한 경우에는 튜플보다는 클래스(class)나 구조체(structure)를 사용하는 것을 권장합니다.

 

 

 

 

 

이 글은 Apple이 제공하는 'The Swift Programming Language 5.2 버전' (https://swift.org)을 번역 및 참고하여 작성하였습니다.

댓글