아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 27일차_타입캐스팅

바닐라머스크 2022. 2. 19. 23:21

■ 타입 캐스팅(type casting)

  • 인스턴스의 타입을 확인하는 가능
    → 어떠한 클래스의 인스턴스를 (자체 클래스 계층 구조의) 다른 곳에서 부모 클래스 or 자식 클래스의 타입으로 사용 가능여부 확인
  • 클래스와 딕셔너리에서 많이 사용
  • 클래스와 하위 클래스의 계층도와 함께 타입 캐스팅을 사용하여
    → 특정 클래스 인스턴스의 타입 확인 가능
    → 같은 계층도 내에서 다른 클래스로 인스턴스를 캐스트 가능
    → (클래스의 계층도에 해당하는)클래스의 인스턴스를 포함하는 배열 정의 가능
  • 타입 캐스팅을 사용해도 기본 인스턴스는 동일하게 유지됨
    → 즉, 캐스팅은 실제로 인스턴스를 수정하거나 값변경을 수행하지는 않음
  • 타입 캐스팅을 사용하여 타입이 프로토콜을 준수하는지 확인 가능

요즘 베이징 올림픽하니까 오늘의 예시는 겨울 스포츠로 돌려보았다.

// 기본 클래스 WinterSprots 정의
class WinterSprots {
    var athletename: String
    init(athletename: String) {
        self.athletename = athletename
    }
}

// 하위클래스 FigureSkating, ShortTrack 2개 정의
class FigureSkating: WinterSprots {
    var jump: String
    init(athletename: String, jump: String) {
        self.jump = jump
        super.init(athletename: athletename)
    }
}

class ShortTrack: WinterSprots {
    var speed: Double
    init(athletename: String, speed: Double) {
        self.speed = speed
        super.init(athletename: athletename)
    }
}

// 3개의 FigureSkating인스턴스와 2개의 ShortTrack인스턴스를 포함하는 record라는 배열 상수를 생성
// FigureSkating와 ShortTrack이 WinterSprots의 상위 클래스를 공통으로 갖고 있으므로 record배열에 대해 [WinterSprots]에 타입으로 유추 가능

let record = [
    FigureSkating(athletename: "김연아", jump: "트리플 러츠"),
    ShortTrack(athletename: "곽윤기", speed: 40.239),
    FigureSkating(athletename: "김연아", jump: "트리플 플립"),
    FigureSkating(athletename: "김연아", jump: "트리플 토루프"),
    ShortTrack(athletename: "곽윤기", speed: 83.007)
    ]

 

■ 타입캐스팅 구현 연산자

-  is, as
  : 값의 타입을 확인하거나 값을 다른 타입으로 변환하는데 사용

1) is 를 사용한 타입 검사
  - 타입 검사 연산자(type check operator)인 is를 활용하여 인스턴스가 특정 하위 클래스 타입인지 확인
    → 인스턴스가 하위 클래스 타입이면 true, 아닐 경우 false 반환

var figureskatingCount = 0
var shorttrackCount = 0

for item in record {
    if item is FigureSkating {
        figureskatingCount += 1
    } else if item is ShortTrack {
        shorttrackCount += 1
    }
}

print("WinterSprots library contains \(figureskatingCount) figureskatings and \(shorttrackCount) shorttracks")
// 프린트 결과 : WinterSprots library contains 3 figureskatings and 2 shorttracks

 

2) as를 사용한 다운 캐스팅
  - 타입 캐스트 연산자(type check operator)인 as? 또는 as!를 활용하여 특정 클래스 타입의 상수 or 변수를 ‘다운캐스팅’하여 하위 클래스의 인스턴스를 참조할 수 있음
    → 즉, 자식클래스의 인스턴스를 사용하기 위해 컴파일러에게 인스턴스의 타입정보를 전환 가능
  - 다운캐스팅은 실패할 수 있기 때문에 2가지 형태의 타입캐스트 연산자 제공 : as?, as!

  2.1) as?
    - 조건부 형식
    - 다운 캐스팅시 (다운 캐스팅 하려는)타입의 옵셔널 값으로 반환
    - 다운 캐스트 성공여부 확신이 없을 때 사용
      → 항상 옵셔널 값을 반환하며, 다운캐스트가 불가능할 경우 nil 반환
          (= 다운 캐스트 성공여부 확인용으로 사용 가능)

// 각 항목에서 사용할 실제 클래스를 사전에 알 수 없으므로 루프를 통해 매번 다운 캐스트 확인을 위해 as? 사용
// FigureSkating 으로 현재 item을 다운 캐스트하는 것으로 시작
// item이 세 개의 클래스 중 어떤 것일지 모르니까 as? 사용
// as?은 하위 클래스 타입으로 다운캐스트 시도시 옵셔널 값으로 반환하므로, item as? FigureSkating 의 결과는 FigureSkating? 타입 혹은 "옵셔널 FigureSkating"임
// 라이브러리 배열에 ShortTrack 인스턴스로 적용시 FigureSkating로 다운 캐스팅에는 실패하며, 이를 대응하기 위해 옵셔널 바인딩 사용
// -> 즉, FigureSkating로 item은 접근하려고 하는데, 성공하면 반환된 옵셔널 FigureSkating을 figureskating라는 새로운 임시 상수로 설정해라~

for item in record  {
    if let figureskating = item as? FigureSkating {
        print("FigureSkating: \(figureskating.athletename), skill \(figureskating.jump)")
    } else if let shorttrack = item as? ShortTrack {
        print("ShortTrack: \(shorttrack.athletename), personal record \(shorttrack.speed)")
    }
}

// FigureSkating: 김연아, skill 트리플 러츠
// ShortTrack: 곽윤기, personal record 40.239
// FigureSkating: 김연아, skill 트리플 플립
// FigureSkating: 김연아, skill 트리플 토루프
// ShortTrack: 곽윤기, personal record 83.007


  2.2) as!
    - 강제 형식
    - 다운 캐스팅을 시도하며 강제 언랩핑하여 값을 반환
    - 다운 캐스트 성공여부 확신이 있을 때 사용
      ※ 만약 잘못된 클래스 타입으로 다운캐스팅할 경우, 런타임에러가 발생하여 프로그램이 강제종료됨


3) as를 사용한 업 캐스팅
  - as
사용하여 부모클래스의 인스턴스를 사용할 있도록, 컴파일러에게 타입정보를 전환해줌
  - 
많이 사용하지는 않음

 

 

본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.

 fast campus강의  참조자료

[1] https://blog.yagom.net/560/

[2] https://bbiguduk.gitbook.io/swift/language-guide-1/type-casting

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.