안녕하세요!! 오늘은 Tuple에 대해서 포스팅하려고 합니다.
tuple은 저도 코딩테스트에서 자주 사용하는 자료형인데요. Tuple과 그 활용 방법에 대해서 알아보겠습니다!
tuple은 여러가지 타입을 한꺼번에 저장해서 사용할 수 있습니다. tuple은 Swift의 Type에 속합니다. (Collection Type이 아닙니다.) tuple은 변수 선언과 동시에 데이터 종류 및 개수가 결정되어 추후 추가나 삭제가 불가합니다.
주요 특징은 타입에 상관없이 필요한 연관된 데이터의 조합으로 만들 수 있다는 것입니다.
var iOS = (“Swift”, “5.3”)
위처럼 String과 Double 형이 같이 저장된 것을 확인할 수 있습니다!
tuple은 compound type입니다. 따라서 name type인 Int, String, Bool을 담을 수 있고 compound type인 tuple과 function을 담을 수 있습니다.
var cpu = (“apple”, “m1”)
var mac = (cpu, "16g") // tuple을 담은 tuple
func a() -> Int { return 1 }
var fTuple = (1, a()) // 함수를 담은 튜플
위와 같이 튜플의 멤버를 튜플 혹은 함수로 지정할 수 있다는 것을 확인할 수 있습니다!
이전에 선언했던 변수 나 상수들을 모아서 튜플을 선언할 수도 있습니다.
let (first, second, third) = threeNumbers
first
second
third
튜플의 멤버 값 접근하는 방법은 비교적 간단합니다. 인덱스로 접근하면 됩니다.
var cpu = (“apple”, “m1”)
cpu.0 // apple
cpu.1 // m1
이렇게요!
var cpu = (“apple”, “m1”)
var mac = (cpu, "16g") // tuple을 담은 tuple
mac.0.0 // apple
mac.1 // 16g
그럼 튜플을 멤버로 가지고 있는 튜플의 경우는 이렇게 접근하면 되겠습니다.
하지만 이렇게 인덱스로 값을 접근할 때 0번째, 1번째 멤버가 뭐인지 확인이 어렵지 않을까요? 좀 더 가독성이 높일 수 있는 방법이 있습니다. 바로 named tuple입니다.
named tuple은 기존 tuple의 값을 접근하는 방식에서 가독성을 높인 방식입니다.
var iOS = (language:“Swift”, version:“5.3”)
이렇게요! tuple을 선언할 때, 각 멤버에 대해서 네임을 부여하는 것입니다.
네임과 함께 선언하면 값을 접근하는 방법이 달라집니다.
var iOS = (language:“Swift”, version:“5.3”)
iOS.language // Swift
iOS.version // 5.3
이렇게 인덱스가 아닌 name으로 값을 접근하면 됩니다.
튜플은 이렇게 연관되어 있는 다른 자료형의 데이터들을 묶어 사용할 수 있습니다. 이쯤되면 struct(구조체)와 비슷하고 구조체를 사용해야하는 경우 튜플을 사용해도 될까? 라는 의문점이 생길 수도 있습니다...
제가 생각한 차이점은 다음과 같습니다.
동일한 데이터 형식과 개수를 가지고 있는 tuple을 여러개 자주 사용해야한다면 중복된 코드를 작성해야 합니다. 좀 더 간편하게 사용할 수 있는 방식이 type alias입니다.
typealias Mac = (cpu:String, ram:Int, display:Int, ssd:Int)
var mac2024 : Mac = (m3,16,15, 1024)
macGroup = [Mac]
한가지 형식을 가지는 tuple을 여러개 만들 때 사용하시면 좋을 것 같습니다!
본격적으로 튜플이 어떨 때 활용하면 좋은지 알아보겠습니다~
함수는 원칙적으로 하나의 리턴값 만은 가집니다. 그런데 튜플 형을 사용하면 여러 개의 데이터를 리턴할 수 있습니다! 정말 많이 편리합니다. 보통 서버와 통신을 진행할 때, status code, message, 요청 데이터 등등이 있습니다. 이때 튜플 형을 사용하면 편리하게 여러 데이터를 리턴할 수 있습니다.
func serverFunction() -> (Int,String, String){ return (400,"성공적으로 요청되었습니다.","iOS")}
var server_function = serverFunction()
server_function.0// 400
튜플은 switch문과 자주 활용됩니다. 바인딩을 활용하면 더 편하게 사용할 수 있습니다.
var coordinate = (0, 5) // 좌표계
switch coordinate {
case (let distance, 0), (0, let distance): // x축이나 y축에 있으면 출력하라는 코드
print("X 또는 Y축 위에 위치하며, \(distance)만큼의 거리가 떨어져 있음")
default:
print("축 위에 있지 않음")
}
위 코드는 x 혹은 y 값이 0일 때, distance에 다른 값을 바인딩하여 print 문에 활용할 수 있습니다. 완전 편리하죠!
이렇게 상수 값으로 바인딩 후, where 절을 활용하여 비교하는 표현식을 작성할 수 있습니다.
coordinate = (5, 0)
switch coordinate {
case (let x, let y) where x == y: //일단 x, y를 상수로 지정해주고, 그리고 나서 비교한다.
print("(\(x), \(y))의 좌표는 y = x 1차함수의 그래프 위에 있다.")
case let (x, y) where x == -y:
print("(\(x), \(y))의 좌표는 y = -x 1차함수의 그래프 위에 있다.")
case let (x, y):
print("(\(x), \(y))의 좌표는 y = x, 또는 y = -x 그래프가 아닌 임의의 지점에 있다.")
}
지금까지 튜플에 대해서 알아보았습니다. 저도 사실 iOS 프로젝트 하면서 자주 사용해보지는 않아 잘 몰랐지만 이번 포스팅 작성하면서 많은 공부가 된거 같아요!
튜플 많이 유용한 자료형인 거 같습니다!