반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- centOS7
- NGINX
- 도커 이미지
- 데브옵스
- 컨테이너
- ios
- devops
- k8s
- Python
- AWS
- 도커
- linux
- 프로세스
- os
- 쿠버네티스
- 부스트코스
- boj
- 네트워크
- centOS
- 도커 명령어
- C++
- 운영체제
- docker
- Swift
- swift 클로저
- 인프라
- 도커 컨테이너
- kubernetes
- 클라우드
- 리눅스
Archives
- Today
- Total
귀염둥이의 메모
[Swift] 타입 캐스팅(Type Casting), 업 캐스팅(Up Casting), 다운 캐스팅(Down Casting) 본문
iOS/Swift
[Swift] 타입 캐스팅(Type Casting), 업 캐스팅(Up Casting), 다운 캐스팅(Down Casting)
겸둥이xz 2021. 4. 9. 02:38반응형
스위프트 타입 캐스팅
- 인스턴스의 타입을 확인하는 용도로 쓰입니다.
- 클래스의 인스턴스를 부모(Up) 혹은 자식(Down) 클래스의 타입으로 사용할 수 있는지 확인하는 용도
- is, as를 사용합니다
타입 캐스팅 예제
class Person {
var name: String = ""
func breath() {
print("숨을 쉽니다.")
}
}
class Student: Person {
var school: String = ""
func goToSchool() {
print("등교를 합니다.")
}
}
class UniversityStudent: Student {
var major: String = ""
func goToLib() {
print("도서관을 갑니다..")
}
}
// 인스턴스 생성
var james: Person = Person()
var hana: Student = Student()
var joe: UniversityStudent = UniversityStudent()
is를 이용한 타입확인
var result: Bool
result = james is Person // true
result = james is Student // false
result = james is UniversityStudent // false
result = hana is Person // true
result = hana is Student // true
result = hana is UniversityStudent // false
result = joe is Person // true
result = joe is Student // true
result = joe is UniversityStudent // true
// if
if james is UniversityStudent {
print("james는 대학생입니다.")
} else if james is Student {
print("james는 학생입니다.")
} else if james is Person {
print("james는 사람입니다.")
} // james는 사람입니다.
// switch, case
switch james {
case is Person:
print("james는 사람입니다.")
case is Student:
print("james는 학생입니다.")
case is UniversityStudent:
print("james는 대학생입니다.")
default:
print("james는 사람도, 학생도, 대학생도 아닙니다!")
} // james는 사람입니다.
Person is Student 사람은 학생이다.(X) - 모든 사람은 학생이 아니다.
Student is Person 학생은 사람이다.(O)
업 캐스팅(Up Casting)
- as를 사용하여 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
- Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다.
- 암시적으로 처리되므로 꼭 필요한 경우가 아니면 생략가능합니다.
// UniversityStudent 인스턴스를 생성하여 Person(부모클래스)로 업 캐스팅
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jina: Any = Person() // as Any 생략가능
다운 캐스팅(Down Casting)
- as?(조건부) 또는 as!(강제) 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent // nil
optionalCasted = jina as? UniversityStudent // nil
optionalCasted = jina as? Student // nil
mike는 UniversityStudent이지만, 현재 Person으로 Up Casting 되어있는 상태입니다.
- var mike: Person = UniversityStudent() as Person
그래서 as?를 통해서 UniversityStudent로 Down Casting이 가능합니다.
2. 강제 다운 캐스팅
- as!를 사용하고, 캐스팅에 실패하면 런타임 오류가 발생합니다. 캐스팅 성공시 일반 타입을 반환합니다.
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류
<참고자료>
반응형
'iOS > Swift' 카테고리의 다른 글
[Swift] 클로저 (2) - Capturing Values, Escaping Closure, Auto Closure (0) | 2021.06.21 |
---|---|
[Swift] enum(열거형) 기초 (0) | 2021.05.17 |
[Swift] 클로저(Closure) (1) (0) | 2021.04.13 |
[Swift] 구조체(struct) vs 클래스(class) (1) | 2021.02.19 |
[Swift] Optional(옵셔널) (0) | 2021.02.17 |
Comments