Swift) tuple(튜플)에 대해서

어흥·2024년 4월 25일

Swift

목록 보기
2/28

안녕하세요!! 오늘은 Tuple에 대해서 포스팅하려고 합니다.
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

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(구조체)와 비슷하고 구조체를 사용해야하는 경우 튜플을 사용해도 될까? 라는 의문점이 생길 수도 있습니다...

제가 생각한 차이점은 다음과 같습니다.

  • 튜플은 구조체처럼 미리 정의하지 않아도 된다는 장점이 있습니다. 언제든지 해당 코드 문맥에서 바로 정의해서 만들어 쓸 수 있어 편리하다고 볼 수 있습니다.
  • 구조체는 안에 함수(메서드)도 집어넣을 수 있고, 더 다양한 기능을 만들 수 있다는 장점이 있습니다.

typealias 적용

동일한 데이터 형식과 개수를 가지고 있는 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문과 활용

튜플은 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 절 활용 방법

이렇게 상수 값으로 바인딩 후, 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 프로젝트 하면서 자주 사용해보지는 않아 잘 몰랐지만 이번 포스팅 작성하면서 많은 공부가 된거 같아요!
튜플 많이 유용한 자료형인 거 같습니다!

참고

Swift ) tuple

0개의 댓글