大器晩成

튜플(Tuple) 본문

iOS/Swift 문법

튜플(Tuple)

zerobugpark 2024. 11. 1. 15:59

 

튜플은 여러 개의 값을 하나의 복합 값으로 그룹화하여 저장할 수 있는 자료 구조입니다.

스위프트에서 튜플은 서로 다른 데이터 타입을 포함할 수 있으며, 튜플을 사용하면 관련된 여러 값을 하나의 단위로 다룰 수 있습니다.

튜플은 선언되고 나면 상수적 성격을 띠므로 더 이상 값을 추가하거나 삭제하는 등의 변경은 불가능합니다.

 

튜플의 특징

  • 다양한 타입: 튜플은 서로 다른 데이터 타입의 값을 포함할 수 있습니다.
  • 고정된 크기: 튜플의 크기는 고정되어 있으며, 선언한 후엔 자료형 및 멤버의 개수는 수정할 수 없습니다.
  • 임시 데이터 구조: 튜플은 주로 임시로 여러 값을 그룹화하는 데 사용됩니다. 구조체나 클래스처럼 복잡한 데이터를 정의하는 데 사용되지는 않습니다.

튜플의 단점

  • 이름 없는 요소: 이름이 지정되지 않은 튜플의 요소는 인덱스로만 접근할 수 있어 가독성이 떨어질 수 있습니다.
  • 확장성 부족: 구조체나 클래스와 달리 튜플은 확장성이 부족하며, 메서드를 정의할 수 없습니다.

 

튜플 생성

  • 튜플은 소괄호 '()'를 사용하여 생성합니다. 각 값은 콤마 ','로 구분됩니다.
  • 아래 예제에서 'person' 튜플은 세 개의 값을 포함합니다. 이름(String), 나이(Int), 키(Double)
let person = ("John", 30, 72.5)

let person2: (String, Int, Double) = ("John", 30, 72.5)
//명시적으로 타입을 선언시, 선언된 타입과 할당할 데이터의 타입이 다르면 컴파일 오류
//ex) let person2: (String, Int, Int) = ("John", 30, 72.5) -> 컴파일 오류

 

튜플의 요소 접근

  • 튜플의 각 요소는 '.'(dot)을 사용하여 접근할 수 있습니다. 인덱스는 0부터 시작합니다.
let person = ("John", 30, 72.5)

let name = person.0  // "John"
let age = person.1   // 30
let height = person.2  // 72.5

print("Name: \(name), Age: \(age), Height: \(height)")
// 출력: Name: John, Age: 30, Height: 72.5

 

 

Named Tuple (이름이 있는 튜플)

  • 데이터의 각 요소에 이름을 붙일 수 있습니다.
  • 코드의 가독성이 높아집니다.
let person = (name: "John", age: 30, height: 72.5)

let name = person.name  // "John"
let age = person.age    // 30
let height = person.height  // 72.5

print("Name: \(name), Age: \(age), Height: \(height)")
// 출력: Name: John, Age: 30, Height: 72.5

# Tpyealias 활용
typealias Account = (Bank: String, name: String, accountNumber: Int)
//타입에일리어스와 네임드 튜플을 함께 사용하기 위해서는 선언시 함께 지정해야 한다.

var account: Account = (Bank: "Woori", name: "Zerobug", accountNumber: 1234)

account.Bank
account.name
account.accountNumber

 

 

튜플을 사용한 값 교환

  • 두 변수의 값을 간단히 교환할 수 있습니다.
var a:Int = 10
var b:Int = 15

(a,b) = (b,a)

print("a = \(a), b = \(b)")
//출력: a = 15, b= 10

 

튜플의 분해(Decomposition)

  • 튜플의 멤버들을 각각에 상수에 저장하고 싶을 때, 각각 변수를 선언하고 할당할 필요가 없습니다.
  • Decomposition을 활용하여 쉽게 할당 가능합니다.
let person = ("Zerobug", 30, 200.5)

let name = person.0
let age = person.1
let heigth = person.2

