ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • as 연산자 / is 연산자
    Swift/swift 문법 2023. 5. 26. 19:36

    상속은 필요한 데이터를 추가하는 메모리 구조 

     

     

    undergraduate 타입은 person을 상속받는다. 

    메모리 구조 -> person에서 undergraduate의 프로퍼티가 추가된다. 

     

    is 연산자 

    : 특정 타입이 맞는지 확인한다. 

    반환값: Bool type

     

    as 연산자

    : 인스턴스 타입의 힌트를 변경하는 연산자. 

    다운캐스팅에 성공할 경우, 접근가능한 항목(상속받은 클래스의 프로퍼티)의 수를 늘려준다. 

     

     

    let person: Person = Undergraduate() 

    -> Person: 변수에 정의된 타입 

    Undergraduate: 실제 메모리 공간의 인스턴스 

     

    Person type보다 Undergraduate type 항목의 개수가 더 많다. 

    하지만 현재 Person type으로 person변수에는 정의되어 있으므로 Person type의 프로퍼티만 접근 가능하다. (오개념)

    -> person의 타입은 Undergraduate이나, Person의 프로퍼티에만 접근할 수 있다. 

    let apple:Fruit = Rosaceae()
    print(type(of: apple))     ////Rosaceae

    type을 print해보면 Rosaceae type으로 출력된다.

    하지만  Rosaceae class에서 추가된 프로퍼티에는 접근 불가. 

     

    -> 타입 캐스팅 필요. 

    접근 가능한 프로퍼티를 늘려주기 위해서는 as? 연산자로 타입을 바꾸어 주어야 한다.

     

     

    ex. if let apple = person as? Rosaceae

    person을 Rosaceae로 바인딩해서 사용 

     

    성공하면 옵셔널 값이 추출

     

     

    [코드 예시]

    class Fruit {
        var flower:String
        var tree:Bool
        
        init() {
            self.flower = "rose"
            self.tree = false
        }
    }
    
    //fruit을 상속받는 Rosaceae
    class Rosaceae: Fruit {
        var color : String
        
        override init() {
            //자신의 메모리 구조를 초기화 한 후 상위(부모) 속성의 메모리 이니셜라이저 호출이 필요.
            self.color = "blue"
            super.init()
        }
    }
    
    //타입 힌트는 Fruit이지만 실제 메모리 구조는 Rosaceae로 생성
    let apple:Fruit = Rosaceae()
    print(type(of: apple))     ////Rosaceae
    apple.tree
    apple.flower
    
    //Fruit type의 프로퍼티에만 접근할 수 있다. (에러)
    //apple.color
    
    
    //apple 인스턴스를 Rosaceae로 타입캐스팅하여 appleWithRose에 담는다.
    if let appleWithRose = apple as? Rosaceae {
        print(type(of: apple))          //Rosaceae
        print(type(of: appleWithRose))  //Rosaceae
        
        //Rosaceae type의 프로퍼티 flower에 접근 가능하도록 변경됨.
        print(appleWithRose.flower)
    }

     

     

     

     

     

     

     

     

Designed by Tistory.