Swift 객체 초기화

  1. 객체 초기화 : 모든 객체는 사용하기 전에 반드시 클래스 내부에서 사용하는 값에 대한 초기화를 해야한다.
    1. 프로퍼티 초기화
      1. 자동 초기화
        1. 옵셔널 타입을 이용한 프로퍼티 초기화 : var optionalValue : Int?
        2. 초기값이 있는 프로퍼티 초기화 : var initalValue : Int = 0
      2. 수동 초기화
        1. 옵셔널 타입이 아니고 초기값이 없는 프로퍼티 : var manualInitValue : Int
        2. 객체 초기화 코드인 Initializer(init 메소드)를 작성하여 프로퍼티를 초기화한다.
          Initializer를 이용한 초기화
          class Rectangle {
             var width : Int
             var height : Int
              // init 메소드에 초기화 진행
              override init() {
                  width = 0
                   height = 0
              } 
          }

          // Initializer 형태에 맞게 객체 생성
          let rect = Rectangle()
      3. Initializer : 수동 초기화에서 보았듯이 초기화가 필요한 프로퍼티를 초기화하며 init 메소드를 이용한다.
        1. Initializer 종류
          1. Designated Initializer
            • 객체 초기화를 단독으로 완료 가능
            • 모든 초기화가 필요한 프로퍼티 초기화
            • 클래스 내에서 반드시 1개 이상 필요
            • 사용 방법
              Designaged Initializer 사용법
              // 모든 값을 초기화
              class Rectangle {
                 var width : Int
                 var height : Int
                  // init 함수에 초기화 진행
                  // Designated Initializer 1
                  override init() {
                      width = 0
                       height = 0
                  }
                  // Designated Initializer 2
                  init(width : Int, height : Int) {
                      self.width = width
                      self.height = height
                  }
              }

              // Initializer 형태에 맞게 객체 생성
              // Designated Initializer 1 로 객체 생성
              let rect1 = Rectangle()
              // Designated Initializer 2 로 객체 생성
              let rect2 = Rectangle(width : 10, height : 20)
          2. Convenience Initializer
            • 단독으로 초기화 불가능
            • 일부 프로퍼티만 초기화
            • 다른 Initializer(Designated Initializer)를 이용해서 초기화
            • 중복 코드 방지
            • 사용 방법
              Convenience Initializer 사용법
              class Rectangle {
                 var width : Int
                 var height : Int
                  // Designated Initializer 1
                  override init() {
                      width = 0
                       height = 0
                  }
                  // Designated Initializer 2
                  init(width : Int, height : Int) {
                      self.width = width
                      self.height = height
                  }
                  // Convenience Initializer
                  init(height : Int) {
                     self.init() // Designated Initializer 1 반드시 필요
                     self.height = height
                  }
              }

              // Initializer 형태에 맞게 객체 생성
              // Designated Initializer 1 로 객체 생성
              let rect1 = Rectangle()
              // Designated Initializer 2 로 객체 생성
              let rect2 = Rectangle(width : 10, height : 30)

              // Convenience Initializer 로 객체 생성
              var rect3 = Rectangle(height : 20)
      4. Failable Initializer : 객체 생성 시 초기화 실패 시에 nil로 처리하는 방법이다.
        1. 작성 방법은 Initializer와 동일하고, 오류 상황에 대한 조건을 확인하여 nil로 반환해준다.
          1. 옵셔널 타입을 이용하여 Initializer 작성
            옵셔널 타입을 이용하여 Initializer 작성
            class Rectangle {
               var width : Int
               var height : Int
                // Designated Initializer 1
                override init() {
                    width = 0
                     height = 0
                }
                // Designated Initializer 2
                init?(width : Int, height : Int) {
                    // Failable Initializer 작성
                    guard(width > 0 && height >0 ) else {
                        return nil
                    }
                    self.width = width
                    self.height = height
                }
            }

            // Initializer 형태에 맞게 객체 생성
            // Designated Initializer 2 로 객체 생성
            var rect1 = Rectangle(width : 10, height : 30)
            // 정상 실행
            var rect2 = Rectangle(width : -19, height : 30) // nil 반환
          2. 강제 언래핑을 이용하여 Initializer 작성
            Convenience Initializer 사용법
            class Rectangle {
               var width : Int
               var height : Int
                // Designated Initializer 1
                override init() {
                    width = 0
                     height = 0
                }
                // Designated Initializer 2
                init!(width : Int, height : Int) {
                    // Failable Initializer 작성
                    guard(width > 0 && height >0 ) else {
                        return nil
                    }
                    self.width = width
                    self.height = height
                }
            }

            // Initializer 형태에 맞게 객체 생성
            // Designated Initializer 2 로 객체 생성
            var rect1 : Rectangle! = Rectangle(width : 10, height : 30)!
            // 정상 실행
            var rect2 : Rectangle! = Rectangle(width : -10, height : 30)! // nil이 반환되므로 런타임 에러 발생
  2. 객체 해제 : 객체가 메모리에서 해제되는 것을 의미한다.
    1. 객체 해제 시에 deinit 메소드가 호출된다.
    2. deinit 메소드는 파라미터, 리턴 타입이 없다.
    3. deinit 메소드에 객체가 해제 되면서 동작할 코드를 작성한다.
    4. 사용 방법
      deinit 메소드 사용법
      class Rectangle {
         var width : Int
         var height : Int
          // 객체 초기화
          override init() {
              width = 0
               height = 0
          }
          // 객체 해제 시 호출
          deinit {
               // 객체 해제 시 동작할 코드 작성
          }
      }

      // Initializer 형태에 맞게 객체 생성
      /* 객체 해제 시 nil 값을 넣어야 하므로 옵셔널 타입 또는 암시적 언래핑으로 호출*/
      var rect1 : Rectangle? = Rectangle() // 옵셔널 타입
      var rect2 : Rectangle! = Rectangle() // 암시적 언래핑
      // 객체 해제되면서 deinit 메소드를 호출
      rect1 = nil
      rect2 = nil
      // 위와 같이 객체 해제하려면 반드시 옵셔널 타입이나 암시적 언래핑으로 호출