let (name2, age2, height2) = person // Decomposition

print("Name: \(name2), Age: \(age2), Height: \(height2)")
// 출력: Name: Zerobug, Age: 30, Height: 200.5


let (name3, age3, _) =  person

print(name3) // 출력: Zerobug
print(age3) // 출력: 30

 

튜플의 값 비교

  • 실제 사용하는 경우가 흔하지는 않지만, 비교가 가능합니다. (왼쪽 멤버부터 하나씩 비교)
  • 튜플의 비교는 7개 미만의 요소만 가능합니다. 7개 이상은 직접 구현이 필요합니다.
(1,2,3,4,5,6) == (1,2,3,4,5,6) //true
//(1,2,3,4,5,6,7) == (1,2,3,4,5,6,7) //Error
(1,3,2) < (1,2,3) // false
("Apple", 1) > ("apple",1) //false (소문자 a가 더 값이 크다)

//(1, false) > (1,true) // Bool 타입은 비교할 수 없다

 

튜플의 매칭

let universityAndGrade = (university: "서울대학교", grade: "1학년")


//튜플을 활용한 if문 조건 비교
if universityAndGrade.0 == "서울대학교" && universityAndGrade.1 == "1학년" {
    print("서울대학교 1학년입니다.")
} else {
    print("")
}
// 출력: 서울대학교 1학년입니다.

if universityAndGrade == ("서울대학교","1학년") {
    print("서울대학교 1학년입니다.")
} else {
    print("")
}
// 출력: 서울대학교 1학년입니다.

// 스위치문을 사용하면 if 조건문보다 간단하게 표현 가능
switch universityAndGrade {
case("서울대학교", "1학년"):
    print("서울대학교 1학년입니다.")
case("서울대학교", "2학년"):
    print("서울대학교 2학년입니다.")
default:
    break
}
// 출력: 서울대학교 1학년입니다.

 

튜플의 바인딩

바인딩: 다른 새로운 변수에/상수 식별자로 할당하는 것입니다.

let point = (0, 4)

switch point {
case (let distance, 0), (0, let distance):
    print("The point is on the axis at distance \(point).")
default:
    print("The point is not on the axis.")
}
// point가 아닌 distance로 새로 바인딩 하는 이유, 현재 point는 튜플로 타입이. int,int 타입입니다.
// X 또는 y 중 한 개의 좌표만 얻고 싶을 때는 Int형 타입이 필요하기 때문에, 새롭게 바인딩을 하는 것입니다.
// (let distance, 0)의 경우 point.0이 distance로 바인딩됩니다.


# 튜플의 where절 활용

let point = (3, 4)

switch point {
case let x where x.0 % 2 == 0:
    print("첫번째 값은 짝수 입니다.")
case let x where x.0 % 2 != 0:
    print("첫번째 값은 홀수 입니다.")
default:
    break
}
// 출력: 첫번째 값은 홀수 입니다.

 

case (let distance, 0), (0, let distance)는 두 개의 패턴을 동시에 매칭하고, 어떤 패턴이든 일치하면 distance 변수에 값을 바인딩합니다. 구체적으로는 다음과 같은 두 가지 경우를 처리합니다:

  • (let distance, 0): 첫 번째 요소를 distance로 바인딩하고, 두 번째 요소가 0인 경우
  • (0, let distance): 첫 번째 요소가 0이고, 두 번째 요소를 distance로 바인딩하는 경우
  • 이 경우 point는 (0, 4)이므로 case (0, let distance)가 매칭됩니다. 따라서 distance는 4로 바인딩되고, "The point is on the axis at distance 4."이 출력됩니다.

 

 
728x90

'iOS > Swift 문법' 카테고리의 다른 글

반복문 (For문)  (0) 2024.11.05
삼항연산자  (0) 2024.11.01
조건문(switch)  (3) 2024.11.01
조건문(If문)  (0) 2024.10.31
범위 연산자 (Range Operators)  (0) 2024.10.31