1. Any, 타입 체크(is)
  2. as, as?, as!
  3. 접근 제한자

Any와 타입 체크

  • 변수/상수: 선언할 때 타입 확정
  • 다른 타입의 값 대입 금지
  • Any, AnyObject
    • 가변 타입
    • Any: 모든 타입
    • AnyObjct: 모든 레퍼런스 타입

Any

  • 타입에 대한 정보가 없음
  • 타입별 메소드, 프로퍼티 사용불가
  • 타입 체크, 타입 캐스팅이 필요합니다
  • 타입 정보 얻기 = type(of:)
  • Any는 모든타입이라고 하지만, nil 을 대입하려면 Any? 로 선언해서 대입 해야함

타입 체크

  • 타입체크 키워드 is
var anyVar: Any = 3
if anyVar is Int { 
	print("정수 타입")
}
  • 예시
class Animal {}
class Dog : Animal {} 
class Cat : Animal {}

let raz: Animal = Cat("고양이")
raz is Cat // true 
raz is Animal  // true 
raz is Dog // false

타입 변환

  • 타입변환 키워드 as
    • as: 타입변환이 확실한 경우
      • 상속관계에 있을 경우
      • 업 캐스팅일 경우
    • as?: 타입 변환 실패시 nil 반환, 옵셔널
    • as!: 강제 타입 변환, 변환 실패시 앱 크러쉬
  • 예시
* 옵셔널 바인딩을 통해서도 사용함 
if let intVal3 = anyVal as? Int { 
	print("변환 성공")
}

* 업캐스팅 -> 항상 성공 
let raz = Cat()
let animal = raz as Animal

-- Animal
----Cat
----Dog

* 다운캐스팅 실패 가능성 있음.
let obj : Animal = Dog()
let doggy1 = obj as Dog // 컴파일 에러
let doggy2 = obj as? Dog // 변환 성공, 옵셔널 타입
let doggy3 = obj as! Dog // 변환 성공, Non-Optional Type
  • 프로토콜과 as
protocol Sing {} 
struct Bird : Sing {}

let sparrow : Any = Bird() 
// 프로토콜의 타입을 확인
sparrow is Sing

// 프로토콜로 타입 변환 
let singing = sparrow as? Sing

접근 제한자

  • open: 다른 모듈 접근 가능, 다른 모듈에서 상속 가능
  • public: 다른 모듈 접근 가능, 다른 모듈에서 상속 불가, 같은 모듈 상속 가능
  • internal: 같은 모듈내에서만 접근 가능, 기본값
  • fileprivate: 같은 소스 파일에서만 접근 가능
  • private: 정의된 블록 내에서만 접근가능

  • 모듈: 프로젝트를 만들면, 하나의 모듈로 묶임, 다른 라이브러리나, 다른 프레임 워크들은, 현재 모듈과 다른 모듈입니다.

  • 접근 조절 단위
    • 타입
    • 메소드
    • 프로퍼티
    • 상위에 대한 접근 레벨을 넘어설수는 없음: Class 는 internal로 만들었는데, 내부의 메소드나, 프로퍼티들은 open, public 으로 만들수는 없음.