[Swift] 타입 캐스팅 (Type Casting)

Kiwi·2024년 3월 15일

Swift

목록 보기
12/21
post-thumbnail

📁 타입 캐스팅

인스턴스의 "타입"을 확인 하거나, 변수나 객체의 타입을 다른 타입으로 변환하는 프로세스를 타입 캐스팅이라고 한다.

class Person{

}

class Student: Person{

}

class Teacher: Person{

}

let personA: Person = Person()
personA = Student() //가능
personA = Teacher() //가능
let studentA: Student = Student()
studentA = Person() //불가능
studentA = Teacher() //불가능
let teacherA: Teacher = Teacher()
teacherA = Person() //불가능
teacherA = Student() //불가능

📝 is

is 연산자를 활용해 타입을 체크하고 비교 결과는 bool 타입으로 반환한다.

let str: String = "hello"

print(str is String)	//true
print(str is Character)	//false

result = personA is Person	//true
result = personA is Student	//false
result = personA is Teacher	//false

result = studentA is Person	//true
result = studentA is Student //true
result = studentA is Teacher //false

📝 업 캐스팅

as 연산자를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다. Any 혹은 AnyObject로도 타입정보를 변환할 수 있다.

class Person {
    var id = 0
    var name = "name"
}

class Worker: Person {
    var salary = 300
}

class Programmer: Worker{
    var lang = "swift"
}

//업캐스팅
var ally: Worker = Programmer() as Worker //programmer인스턴스를 생성하여 person 행세를 할 수 있도록
print(ally.lang)    //Value of type 'Worker' has no member 'lang'
print(ally.salary)

var ben: Any = Person()

위의 코드에서 ally를 worker로 보고 있기 때문에 lang에는 접근하지 못한다.

📝 다운 캐스팅

as? 또는 as! 를 사용하여 자식클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.

✅ as? (조건부 다운 캐스팅)

as? 연산자는 런타임에 캐스팅이 실행된다. 캐스팅에 실패하면(캐스팅하려는 타입에 부합하지 않는 인스턴스라면) nil을 반환하기 때문에 결과의 타입은 옵셔널 타입이다.즉, 실패할 가능성이 있으면 as? 를 사용하는 것이 좋다.

let programmer1 = Programmer()
let worker1 = Worker()
let person1 = Person()

let worker2 = worker1 as? Worker			//Worker
let worker3 = worker1 as? Person			//Person
let worker4 = worker1 as? Programmer		//nil

let person2 = person1 as? Person			//Person
let person3 = person1 as? Worker			//nil
let person4 = person1 as? Programmer		//nil

let programmer2 = programmer1 as? Person	//Person
let programmer3 = programmer1 as? Worker	//Worker
let programmer4 = programmer1 as? Programmer//Programmer


if let person5 = programmer1 as? Programmer {
    person5.lang	//swift
}
if let person6 = worker1 as? Programmer {
    person6.lang
}

✅ as! (강제 다운 캐스팅)

as! 연산자는 런타임에 특정 타입으로 강제 캐스팅된다. 캐스팅에 실패하면, 런타임 오류가 발생한다. 캐스팅에 성공하면 성공한 인스턴스(일반 타입)를 반환한다.

let work1 = worker1 as! Person
let work2 = worker1 as! Worker
let work3 = worker1 as! Programmer		//Error
profile
🐣 iOS Developer

0개의 댓글