본문 바로가기

프로그래밍 [KOR]/Swift

Swift의 타입 캐스팅

1. 스위프트 타입 캐스팅


  •인스턴스의 타입을 확인하는 용도

  •클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도

  •is, as를 사용


* 형변환은 'ex. let someDouble = Double(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것




2. 예제 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Person {
    var name: String = ""
    func breath() {
        print("숨을 쉽니다")
    }
}
 
class Student: Person {
    var school: String = ""
    func goToSchool() {
        print("등교를 합니다")
    }
}
 
class UniversityStudent: Student {
    var major: String = ""
    func goToMT() {
        print("멤버쉽 트레이닝을 갑니다 신남!")
    }
}
cs


1
2
3
4
// 인스턴스 생성
var jinun: Person = Person()
var jennie: Student = Student()
var lisa: UniversityStudent = UniversityStudent()
cs




2. 타입확인


is를 사용하여 타입을 확인합니다


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
32
33
34
35
36
37
38
39
40
41
42
43
var result: Bool
 
result = jinun is Person // true
result = jinun is Student // false
result = jinun is UniversityStudent // false
 
result = jennie is Person // true
result = jennie is Student // true
result = jennie is UniversityStudent // false
 
result = lisa is Person // true
result = lisa is Student // true
result = lisa is UniversityStudent // true
 
if jinun is UniversityStudent {
    print("jinun은 대학생입니다")
else if jinun is Student {
    print("jinun은 학생입니다")
else if jinun is Person {
    print("jinun은 사람입니다")
// jinun은 사람입니다
 
switch jennie {
case is Person:
    print("jennie는 사람입니다")
case is Student:
    print("jennie는 학생입니다")
case is UniversityStudent:
    print("jennie는 대학생입니다")
default:
    print("jennie는 사람도, 학생도, 대학생도 아닙니다")
// jennie는 사람입니다
 
switch lisa {
case is University:
    print("lisa는 대학생입니다")
case is Student:
    print("lisa는 학생입니다")
case is Person:
    print("lisa는 사람입니다")
default:
    print("lisa는 사람도, 학생도, 대학생도 아닙니다")
// lisa는 대학생입니다
cs




3. 업 캐스팅(Up Casting)


  •as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줌

  •Any 혹은 AnyObject로도 타입정보를 변환할 수 있음

  •암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방


1
2
3
4
5
6
7
8
// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅
var rose: Person = UniversityStudent() as Person
 
var jennie: Student = Student()
//var jisoo: UniversityStudent = Person() as UniversityPerson // 컴파일 오류
 
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jisoo: Any = Person() // as Any 
cs



4. 다운 캐스팅(Down Casting)


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



A. 조건부 다운 캐스팅


  •as?를 사용함

  •캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입임


1
2
3
4
5
6
var optionalCasted: Student?
 
optionalCasted = jennie as? UniversityStudent
optionalCasted = jisoo as? UniversityStudent // nil
optionalCasted = lisa as? UniversityStudent // nil
optionalCasted = rose as? Student // nil
cs



B. 강제 다운 캐스팅


  •as!를 사용

  •캐스팅에 실패하면, 즉 캐스팅하려면 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생함

  •캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환


1
2
3
4
5
6
var forcedCasted: Student
 
optionalCasted = rose as! UniversityStudent
//optionalCasted = jennie as! UniversityStudent // 런타임 오류
//optionalCasted = jisoo as! UniversityStudent // 런타임 오류
//optionalCasted = jisoo as! UniversityStudent // 런타임 
cs




5. 활용


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
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: lisa as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: lisa) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: jennie) // 등교를 합니다
doSomethingWithSwitch(someone: jinun) // 숨을 쉽니다
 
 
func doSomething(someone: Person) {
    if let universityStudent = someone as? UniversityStudent {
        universityStudent.goToMT()
    } else if let stuent = someone as? Student {
        student.goToSchool()
    } else if let person = someone as? Person {
        person.breath()
    }
}
 
doSomething(someone: lisa as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: lisa) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: jennie) // 등교를 합니다
doSomething(someone: jinun) // 숨을 
cs






제 나름대로 생각을 정리하며 포스팅합니다.

정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.

본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.

E-mail : silent_lhr@naver.com



공감은 로그인이 필요없습니다.

공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.


'프로그래밍 [KOR] > Swift' 카테고리의 다른 글

Swift의 프로토콜(Protocol)  (0) 2018.10.19
Swift의 assert와 guard  (0) 2018.10.18
Swift의 옵셔널 체이닝과 nil 병합 연산자  (0) 2018.10.17
Swift의 인스턴스의 생성과 소멸  (0) 2018.10.15
Swift의 상속  (0) 2018.10.11