Notice
Recent Posts
Recent Comments
Link
大器晩成
튜플(Tuple) 본문
튜플은 여러 개의 값을 하나의 복합 값으로 그룹화하여 저장할 수 있는 자료 구조입니다.
스위프트에서 튜플은 서로 다른 데이터 타입을 포함할 수 있으며, 튜플을 사용하면 관련된 여러 값을 하나의 단위로 다룰 수 있습니다.
튜플은 선언되고 나면 상수적 성격을 띠므로 더 이상 값을 추가하거나 삭제하는 등의 변경은 불가능합니다.
튜플의 특징
- 다양한 타입: 튜플은 서로 다른 데이터 타입의 값을 포함할 수 있습니다.
- 고정된 크기: 튜플의 크기는 고정되어 있으며, 선언한 후엔 자료형 및 멤버의 개수는 수정할 수 없습니다.
- 임시 데이터 구조: 튜플은 주로 임시로 여러 값을 그룹화하는 데 사용됩니다. 구조체나 클래스처럼 복잡한 데이터를 정의하는 데 사용되지는 않습니다.
튜플의 단점
- 이름 없는 요소: 이름이 지정되지 않은 튜플의 요소는 인덱스로만 접근할 수 있어 가독성이 떨어질 수 있습니다.
- 확장성 부족: 구조체나 클래스와 달리 튜플은 확장성이 부족하며, 메서드를 정의할 수 없습니다.
튜플 생성
- 튜플은 소괄호 '()'를 사용하여 생성합니다. 각 값은 콤마 ','로 구분됩니다.
- 아래 예제에서 '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 |