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

Swiftios
avatar
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 타입입니다.") // 출력됨
}






- 컬렉션 아티클