TIL: 튜플을 사용하는 이유 - 함수와 연관지어서

Royce·2025년 3월 16일

Swift 문법

목록 보기
17/63

튜플(Tuple)은 여러 개의 값을 하나의 그룹으로 묶을 수 있는 자료형이다.
Swift에서 튜플을 사용하는 이유는 여러 가지가 있지만, 함수와 연관지어 설명하는 더욱 유용성을 이해할 수 있다

1. 함수에서 여러 개의 반환할 때 튜플이 유용하다

(1) 일반적인 단일 반환값을 갖는 함수

  • 보통 함수는 하나의 값을 반환한다
func divide(_ a: Int, _ b: Int) -> Int {
    return a / b
}

let result = divide(10, 2) // result = 5

이 함수는 10 + 2의 결과인 5만 반환한다. 하지만 실제로 나눗셈을 수행할 때 몫뿐만 아니라 나머지도 필요한 경우가 있을 수 있다


(2) 튜플을 사용하여 여러 개의 값을 반환하는 상수

  • 튜플을 사용하면 하나의 함수에서 여러 개의 값을 한번에 반환할 수 있다
  • 별도의 데이터 구조(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

2. 튜플을 사용하면 함수의 반환값을 더 직관적으로 사용할 수 있다

  • 튜플의 요소에 이름(label)을 지정하면, 반환된 값을 더 쉽게 접근할 수 있다
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

3. 튜플을 사용하여 함수에서 다중 값을 반환하는 다른 방법과 비교

(1) 배열(Array)과 비교

func getScores() -> [Int] {
    return [95, 88, 76]
}

let scores = getScores()
print(scores[0]) // 95

‼️ 단점: 배열은 항목의 의미를 명확하게 표현하기 어렵고, 반환값의 개수가 고정되지 않으면 예측하기 어렵다


(2) 딕셔너리(Dictionary)와 비교

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! 같은 강제 형변환이 필요하다


4. 튜플의 다양한 활용법

(1) 함수의 여러 반환값을 개별 변수로 받을 수 있다

let (quotient, remainder) = divideWithRemainder(10, 3)
print("몫: \(quotient), 나머지: \(remainder)")
  • 개별 변수로 나눠서 사용할 수 있다
  • 변수에 바로 할당되므로 가독성이 높아진다

(2) 일부 값만 사용할 경우, _(언더스코어)로 무시 가능하다

let (_, remainder) = divideWithRemainder(10, 3)
print("나머지: \(remainder)") // 1
  • 불필요한 값을 무시할 수 있어 깔끔한 코드 작성 가능

(3) 튜플을 사용하여 함수에서 동적인 값을 반환

  • 튜플을 사용하면 조건에 따라 여러 개의 값을 유연하게 반환할 수 있다
  • 별도의 structclass 없이 간단하게 상태를 반환할 수 있다
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) // 아이디 또는 비밀번호가 잘못되었습니다.

5. 튜플을 사용하면 좋은 경우

사용 사례튜플을 사용하면 좋은 이유
함수에서 여러 개의 값을 반환할 때structclass 를 만들지 않고 간단히 다중 값을 반환
딕셔너리보다 더 안전한 방식이 필요할 때딕셔너리는 타입 안정성이 낮음 (Any 타입)
변수를 쉽게 분리하여 사용하고 싶을 때튜플을 분해하여 개별 변수로 할당 가능
일회성 데이터 그룹이 필요할 때struct 를 만들 필요 없이 간단하게 묶어서 처리 가능

6. 튜플을 사용하면 안되는 경우

  • 튜플의 데이터가 많아지면 structclass 를 사용하는 것이 좋다
    튜플은 단순한 데이터 그룹을 표현하는 데 적합하지만, 많은 데이터를 포함할 경우 구조체(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"
profile
iOS 개발자 지망생

0개의 댓글