인스턴스의 타입을 확인(is)하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법(as)
1. is: Checking Type
expression is Type
타입을 체크하는 연산자로, 런타임 시점에 실제 체크가 이루어진다.
표현식이 Type과 동일하거나, 표현식이 Type의 서브 클래스인 경우 → true
이외에는 → false
1-1. 동일한 타입을 확인할 때 사용할 수 있다.
let char: Character = "A"
char is Character // true
char is String // false
let bool: Bool = true
bool is Bool // true
bool is Character // false
1-2. 또한, 표현식이 Type의 서브 클래스인 경우에도 true를 반환한다.
class Human {}
class Teacher: Human {}
let teacher: Teacher = .init()
teacher is Teacher // true
teacher is Human // true
1-3. 애플 예제
class Human {
let name: String
init(name: String) {
self.name = name
}
}
class Teacher: Human {}
class Student: Human {}
let people: [Human] = [
Teacher.init(name: "김선생"),
Student.init(name: "박제자"),
Student.init(name: "유제자")
]
- Human 클래스와 그를 상속하는 Teacher 클래스, Student 클래스가 있다.
- people 배열은 Human 클래스를 담도록 설정되었다.
- Teacher와 Student 클래스는 Human 클래스를 상속했기에 people 배열에 함께 들어갈 수 있다.
- 이는 업캐스팅으로 가능하다.
- Teacher와 Student의 슈퍼 클래스가 Human 클래스로 동일하기에, 둘 다 업캐스팅되었다.
2. as: Type Casting
expression as Type
expression as? Type
expression as! Type
표현식(의 타입)이 변환할 타입과 호환된다면, 변환할 타입으로 캐스팅된 인스턴스를 리턴한다.
상속 관계인 업캐스팅과 다운 캐스팅에서 사용한다.
Any와 AnyObject 타입을 사용할 경우, 상속 관계가 아니더라도 예외적으로 사용할 수 있다.
Upcasting
서브 클래스 인스턴스를 “슈퍼 클래스의 타입”으로 참조한다.
업캐스팅은 항상 성공한다.(?, !을 사용하지 않는다.)
as 연산자를 사용해서 할 수도 있다(컴파일 시점에 캐스팅 가능 여부를 결정한다.)
Swift가 타입에 엄밀함에도 1-3에서는 Human만 담도록 만들어진 배열에 Teacher, Student 타입 인스턴스가 함께 담겼다.
Teacher와 Student 타입은 모두 Human을 슈퍼 클래스로 가지고 있기 때문에 가능: Human클래스로 업캐스팅 되어 담긴 것이다.
업캐스팅되면 부모 클래스의 멤버까지만 접근 가능하다.
as를 써도 되고, 직접 타입을 명시해도 된다.
// as를 이용한 업캐스팅
let human1 = Teacher.init() as Human
// Type Annotation을 이용한 업캐스팅
let human2: Human = Teacher.init()
Downcasting
슈퍼 클래스 인스턴스를 “서브 클래스의 타입”으로 참조한다.
업캐스팅된 인스턴스를 다시 원래의 서브 클래스 타입으로 참조할 때 사용한다.
실패가능성이 있기에 as?, as! 연산자를 사용한다.
실패하는 경우
let human: Human = Teacher.init() // 상위 클래스를 하위 클래스로 다운캐스팅했다.
var student: Student = human as! Student // 다운캐스팅된 하위 클래스를 잘못된 클래스로 업캐스팅했다.
'Swift' 카테고리의 다른 글
객체 지향 프로그래밍 (0) | 2023.05.01 |
---|---|
Optional (0) | 2023.04.28 |
개인정보 처리방침 (0) | 2023.04.14 |
QuitHelper: 심플한 금연 어플 (0) | 2023.04.14 |