튜플 (Tuples)

YeongHyeon Jo·2023년 9월 19일
1

Swift

목록 보기
1/6

튜플 (Tuples)이란?

2개 이상의 연관된 데이터(값)를 저장하는 Compound(복합/혼합) 타입

예로 들어서 한 사람의 이름과 나이, 사는 지역을 한번에 저장하기 위해서 'person(이름, 나이, 사는지역)'와 같이 데이터를 저장하는 방식이다.

  • 원하는 연관된 데이터의 조합으로 어떤 형태든 만들 수 있는 타입!
  • 하지만, 변수를 선언과 동시에 해당 멤버(데이텉의 종류 및 갯수)가 결정되므로 추가하거나 삭제할 수 없다.

예시)

let twoNumbers: (Int, Int) = (1, 2)
print(type(of: twoNumbers)) // (Int, Int)

let threeNumbers = (1, 2, 5)
print(type(of: threeNumbers)) // (Int, Int, Int)

var threeValues = ("홍길동", 20,  "서울")
print(type(of: threeValues)) // (String, Int, String)

튜플의 문법

  • 튜플에서 각각의 데이터에 접근하기 위해서는 어떻게 해야하는가?!
  • 튜플의 변수명 뒤에 0, 1, 2 순서대로 데이터가 출력된다.
print(threeValues.0) // 홍길동
print(threeValues.1) // 20
print(threeValues.2) // 서울

이런 방법 대신 데이터의 각 요소에 이름을 붙일 수 있다!(Named Tuple)

let iOS = (language: "Swift", version: "5")

iOS.0 // "Swift"
iOS.1 // "5" 
// 위와 동일한 데이터를 각각 표시한다.
iOS.language // "Swift"
iOS.version	 // "5" 

각각의 타입 같은 경우 타입 추론으로 파악할 수 있다.

튜플의 분해 (Decomposition)

  • 튜플의 각 요소를 각각 상수/변수화 가능 (이를 바인딩이라고 함)
  • 모아 놓은 데이터를 각각 분해해서 활용할 수 있다.
let threeNumbers = (1, 2, 5)
let (first, second, third) = threeNumbers
first // 1
second // 2
third // 5

튜플의 값 비교 (보통 사용하지 않음)

  • 왼쪽 멤버부터 하나씩 비교하고, 같을 경우 다음 멤버를 비교
  • 튜플의 비교는 7개 미만의 요소를 가진 것만 가능.
(1, "zebra") < (2, "apple") // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird")	// true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog")	// true

("blue", -1) < ("purple", 1)            // 비교가능, 결과: true
//("blue", false) < ("purple", true)    // 에러발생 ===> Bool 값은 비교 불가능

튜플의 if문 활용

예시)

let iOS = (language: "Swift", version: "5")

if iOS.0 == "Swift" && iOS.1 == "5" { // 각각을 비교
    print("\(iOS.0) 버전 \(iOS.1)입니다.") // Swift 버전 5입니다.
    print("\(iOS.language) 버전 \(iOS.version)입니다.") // 위와 동일한 결과
}

if iOS == ("Swift", "5") { // 전체를 한번에 비교
    print("\(iOS.0) 버전 \(iOS.1)입니다.") // Swift 버전 5입니다.
    print("\(iOS.language) 버전 \(iOS.version)입니다.") // 위와 동일한 결과
}

튜플의 switch문 활용

  • 튜플은 switch문과 자주 활용됨.
  • 위의 if문을 switch문으로 변경.
    예시)
switch iOS {
case ("Swift", "5"):
    print("스위프트 버전 5입니다.")
case ("Swift", "4"):
    print("스위프트 버전 4입니다.")
default:
    break
}

또한 switch문 바인딩을 이용하여 튜플의 요소를 활용할 수 있다.

  • 각 케이스 내에서 튜플의 각 요소를 활용하려할 때 주로 사용.
var coordinate = (0, 5)   // 좌표계

switch coordinate {
case (let x, let y):
    print("좌표는 (\(x), \(y)) 입니다.")
default:
    break
}
  • 어떤 조건에 따라 튜플 케이스를 처리하려고할 때 주로 사용.
switch coordinate {
case let (x,y) where x == y:
    print("좌표는 (\(x), \(y)) 입니다.")
default:
    break
}

예시)

var coordinate = (0, 5)   // 좌표계

switch coordinate {
case (let distance, 0), (0, let distance):   // x축이나 y축에 있으면 출력하라는 코드
    print("X 또는 Y축 위에 위치하며, \(distance)만큼의 거리가 떨어져 있음")
default:
    print("축 위에 있지 않음")
}

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 그래프가 아닌 임의의 지점에 있다.")
}

튜플을 함수에서 사용할 수 있는데, 예로 들어 String을 함수에 넣었을 때, (Int, String)을 가지는 튜플 형식의 결과를 얻어올 수 있다.
*함수는 원칙적으로 리턴 값이 한 개만 존재하기 때문에 여러개의 값을 반환할 수 없지만, 어떤 묶음 값으로 반환하는 것은 가능하다.

profile
my name is hyeon

0개의 댓글