[Swift] 튜플(Tuple)

EarthSea·2024년 3월 6일
0

🚩 Swift 문법

목록 보기
5/5
post-thumbnail



1. 튜플 기본

1) 튜플

: 여러 가지 타입의 데이터를 저장하는 Compound(복합/혼합) 타입

let twoNumbers: (Int, Int) = (1, 2)
let threeNumbers = (1, 2, 5)
var threeValues = ("홍길동", 20, "서울")
  • () (소괄호)와 , (콤마)를 이용해 여러가지 연관된 데이터를 저장할 수 있다.
  • 변수를 선언과 동시 해당 멤버(데이터의 종류 및 갯수)는 결정되므로 추가/삭제 불가
  • 서로 다른 데이터 타입도 저장이 가능하다.

튜플은 인덱스 번호를 사용해 요소에 접근

: 연관된 값의 각각의 데이터의 접근은 앞에서부터 번호를 매겨 0부터 시작이 된다.

print(type(of: threeValues))
print(threeValues.0)
print(threeValues.1)
print(threeValues.2)

/* 결과:
(String, Int, String)
홍길동
20
서울
*/

❗️ type(of: 변수) - 타입을 알고 싶을 때 쓰는 함수

이름이 매겨진 튜플 (Named Tuple)

: 데이터의 각 요소에 이름을 매길 수 있다.

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

print(iOS.0)
print(iOS.1) 

print(iOS.language)
print(iOS.version)

/* 결과:
Swift
5
Swift
5
*/

→ iOS.0 이라는 표현을 써도 좋지만, iOS.language 라는 표현을 쓰면, 어떤 데이터가 튜플의 0번째에 들어있는지 알 수 있다.

→ iOS.0과 iOS.language를 출력해도 결과 값이 동일하다.

❓ 왜 이름이 매겨진 튜플을 사용
: 가독성을 높이기 위해


튜플의 분해 (Decomposition)

: 튜플의 각 요소를 상수/변수화 가능(바인딩)

let name = ( 5, 6, 7 )

→ 튜플의 값을 name이라는 한 개의 상수에 저장할 수 있지만,

let (first, second, third) = ( 5, 6, 7 )

→ 데이터 묶음을 한 개씩 분해해 상수나 변수에 저장하는 것도 가능하다.

let threeNumbers = (1, 2, 5)
let (first, second, third) = threeNumbers

print(first)   // 결과 : 1
print(second)  // 결과 : 2 
print(third)   // 결과 : 5

❗️ 이때, let, var은 상관없음

튜플의 값의 비교

: 튜플에서의 비교는 인덱스가 낮은 값을 우선으로 비교한다. ( 실제 사용하는 경우는 흔하지는 않음 )

(1, "zebra") < (2, "apple")   // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird")    // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog")
  • 문자열의 비교는 문자열의 순서대로 스펠링의 순서로 판단
  • Bool은 비교할 수 없다.



2. 튜플의 활용

1) 튜플과 switch 문

튜플의 매칭(Matching)

  • if문 사용
    let iOS = (language: "Swift", version: "4")
    if iOS.language == "Swift" && iOS.version == "5" {
        print("스위프트 버전 5입니다.")
    } else {
        print("다른 버전입니다.")
    }
    if ("Swift","4") == iOS {
        print("스위프트 버전 5입니다.")
    }
  • switch문 사용
    switch iOS{
    case ("Swift","4") :
        print("스위프트 버전 5입니다.")
    default :
        break
    }
    → 위의 if 조건문을 switch 조건문을 이용하면 단순해진다.

❗️ 튜플의 비교에서는 switch 문을 사용하면 더 편하다.


튜플의 활용 ( 좌표, where절 활용 )

  • 튜플의 바인딩 ( 좌표 )
    var coordinate = (3, 5)
    
    switch coordinate {
    case (let distance, 0), (0, let distance):
        print("X 또는 Y축 위에 위치하며, \(distance)만큼의 거리가 떨어져 있음")
    default:
        print("축 위에 있지 않음")
    }
    
    // 결과 : 축 위에 있지 않음
    → 튜플을 사용한 바인딩에서는 조건이 맞는 것만 바인딩 된다.
  • 튜플의 where절 활용
    coordinate = (5, 0)
    
    switch coordinate {
    case (let x, let y) where 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 그래프가 아닌 임의의 지점에 있다.")
    }
    ❗️ 이때, let(x, y)와 (let x, let y)는 같은 문장이다.



2) 튜플을 사용하는 이유

: 함수는 원칙적으로 리턴값이 한개만 존재하기 때문에 여러개의 값을 반환할 수 없지만, 어떤 묶음 값으로는 반환하는 것이 가능하기 때문이다.

❓❗️ 튜플은 많은 데이터를 담는 데는 적합하지 않고, 2~3개의 연관된 값을 담기에 좋은 타입이다. 튜플의 값을 사용하기 위해서는 다시 매핑하는 작업이 필요하기 때문이다.



profile
I'm Junior iOS developer 배지해.

1개의 댓글

comment-user-thumbnail
2024년 3월 6일

와,,, 글 너무 잘쓰셨어요,,, 정성이 느껴지는 글이에요! 오늘도 고생 많으셨어요!! 내일도 파이팅입니다!!

답글 달기