• Feed
  • Explore
  • Ranking
/
/
    🦅 Swift

    [Swift] 형변환(Type Conversion & Casting) 정리

    Swiftios
    지
    지성
    2025.02.28
    ·
    6 min read

    기본 데이터 타입 변환 (Primitive Type Conversion)

    Swift에서는 명시적 형변환(Explicit Type Conversion)을 사용해야 한다.

    즉, Int -> String, Double -> Int같은 변환을 할 때 자동 변환이 되지 않고, 직접 변환을 수행해야 한다.

    정수(Int) ↔ 실수(Dobuel, Float) 변환

    정수를 실수로 변환

    let intNumber = 42
    let doubleNumber = Double(intNumber) // 42.0
    let floatNumber = Float(intNumber)   // 42.0

    실수를 정수로 변환 (소수점 버림)

    let decimal = 3.99
    let intFromDouble = Int(decimal) // 3 (소수점 버림)

    Swift는 기본적으로 내림(floor) 방식으로 변환하므로, 반올림하려면 rounded() 사용

    let decimal = 3.99
    let roundedInt = Int(decimal.rounded()) // 4 (반올림)

    숫자 ↔ 문자열 변환

    정수/실수를 문자열로 변환

    let number = 123
    let numberString = String(number) // "123"
    
    let doubleValue = 3.14
    let doubleString = String(doubleValue) // "3.14"

    문자열을 정수/실수로 변환

    let str = "42"
    let intValue = Int(str)   // Optional(42)
    let doubleValue = Double(str) // Optional(42.0)

    문자열이 숫자가 아닌 경우 nil이 반환되므로 옵셔널 처리가 필요

    let invalidStr = "Swift"
    let invalidInt = Int(invalidStr) // nil (변환 실패)

    옵셔널 바인딩을 활용한 안전한 변환

    if let validNumber = Int(str) {
        print("변환 성공: \(validNumber)")
    } else {
        print("변환 실패")
    }

    숫자 포맷을 적용하여 변환(NumberFormatter)

    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    
    if let formattedNumber = formatter.number(from: "1,234") {
        print(formattedNumber.intValue) // 1234
    }

    Bool ↔ 숫자/문자열 변환

    Bool을 숫자로 변환

    let isOn = true
    let boolToInt = isOn ? 1 : 0 // 1

    Bool을 문자열로 변환

    let isOn = true
    let boolToString = String(isOn) // "true"

    문자열을 Bool로 변환

    let strBool = "true"
    let boolValue = Bool(strBool) // 지원되지 않음
    
    let correctBoolValue = (strBool.lowercased() == "true") // true

    컬렉션(Collection) 형변환 (배열, 딕셔너리, 집합 변환)

    배열 ↔ 집합 변환

    중복을 제거하면서 배열을 Set으로 변환 가능

    • 중복 제거가 필요할 때 유용

    let array = [1, 2, 2, 3, 4, 4, 5]
    let uniqueSet = Set(array) // {1, 2, 3, 4, 5}

    집합을 배열로 변환

    let sortedArray = Array(uniqueSet) // [1, 2, 3, 4, 5] 순서는 다를 수 있음

    배열 → 딕셔너리 변환

    let names = ["춘장", "메주", "감태"]
    let nameDict = Dictionary(uniqueKeysWithValues: names.enumerated().map { ($0.offset, $0.element) })
    print(nameDict) // [0: "춘장", 1: "메주", 2: "감태"]

    클래스 & 프로토콜 형변환

    Swift에서는 클래스와 프로토콜의 업캐스팅(Upcasting) & 다운캐스팅(Downcasting)을 지원한다.

    • 업캐스팅(Upcasting): 자식 클래스 → 부모 클래스로 변환 (as)

    • 다운캐스팅(Downcasting): 부모 클래스 → 자식 클래스로 변환(as?, as!)

    as – 업캐스팅

    업캐스팅은 항상 성공 (명시적 변환 필요)

    class Animal {}
    class Dog: Animal {}
    
    let puppy = Dog()
    let pet: Animal = puppy // 업캐스팅 (자동 변환 가능)

    as? – 안전한 다운캐스팅 (옵셔널 반환)

    다운캐스팅이 실패할 수 있으므로 as?를 사용하여 안전하게 변환

    let unknownAnimal: Animal = Dog()
    
    if let dog = unknownAnimal as? Dog {
        print("변환 성공: Dog 타입입니다.")
    } else {
        print("변환 실패")
    }

    as! – 강제 다운캐스팅 (실패 시 런타임 오류 발생)

    다운캐스팅이 항상 성공한다고 확신할 경우 as! 사용

    let unknownAnimal: Animal = Dog()
    let sureDog: Dog = unknownAnimal as! Dog // 변환 성공

    Any, AnyObject 형변환

    Swift에서는 모든 타입을 Any로 저장할 수 있으며, 클래스 타입은 AnyObject로 저장할 수 있다.

    Any는 모든 타입을 포함하는 타입

    var anything: Any = 42
    anything = "Swift"
    anything = 3.14

    AnyObject는 클래스 인스턴스만 저장 가능

    class Person {}
    let someone: AnyObject = Person()

    Any에서 원래 타입으로 변환하려면 안전한 변환을 위해 as?를 사용

    let unknown: Any = "Hello, Swift!"
    
    if let stringValue = unknown as? String {
        print("문자열 변환 성공: \(stringValue)")
    }

    타입 확인 (is)

    객체가 특정 타입인지 확인하려면 is 사용

    • 클래스 타입뿐만 아니라 프로토콜 타입 확인에도 사용 가능

    let animal: Animal = Dog()
    
    if animal is Dog {
        print("이 객체는 Dog 타입입니다.") // 출력됨
    }






    - 컬렉션 아티클