iOS/문법

Swift 문법과 친해지기 - Type Casting 와 Any, AnyObject

HJ39 2023. 1. 4. 17:29

is

is 연산자는 타입을 확인하는 연산자로 반환 값은 Bool 타입이다.

 

□ 예시

class Human {}
class Teacher: Human {}
class Animal {}

let teacher: Teacher = .init()

teacher is Teacher	// true
teacher is Human	//true
teacher is Animal	//false

→ is는 영어 문법 같은 느낌인 것 같다.

→ 해당 변수의 타입이 is 뒤에 오는 타입인 경우 true, 아닌 경우 false를 반환한다.

 

as

as 는 어떤 해당 Type으로 변경시킬 수 있는 문법 표현식이다.

as를 사용하면 UpCasting, DownCasting을 사용하는데

 

UpCasting

업캐스팅은 예시를 들어서 살펴보면 조금 더 쉽게 이해할 수 있다.

업캐스팅은 컴파일시 실패하는 경우 에러가 발생한다.

 

□ 업캐스팅 예시

import UIKit

class Human {
    let name: String
    init(name: String){
        self.name = name
    }
}

class Teacher: Human { 
	let subject: String = "Math"
}
class Student: Human {
	let grade: String = "A+"
}

let people: [Human] = [
    Teacher.init(name: "김선생"),
    Student.init(name: "이제자"),
    Student.init(name: "수제자")
]

→ people이라는 배열은 Human 타입의 배열인데 Teacher과 Student타입의 인스턴스가 들어가 있다

이는 swift언어에서 업캐스팅을 허용해서 가능한 코드이다.

Student, Teacher이라는 타입을 사용했지만 컴파일을 할 때 컴파일러에서 Human으로 업.캐.스.팅 하여 people 배열에 저장한 것이다.

 

업캐스팅은 서브 클래스에서 슈퍼 클래스로 타입을 변경하는 것을 의미한다. 

 

□ 업캐스팅 단점 예시

let student1 = Student.init(name: "최제자") as Human	//Human으로 업캐스팅
student1.name	//접근 가능
student1.grade // 접근 불가, 오류 발생

→ 타입을 슈퍼 클래스로 변경을 시켜서 서브 클래스에 접근이 불가능해진다.

 

as를 사용하여 업캐스팅을 해도 되지만 직접적으로 언급하여 업캐스팅 해도 된다.

 

DownCasting

다운 캐스팅은 업캐스팅의 반대되는 개념이다.

슈퍼 클래스 인스턴스를 서브 클래스의 타입으로 참조시킨다.

다운 캐스팅은 실패 가능성도 있기에 as?, as!를 사용한다.

 

□ 다운 캐스팅 예시

var student2: Student = student1 as! Student	//student1의 Human타입을 Student 타입으로 다운캐스팅
student2.grade

→ as!를 사용하여 강제적으로 다운 캐스팅 하였다.

 

as? 런타임 시점에 다운 캐스팅을 하여 실패한 경우 nil 리턴
as! 런타입 시점에 다운캐스팅을 하여 실패한 경우 에러 발생

 


Any

모든 타입을 저장할 수 있게 하는 것이 Any타입이다.

진짜 아무 타입이나 저장할 수 있다.

 

□ Any 타입 예시

var everything: [Any] = []

everything.append(1)
everything.append(2.2)
everything.append("hi~")
everything.append(Human.init(name: "제자")))

 

AnyObject

모든 클래스 타입을 저장하는 타입이다.

Any에서 조금 더 구체화되어 클래스 타입만! 저장이 가능하다.

 

□ AnyObject 예시

var everything: [AnyObject] = []

everything.append(1)	//에러
everything.append(2.2)	//에러
everything.append("hi~")	//에러
everything.append(Human.init(name: "제자")))

 

Any, AnyObject 타입은 잘 사용하면 유용하지만 타입에 예민한 swift에서 사용하기 까다로워서 조심해서 사용해야 한다.

 

# 참고한 사이트

  1. https://babbab2.tistory.com/128