Swift Any와 타입체크

  1. Swift 에서의 타입 체크는 강한 타입체크로 변수/상수 선언 시에 정해진 타입을 확정하면 다른 타입의 데이터는 대입할 수 없다. (선언한 타입으로 대입하라고 에러 발생)
  2. Any를 이용하여 타입에 자유로운 가변 타입으로 선언하여 타입을 확정하지 않고, 사용 시에 필요한 타입을 사용할 수 있다.
    1. 사용 방법
    2. 위 코드를 보면 타입을 확정하여 선언 시와 다르게 다른 타입을 대입해도 에러가 발생되지 않는다.
    3. 가변 타입 Any는 타입에 대한 정보가 없기 때문에 타입별로 사용하는 메소드, 프로퍼티는 사용할 수 없고, 타입 체크 후에 타입을 확정하는 과정이 필요하다.
      1. 타입 정보 얻는 방법 : type(of : )
        타입 정보 얻기
        // Any를 이용하여 타입 선언
        var anyValue : Any = 10
        print(type(of : anyValue)) // Int를 출력
      2. 타입 체크하는 방법 : is Type명
        타입 체크
        // Any를 이용하여 타입 선언
        var anyValue : Any = 10
        if anyValue is Int { // is를 이용한 타입 체크
            print("정수 타입")
        } else {
            print("정수 이외의 타입")
        }

        // 상속과 타입 체크
        class Animal {} // Parent 클래스
        class Dog : Animal {} // Child 클래스
        class Cat : Animal{} // Child 클래스

        var bingo : Animal = Dog("빙고")
        bingo is Dog // true
        bingo is Animal // true
        /* Child 클래스는 Parent 클래스와 is a 관계가 성립하여 타입체크 시 Parent 클래스로 확인해도 true가 반환 */
        bingo is Cat // false
      3. 타입 변환하는 방법 : as
        타입 변환
        // Any를 이용하여 타입 선언
        var anyValue : Any = 10
        let intVal1 = anyValue as Int // 타입 변환이 확실한 경우
        let intVal2 = anyValue as? Int // 타입 변환 불가 시 nil
        let strVal = anyValue as! String
        /*강제 타입 변환으로 변환 실패 시 컴파일 에러 발생*/

        // 상속과 타입 변환
        class Animal {} // Parent 클래스
        class Dog : Animal {} // Child 클래스
        class Cat : Animal{} // Child 클래스

        var bingo = Dog()
        var animal = bingo as Animal // 타입 변환 성공
        /* Child 클래스에서 Parent 클래스로 타입 변환하는 업 캐스팅은 항상 성공한다. */

        var obj : Animal = Cat()
        let cat1 = obj as Cat // 컴파일
        let cat2 = obj as? Cat // 변환 성공, 옵셔널 타입
        // let cat2 : Cat? = Cat() 과 동일
        let cat3 = obj as! Cat // 변환 성공, Non-옵셔널 타입
        // let cat3 : Cat = Cat() 과 동일
        /* Parent 클래스에서 Child 클래스로 타입 변환하는 다운 캐스팅은 as 인 경우를 제외하고 옵셔널이나 강제 변환은 가능하다. */