Language/Swift

swift class type casting, init

jaewpark 2022. 8. 24. 11:20

클래스에는 상속이라고 해서 부모 클래스, 자식클래스 (기본 클래스, 파생 클래스 등 부르는 이름이 여러 개 입니다)를 이용해서 클래스의 특성들을 물려받을 수 있습니다.

class Animal {
  var age: Int = 0

  func glowOld() {
    self.age += 1
  }
}

class Cat: Animal {
  var type: String = mixed
  
  func getInTheBox() {
    print("\(type) cat get in the box")
  }
}

let nabi: Animal = Cat()

위 코드를 보게 되면 Cat은 Animal에 포함되기 때문에 Animal 타입의 상수에 할당할 수 있습니다.

반대로 Animal이라면 Cat 자식 클래스의 타입변수나 상수에 할당할 수 없습니다.

 

var white:Cat = Aniaml()  // X

 

Up Castring

  • 하위 클래스 타입을 상위 클래스 타입으로 변환할 때
  • 캐스팅하기 전 타입이 하위 클래스, 캐스팅한 후 타입이 상위 클래스일 때
  • 캐스팅한 결과, 캐스팅하기 전 타입보다 추상화될 때
  • 일반적으로 캐스팅 과정에서 오류가 발생할 가능성이 없음
객체 as 변환할 타입

let anyCat: Cat = Cat()
let anyAnimal = anyCat as Aniaml

 

Down Casting

  • 상위 클래스 타입을 하위 클래스 타입으로 캐스팅할 때
  • 캐스팅하기 전 타입이 상위 클래스, 캐스팅한 후 타입이 하위 클래스일 때
  • 캐스팅한 결과, 캐스팅하기 전 타입보다 구체화될 때
  • 캐스팅 과정에서 오류가 발생할 가능성이 있음
  • 오류에 대한 처리 방식에 따라 옵셔널 캐스팅과 강제 캐스팅으로 나누어짐
객체 as? 변환할타입 // Optional 타입
객체 as! 변환할타입 // Normal 타입

let anyYoungCat = anyAnimal as? Cat
if anyYoungCat != nil {
  print("success")
}

 

AnyObject

모든 종류의 클래스 타입을 저장할 수 있습니다.

var list = [AnyObject]()
list.append(Cat())
lest.append(Animal())

 


 

init 초기화 메소드

init(<매개변수>: <타입> ...) {
  // 1. 매개변수의 초기화
  // 2. 인스턴스 생성 시 처리할 내용
}

class Table {
  var height: Double
  
  init() { self.height = 0.0 }
  init(height: Double) {
    self.height = height
    print("\(height) 높이의 테이블이 만들어졌습니다
  }
}