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("숫자")
...
}
}
'iOS' 카테고리의 다른 글
Git에서 .DS_Store와 .xcodeproj 파일 무시하기 (4) | 2024.11.07 |
---|---|
[복습] Part 14. 확장 (0) | 2024.09.14 |
Swift 입력 받기 (0) | 2024.09.08 |
속성과 메서드를 붕어빵으로 아라보자 (0) | 2024.08.06 |
[앨런 Swift문법 마스터 스쿨] 3주차 시험 오답 노트 (0) | 2024.08.05 |