Class 와 Struct#
모든 언어의 class 와 struct 정의는 거이 비슷하다. swift 내에서의 class, struct 의 특성 및 사용가이드를 정의해보고자 한다.
Class 특성#
- Reference Type
 - ARC로 메모리 관리
 - 상속 가능
 - 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
 - 인스턴스가 소멸될때 deinit 메서드가 호출된다. (참조타입이니까)
 - 참조 비교 연산자 사용가능( 
===,!==) 
Struct 특성#
- Value Type
 - 상속이 가능하지 않다
 - 여러 인스턴스를 만들고 값을 변경해도 , 각 인스턴스의 값은 다르다. (값 타입이니까;)
 
차이점#
- 구조체는 상속할 수 없다.
 - 타입캐스팅은 클래스의 인스턴스에만 허용된다.
 - deinit은 클래스의 인스턴스에서만 호출된다.
 - 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.
 - 구조체는 생성자를 구현하지 않아도 default initalizer 를 사용할 수 있다.
 - 구조체 내부에 구조체, 클래스 내부에 클래스 등 중첩타입의 정의 및 선언이 가능하다.
 - 반면에 구조체는 init은 사용 가능하다 deinit은 사용 불가능하다.
 - Swift 표준 라이브러리의 기본 타입은 모두 구조체이다.(String, Bool, Int, Array, Dictionary, Set)
 
초기화 예제#
convenience init, required init 란 무엇이냐? 이 키워드의 쓰임새는 무엇인가 상황별 예제
Class
init convenience init required init
class Person {
    var name: String
    var age: Int
    init(name: name, age: age){
        self.name = name
        self.age = age
    }
    convenience init(name: name){
        self.init(name: name, age: 27) // 지정 이니셜라이저 호출
    }
}
let aiden = Person(name: "Aiden")// Person(name: "Aiden", age: 27)
//==========================================================================
// convenience init을 사용하고 싶지 않다면 프로퍼티에 초기값을 할당해줘도 된다.
class Person {
    var name: String
    var age: Int = 27
    init(name: name){
        self.name = name
    }
}
let aiden = Person(name: "Aiden")// Person(name: "Aiden", age: 27)
class SomeClass {
    required init() {
        // 이 곳에 이니셜라이저 구현 작성하기
    }
}
class SomeSubclass: SomeClass {
    required init() {
        // 이 곳에 자식 클래스의 필수 이니셜라이저 구현 작성하기
    }
}
class Shape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
    self.name = name
    }
}
class Square: Shape {
    var sideLength: Double = 0.0
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength // 1. 자식 클래스의 속성에 값 할당
        super.init(name: name) // 부모 클래스의 이니셜라이저 호출
        numberOfSides = 4 // 부모 클래스가 정의한 속성 값 변경
    }
}
Struct
nil 을 허용하는 형태의 var 만이 초기화시 자동 nil 할당.
struct People {
    var weight: Double?
    var footSize: Int
    init(footSize: Int) {
        self.footSize = footSize
    }
}
var stark = People(footSize: 270)
print(stark) // People(weight: nil, footSize: 270)
stark.weight = 82.9
print(stark) // People(weight: Optional(82.9), footSize: 270)
struct People {
    let footSize: Int
    init(footSize: Int) {
        self.footSize = footSize
    }
}
let leedsStark = People(footSize: 270)
print(leedsStark) // People(footSize: 270)