기본 데이터 타입 변환 (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 타입입니다.") // 출력됨
}