튜플(Tuple)은 여러 개의 값을 하나의 그룹으로 묶을 수 있는 자료형이다.
Swift에서 튜플을 사용하는 이유는 여러 가지가 있지만, 함수와 연관지어 설명하는 더욱 유용성을 이해할 수 있다
func divide(_ a: Int, _ b: Int) -> Int {
return a / b
}
let result = divide(10, 2) // result = 5
이 함수는 10 + 2의 결과인 5만 반환한다. 하지만 실제로 나눗셈을 수행할 때 몫뿐만 아니라 나머지도 필요한 경우가 있을 수 있다
struct, class)를 만들지 않고 간단하게 다중 값을 반환할 수 있다func divideWithRemainder(_ a: Int, _ b: Int) -> (quotient: Int, remainder: Int) {
let quotient = a / b
let remainder = a % b
return (quotient, remainder)
}
let result = divideWithRemainder(10, 3)
print("몫: \(result.quotient), 나머지: \(result.remainder)")
// 출력: 몫: 3, 나머지: 1
func getUserInfo() -> (name: String, age: Int, isAdmin: Bool) {
return ("Royce", 25, false)
}
let user = getUserInfo()
print(user.name) // "Royce"
print(user.age) // 25
print(user.isAdmin) // false
func getScores() -> [Int] {
return [95, 88, 76]
}
let scores = getScores()
print(scores[0]) // 95
‼️ 단점: 배열은 항목의 의미를 명확하게 표현하기 어렵고, 반환값의 개수가 고정되지 않으면 예측하기 어렵다
func getUserData() -> [String: Any] {
return ["name": "Royce", "age": 25, "isAdmin": false]
}
let user = getUserData()
print(user["name"] as! String) // "Royce"
print(user["age"] as! Int) // 25
print(user["isAdmin"] as! Bool) // false
‼️ 단점: 딕셔너리의 반환 타입이 [String: Any] 로 타입 안정성이 낮고, 값을 가져울 때 as! 같은 강제 형변환이 필요하다
let (quotient, remainder) = divideWithRemainder(10, 3)
print("몫: \(quotient), 나머지: \(remainder)")
_(언더스코어)로 무시 가능하다let (_, remainder) = divideWithRemainder(10, 3)
print("나머지: \(remainder)") // 1
struct나 class 없이 간단하게 상태를 반환할 수 있다func checkLogin(username: String, password: String) -> (success: Bool, message: String) {
if username == "admin" && password == "1234" {
return (true, "로그인 성공!")
} else {
return (false, "아이디 또는 비밀번호가 잘못되었습니다.")
}
}
let loginResult = checkLogin(username: "admin", password: "wrongpass")
print(loginResult.message) // 아이디 또는 비밀번호가 잘못되었습니다.
| 사용 사례 | 튜플을 사용하면 좋은 이유 |
|---|---|
| 함수에서 여러 개의 값을 반환할 때 | struct 나 class 를 만들지 않고 간단히 다중 값을 반환 |
| 딕셔너리보다 더 안전한 방식이 필요할 때 | 딕셔너리는 타입 안정성이 낮음 (Any 타입) |
| 변수를 쉽게 분리하여 사용하고 싶을 때 | 튜플을 분해하여 개별 변수로 할당 가능 |
| 일회성 데이터 그룹이 필요할 때 | struct 를 만들 필요 없이 간단하게 묶어서 처리 가능 |
struct 나 class 를 사용하는 것이 좋다struct)나 클래스(class)를 사용하는 것이 유지보수에 더 유리하다struct User {
let name: String
let age: Int
let isAdmin: Bool
}
func getUser() -> User {
return User(name: "Royce", age: 25, isAdmin: false)
}
let user = getUser()
print(user.name) // "Royce"