본문 바로가기
iOS

[복습] Part 13 타입 캐스팅 | is, as 연산자, 상속, 다형성, Any, AnyObject

by 23g 2024. 9. 11.

 

 

1) is 연산자 / as 연산자

is 연산자

: 인스턴스 타입을 검사함

class Person{
    var name = "이름"
}

class Student{
    var id = "20181234"
}

var lily = Person()
//is 연산자 사용
lily is Person
lily is Student

 

as 연산자

: 인스턴스 타입의 힌트를 변경하는 연산자(한 마디로 타입 변환)

 

하위 클래스 타입 ⊂ 상위 클래스 타입 이기 때문에

as
- 업캐스팅 : 상위 클래스의 타입으로 변경 
-> 항상 성공
let person = undergraduate as Person 

as? / as!
- 다운캐스팅 : 하위 클래스의 타입으로 변경
-> 실패 가능성 있음
let person = Person as? Female
let person = Person as! Female

+)
let person: Person = Undergraduate() //이렇게 선언하면
//실제로는 Person 데이터를 가르키지 않고 Undergraduate 가르킴~!

 

브릿징

String <-> NSString
//브릿징
//서로 완전 호환됨

 

2) 상속과 다형성

 

다형성(Polymorphism)

 - 하나의 객체(인스턴스)가 여러가지의 타입의 형태로 표현될 수 있음을 의미.

   (또는 하나의 타입으로 여러 종류의 객체를 여러가지 형태(모습)로 해석될 수 있는 성격)

 - 다형성이 구현되는 것은 "클래스의 상속"과 깊은 연관이 있음(향후 배울 프로토콜과도 연관)

[상속 시]

 - 하나의 인스턴스는 업캐스틴된 타입으로 인식되고 호출되더라도 실제 인스턴스 형태에 따라 재정의된 메서드가 호출되고 실행

//...각 클래스마다 다른 walk() 재정의함
let people: [Person] = [Person(), Student(), Undergraduate()]

// 반복문
for person in people { person.walk() }

// 한개씩
people[0].walk()     // Person 타입으로 인식 (Person 인스턴스)
//: 사람이 걷는다
people[1].walk()     // Person 타입으로 인식 (Student 인스턴스)
//: 학생이 걷는다
people[2].walk()     // Person 타입으로 인식 (Undergraduate 인스턴스)
//: 대학생이 걷는다

 

3 ) Any와 AnyObject

 

Any : 어떤 타입의 인스턴스도 표현할 수 있는 타입 (옵셔널도 포함)

let anyArr: [Any] = [3, "hi", Dog(), {(age: Int) -> Int}]

- 점연산자 사용 불가 (사용하려면 some as! Int).count 이런식으로 사용해야함

- 장점 : 모든 타입을 담을 수 있는 배열을 생성 가능

            의도적인 옵셔널 값을 경고 없이 사용 가능

- 단점 : 저장된 타입의 메모리 구조를 알 수없기 때문에, 항상 타입캐스팅해서 사용해야함 ⭐️

 

AnyObject : 어떤 클래스 타입의 인스턴스도 표현할 수 있는 타입 (=객체만 담을 수 있는)

let anyObjectArr: [AnyObject] = [Dog(), Cat(), Pig()]

 

any~ 타입캐스팅

for (index, value) in arrAny.enumerated() {
	
    switch value{
    	case is Int:
        	//value is String
        	print("문자열")
        case let num as Double
        	// let num = value as? Double 과 같은 뜻
            print("숫자")
        	...
    }
}