Swift에서 is와 as로 배우는 타입 확인과 변환의 핵심
타입 캐스팅이란 무엇인가?
타입 캐스팅은 객체의 타입을 다른 타입으로 변환하는 과정이다. 그러나 이때 중요한 점은 타입을 변경하는 것이 아니라 객체가 다른 타입을 참조하도록 변환하는 것이라는 점이다. 쉽게 말해, 어떤 클래스의 인스턴스를 부모 클래스나 자식 클래스의 타입으로 변환하여 사용할 수 있도록 해주는 기능이다.
타입 캐스팅은 is와 as라는 키워드를 사용하여 진행된다. is는 객체의 타입이 특정 타입에 맞는지 확인할 때 사용하고, as는 객체의 타입을 다른 타입으로 변환할 때 사용된다.
타입 캐스팅의 예시
우리는 타입 캐스팅을 이해하기 위해, 아래와 같은 간단한 클래스를 정의해보자.
class Person {
var name: String = ""
func breath() {
print("숨을 쉽니다.")
}
}
class Student: Person { // : Person은 Student가 Person을 상속한다는 의미
var school: String = ""
func goToSchool() {
print("등교를 합니다.")
}
}
class UniversityStudent: Student { // : Student는 UniversityStudent가 Student를 상속한다는 의미
var major: String = ""
func goToMT() {
print("멤버쉽 트레이닝을 갑니다!")
}
}
이 코드에서 Person 클래스는 기본적인 사람 정보를 가지고 있고, **Student**는 학생에 대한 속성을 추가하며, **UniversityStudent**는 대학생이라는 추가 속성과 메서드를 정의한다.
- Person 클래스는 사람에 대한 기본적인 속성이나 기능을 가지고 있다.
- Student 클래스는 Person 클래스를 상속받아 학생에 관련된 기능을 추가한다.
- UniversityStudent 클래스는 Student 클래스를 상속받아 대학생에 관련된 기능을 추가한다.
상속에서 : 기호의 의미
위 예시에서 볼 수 있듯이, : 기호는 상속을 나타내는 중요한 역할을 한다. Student: Person에서 :는 Student 클래스가 Person 클래스를 상속한다는 뜻이다. 이 말은, Student가 Person의 속성과 메서드를 물려받는다는 의미이다.
class Student: Person { // : Person은 Person 클래스를 상속한다는 의미
var school: String = ""
func goToSchool() {
print("등교를 합니다.")
}
}
- 부모 클래스는 Person이고, 자식 클래스는 Student이다.
- Student 클래스는 Person 클래스에서 정의된 속성(예: name)과 메서드(예: breath())를 상속받게 된다.
이렇게 상속을 통해 자식 클래스는 부모 클래스에서 정의한 기능을 재사용할 수 있게 된다. 즉, Student는 Person에서 물려받은 name 속성과 breath() 메서드를 사용할 수 있다.
타입 확인하기 - is 키워드
타입 캐스팅의 첫 번째 단계는 타입 확인이다. is 키워드를 사용하여 객체가 특정 타입을 가질 수 있는지 확인할 수 있다.
let yagom: Person = Person()
let hana: Student = Student()
let jason: UniversityStudent = UniversityStudent()
var result: Bool
result = yagom is Person // true
result = yagom is Student // false
result = yagom is UniversityStudent // false
result = hana is Person // true
result = hana is Student // true
result = hana is UniversityStudent // false
result = jason is Person // true
result = jason is Student // true
result = jason is UniversityStudent // true
여기서 중요한 점은 is 키워드를 사용하면, 해당 객체가 특정 타입에 맞는지 검사할 수 있다는 것이다. 예를 들어, yagom is Person은 true가 되고, yagom is Student는 false가 된다. 이는 yagom이 Person 타입의 객체이기 때문이며, Student나 UniversityStudent 타입은 아니기 때문이다.
타입 변환 - as 키워드
타입 확인이 끝난 후, 타입 변환이 필요할 때 as 키워드를 사용한다. as는 객체를 다른 타입으로 변환할 때 사용되며, 변환할 타입이 부모 클래스일 경우, 업 캐스팅 (Upcasting)이 이루어진다. 반대로 자식 클래스일 경우에는 다운 캐스팅 (Downcasting)이 이루어진다.
1. 업 캐스팅 (Upcasting)
업 캐스팅은 자식 클래스의 객체를 부모 클래스 타입으로 변환하는 것이다. 이 경우, 암시적으로 처리되기 때문에 as를 생략할 수 있다.
var mike: Person = UniversityStudent() as Person // 업 캐스팅
이 코드에서 UniversityStudent()는 Person 타입으로 변환되며, Person 타입 변수인 mike에 할당된다. 이는 UniversityStudent가 Person을 상속받은 자식 클래스이기 때문에 가능하다.
2. 다운 캐스팅 (Downcasting)
다운 캐스팅은 부모 클래스의 객체를 자식 클래스 타입으로 변환하는 것이다. 이때, 타입이 맞지 않으면 런타임 오류가 발생할 수 있으므로, 조건부 다운 캐스팅 (as?) 또는 강제 다운 캐스팅 (as!)을 사용해야 한다.
- 조건부 다운 캐스팅 (as?): 객체가 변환할 수 없는 타입이면 nil을 반환한다.
- 강제 다운 캐스팅 (as!): 객체가 변환할 수 없는 타입이면 런타임 오류가 발생한다.
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent // nil
optionalCasted = hana as? Student // Student 타입으로 변환 가능
as?를 사용하면 변환 실패 시 nil을 반환하여 안전하게 처리할 수 있다. 반면, as!는 변환이 불가능한 경우 강제 종료되므로 조심해야 한다.
타입 캐스팅 활용하기
타입 캐스팅을 잘 활용하면, 다양한 클래스 구조에서 객체의 타입을 동적으로 확인하고, 적절한 메서드를 실행할 수 있다.
예시 1: switch문을 사용한 타입 확인
func doSomethingWithSwitch(someone: Person) {
switch someone {
case is UniversityStudent:
(someone as! UniversityStudent).goToMT()
case is Student:
(someone as! Student).goToSchool()
case is Person:
(someone as! Person).breath()
}
}
doSomethingWithSwitch(someone: mike) // "멤버쉽 트레이닝을 갑니다!"
doSomethingWithSwitch(someone: hana) // "등교를 합니다"
예시 2: if let을 사용한 조건부 타입 캐스팅
func doSomething(someone: Person) {
if let universityStudent = someone as? UniversityStudent {
universityStudent.goToMT()
} else if let student = someone as? Student {
student.goToSchool()
} else {
someone.breath()
}
}
doSomething(someone: mike) // "멤버쉽 트레이닝을 갑니다!"
doSomething(someone: hana) // "등교를 합니다"
이 예시들에서는 타입을 확인한 후 해당 타입에 맞는 메서드를 호출하는 방식으로 타입 캐스팅을 활용하고 있다.
타입 캐스팅은 객체를 다른 타입으로 변환하는 과정이다. is 키워드를 사용해 타입을 확인하고, as 키워드를 통해 객체를 다른 타입으로 변환할 수 있다. 이를 통해 상속 관계에 있는 클래스들에서 부모 클래스와 자식 클래스 간의 타입 변환을 자유롭게 할 수 있다.
- 업 캐스팅: 자식 클래스 객체를 부모 클래스 타입으로 변환.
- 다운 캐스팅: 부모 클래스 객체를 자식 클래스 타입으로 변환 (조건부 및 강제 다운 캐스팅 사용).
이러한 기법을 통해 객체의 타입을 동적으로 변경하면서, 더 유연하고 강력한 코드 구조를 만들 수 있다. 타입 캐스팅을 잘 활용하면 코드의 유지보수성과 확장성을 높이는 데 많은 도움이 된다:)
'IT' 카테고리의 다른 글
스위프트 프로토콜 vs 클래스 상속: 유연한 기능 구현을 위한 최적의 선택 (0) | 2025.05.11 |
---|---|
Swift : assert, guard, 그리고 제어 흐름 제어문 (0) | 2025.05.11 |
Swift 옵셔널 체이닝과 nil 병합 연산자 (0) | 2025.05.11 |
Swift 클래스, 인스턴스, 그리고 메모리 관리: init과 deinit의 역할 (0) | 2025.05.10 |
Swift 클래스 상속 제대로 알기: 프로토콜과 final, override (0) | 2025.05.09 |
댓글
이 글 공유하기
다른 글
-
스위프트 프로토콜 vs 클래스 상속: 유연한 기능 구현을 위한 최적의 선택
스위프트 프로토콜 vs 클래스 상속: 유연한 기능 구현을 위한 최적의 선택
2025.05.11 -
Swift : assert, guard, 그리고 제어 흐름 제어문
Swift : assert, guard, 그리고 제어 흐름 제어문
2025.05.11 -
Swift 옵셔널 체이닝과 nil 병합 연산자
Swift 옵셔널 체이닝과 nil 병합 연산자
2025.05.11 -
Swift 클래스, 인스턴스, 그리고 메모리 관리: init과 deinit의 역할
Swift 클래스, 인스턴스, 그리고 메모리 관리: init과 deinit의 역할
2025.05.10