클래스
class 클래스 이름: 부모 클래스 {
    // 프로퍼티
    // 인스턴스 메서드
    //타입 메서드(클래스 메서드)
}
// 프로퍼티 부분은 클래스 내에 포함되는 변수와 상수를 정의한다.
// 인스턴스 메서드는 객체가 호출하는 메서드를 정의한다.
// 타입 메서드는 클래스가 호출하는 메서드를 정의한다.
- 클래스에 property 추가하기
 
- 프로퍼티는 초기값이 있어야 한다.
혹은 init을 이용해 초기화 하거나 옵셔널 변수(상수)로 선언해야한다. 
 
- 프로퍼티의 종류는 저장 프로퍼티와 계산 프로퍼티가 있다.
 
class Hi{
    var hi : Int    // 변수 hi는 저장 프로퍼티이다.
}
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){                                // 인스턴스 메서드 선언
        print("value = \(value), twice= \(twice)")
    }
    class func classMethod(){ 		       	   // 타입 메서드(클래스 메서드) 선언
        print("클래스 메서드")
    }
    static func staticClassMethod(){               // 타입 메서드(스태틱 메서드 선언
        print("스태틱 클래스 메서드")
    }
}
var yoo : Twice = Twice()    
// yoo라는 인스턴스 생성, 클래스명 다음의 괄호엔 
// 눈에 보이지 않는 default initializer를 나타낸다.
yoo.display()                // value = 2, twice= 2.0
print(yoo.value)             // 2
Twice.classMethod()          // 클래스 메서드
Twice.staticClassMethod()    // 스태틱 클래스 메서드
// 클래스 메서드와 스태틱 클래스 메서드는 새롭게 생성한 yoo 인스턴스가 아닌 클래스 Twice로 동작 할 수있다.
- 타입 메서드는 인스턴스 메서드와 같은 방법으로 선언 하지만 앞에 class나 static을 붙여서 선언한다.
 
- 클래스 메서드는 자식 클래스에서 override가 가능하다.
 
인스턴스 초기화 : init()
- init 메서드(생성자)의 구조
init() {
} 
designated initializer
모든 프로퍼티를 다 초기화시키는 생성자 
- 소멸자
 
- 인스턴스가 사라질 때 자동호출
-deinit{} 
 
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(yourValue : Int, yourTwice : Double){
        value = yourValue
        twice = yourTwice
// designated initializer
    }
}
// var yoo : Twice = Twice()    // 오류
var yoo : Twice = Twice(yourValue:10, yourTwice:20.1)
yoo.display()
self
- 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self.을 붙인다.
 
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value : Int, twice : Double){
        self.value = value
// init내에서만 사용하는 지역변수 value와 현재 클래스에서 사용하는 프로퍼티인 self.value
        self.twice = twice
// 생성자의 변수와 클래스 내의 프로퍼티와 이름이 같기 때문에 구분하기 위해서 반드시 self.을 사용해야한다.
    }
}
var yoo : Twice = Twice(value:10, twice:20.1)
yoo.display()
계산 프로퍼티
- 저장 프로퍼티를 이용해서 계산한 프로퍼티이다.
 
- setter가 없을 시
 
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    var man : Int {    // 계산 프로퍼티 선언
      //get{            setter가 없을 때엔 생략이 가능하다.
        return value+1
     // }
    }
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value : Int, twice : Double){
        self.value = value
        self.twice = twice
    }
}
var yoo : Twice = Twice(value:10, twice:20.1)
yoo.display()
print(yoo.man)    // 11
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    var man : Int {    // 계산 프로퍼티 선언
        get{            
        return value+1
        }
        set(manValue){
            value = manValue + 2
        }
    }
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value : Int, twice : Double){
        self.value = value
        self.twice = twice
    }
}
var yoo : Twice = Twice(value:10, twice:20.1)
yoo.display()    // value = 10, twice= 20.1
print(yoo.man)   // 11                 getter호출
print(yoo.value) // 10
yoo.man = 3      //                    setter 호출
prinr(yoo.value) // 5
- setter가 있으면 get{}이 생략 불가능하다
 
- setter의 매개변수명이 기본으로 newValue 인데 만약 매개변수를 newValue로 사용한다면 (newValue)를 생략 할 수있다.
 
set{                      //set(newValue){  -> (newValue)생략가능
    value = newValue + 1
}
method overloading : 생성자 중첩
- 같은 이름의 메서드를 여러가지 생성할 수 있다.
 
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value : Int, twice : Double){
        self.value = value
        self.twice = twice
    }
    init(value : Int){
        self.value = value
    }
}
var yoo : Twice = Twice(value:10, twice:20.1)
var yoo2 : Twice = Twice(value:20)
yoo.display()    // value = 10, twice= 20.1
yoo2.display()    // value = 20, twice= 2.0