itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 어플
  • ios
  • mongodb
  • 개발자
  • crud
  • SwiftUI
  • CS
  • 세그멘테이션
  • 생활코딩
  • 점주
  • POSTECH
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 연결리스트
  • 킨디
  • AppleDevloperAcademy
  • 독립서점
  • nosql
  • binding
  • SWIFT
  • CoreData

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

iOS/Swift

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 24. 타입 캐스팅

2021. 7. 27. 18:28

타입 캐스팅

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

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

- is, as 사용

 

 

//예제 클래스들
class Person {
    var name: String = ""
    func breath() {
        print("숨 쉰다!!!!!")
    }
}

class Student {
    var school: String = ""
    func goToSchool() {
        print("학교 쨀 사람?")
    }
}

class UniversityStudent: Student {
    var major: String=""
    func goToMT() {
        print("니 술 좀 묵나? 일로 와바라 ㅋㅋ")
    }
}

//인스턴스 생성
var park: Person = Person()
var kang: Student = Student()
var wook: UniversityStudent = UniversityStudent()

 

타입 확인

is를 사용하여 타입을 확인하자

var result: Bool
result = park is Person // true
result = park is Student // false
result = park is UniversityStudent // false

result = kang is Person // true
result = kang is Student // true
result = kang is UniversityStudent // false

result = wook is Person // true
result = wook is Student // true
result = wook is UniversityStudent // true

if park is UniversityStudent {
    print("임마 학식이네 ㅋㅋ")
} else if park is Student {
    print("임마 급식이네 ㅋㅋ")
} else if park is Person {
    print("임마 사람이네 ㅋㅋ")
} // 임마 사람이네 ㅋㅋ

switch wook {
case is Person:
    print("wook은 사람이네 ㅋㅋ")
case is Student:
    print("wook은 급식이네 ㅋㅋ")
case is UniversityStudent:
    print("wook은 학식이네 ㅋㅋ")
default:
    print("wook은 사람도, 학생도, 대학생도 아닌 진짜 아무것도 아닙니다")
} // wook은 사람이네 ㅋㅋ

switch wook {
case is UniversityStudent:
    print("wook은 학식이네 ㅋㅋ")
case is Student:
    print("wook은 급식이네 ㅋㅋ")
case is Person:
    print("wook은 사람이네 ㅋㅋ")
default:
    print("wook은 사람도, 학생도, 대학생도 아닌 진짜 아무것도 아닙니다")
} // wook은 학식이네 ㅋㅋ

switch의 case에서 순서가 중요하다. 먼저 나오는 게 맞는 게 뜨면 그 case의 구문이 실행된다

 

 

 

업 캐스팅 (Up Casting)

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

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

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

//UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 해보자 by '업캐스팅'
var mike: Person = UniversityStudent() as Person

var jenny: Student = Student()

//컴파일 오류
var jina: UniversityStudent = Person() as UniversityStudent
//오류가 뜨는 이유는 Person은 UniversityStudent가 될 수 없기 때문

//UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 해보자 by '업캐스팅'
var jina: Any = Person() //as Any 생략 가능

 

 

 

다운 캐스팅(Down Casting)

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

 

A. 조건부 다운 캐스팅

- as? 사용

- 캐스팅에 실패하면 ( = 캐스팅하려는 타입이 부합하지 않는 인스턴스라면 ) nil 반환. 그래서 결과의 타입은 옵셔널

var optionalCasted: Student?

optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent //nil
optionalCasted = jina as? UniversityStudent //nil
optionalCasted = jina as? Student //nil

 

 

B. 강제 다운 캐스팅

- as! 사용

- 캐스팅에 실패하면 ( = 캐스팅하려는 타입이 부합하지 않는 인스턴스라면 ) 런타임 오류

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

var forcedCasted: Student

forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류

 

 

활용

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 as Person) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomethingWithSwitch(someone: mike) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomethingWithSwitch(someone: jenny) // 학교 쨀 사람?
doSomethingWithSwitch(someone: park) // 숨 쉰다!!!!!


func doSomething(someone: Person) {
    if let universityStudent = someone as? UniversityStudent {
        universityStudent.goToMT()
    } else if let student = someone as? Student {
        student.goToSchool()
    } else if let person = someone as? Person {
        person.breath()
    }
}

doSomething(someone: mike as Person) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomething(someone: mike) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomething(someone: jenny) // 학교 쨀 사람?
doSomething(someone: park) // 숨 쉰다!!!!!

'iOS > Swift' 카테고리의 다른 글

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜  (0) 2021.07.29
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard  (0) 2021.07.29
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 23. 옵셔널 체이닝과 nil 병합  (0) 2021.07.25
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 22. 인스턴스 생성 / 소멸 (init / deinit)  (0) 2021.07.24
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 21. 상속 (클래스의 상속)  (2) 2021.07.24
    'iOS/Swift' 카테고리의 다른 글
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 23. 옵셔널 체이닝과 nil 병합
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 22. 인스턴스 생성 / 소멸 (init / deinit)
    itisjustK
    itisjustK

    티스토리툴바