Swift3(스위프트3)

swift3 스위프트3 인스턴스의 생성, 인스턴스 소멸

알통몬_ 2017. 7. 7. 15:20
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


이번 포스팅에서는 swift3 인스턴스의 생성과 인스턴스의 소멸에 대해서 공부합니다.


 스위프트에서 모든 인스턴스는 초기화를 하는 동시에 모든 프로퍼티에 유효한 값이 할당되어야 하는데요.


프로퍼티에 미리 기본 값을 할당해두면 인스턴스가 생성되면서 동시에 초기 값을 지니게 돼요.


예제 코드)

   class Poketmon {

      var name : String = "알려지지 않음"

      var age : Int = 0

   } // 만약 기본값을 할당해주지 않는다면 오류가 발생합니다.

   let altongmon : Poketmon = Poketmon()

   altongmon.name = "알통몬"

   altongmon.age = 26


그렇다면 꼭 저렇게 미리 값을 정해두어야 할까요?

아닙니다.


바로 이니셜라이저라는 걸 사용하면 되는데요. 자바에서 생성자와 같은 역할을 합니다.

인스턴스 생성 시에 초기 값을 설정해주는 거죠. 


class Poketmon {

   var name : String

   var age : Int

   

   init( name : String, age : Int )

      //자바에서 this 가 여기서는 self입니다

      self.name = name

      self.age = age

   }

}

let altongmon : Poketmon : Poketmon( name : "알통몬", age : 26)

* 만약에 프로퍼티 초기 값이 꼭 필요한 경우가 아니라면 프로퍼티를 

옵셔널 타입으로 사용하면 됩니다.

예를 들어 진화 여부를 초기 값으로 준다고 할 때 진화를 하는 포켓몬이 있는 반면에

진화를 하지 않는 포켓몬도 있을 수 있습니다.


class Poketmon {

   var name : String

   var age : Int

   var isEvolution : Bool?


  // 진화를 하지 않는 포켓몬을 위한 이니셜라이저

   init( name : String, age : Int ) {

      self.name = name

      self.age = age

   }

   

  // 진화를 하는 포켓몬을 위한 이니셜라이저

   init ( name : String, age : Int, isEvolution : Bool) {

      self.name = name

      self.age = age

      self.isEvolution = isEvolution

   }

그리고 위 init 과 아래 init 에서 name 과 age 가 중복되죠? 이런 경우 init 안에서 init을 호출할 수 있습니다.

이런 경우에는 init 앞에 convenience 키워드를 붙여주면 됩니다.

   convenience init ( name : String, age : Int, isEvolution : Bool ) {

      self.init( name : name, age : age )

      self.isEvolution = isEvolution

   }

  처럼 사용할 수도 있습니다. 각자 편한 방법을 사용하시면 될 것 같네요.


let poketmon1 : Poketmon = Poketmon("포켓몬1", 10)

let poketmon2 : Poketmon = Poketmon("포켓몬2", 11, true)


암시적 옵서널 추출 :

인스턴스를 사용하는데 꼭 필요하지만, 처음에 초기 값을 할당하고 싶지 않을 경우에 사용할 수 있습니다.

예를 들어 포켓몬 중 이브이의 경우 진화는 하지만 경우에 따라 샤미드, 쥬피썬더, 부스터 세 종류로 진화를 하죠. 이럴 경우 조건이 필요한 경우에 어떤 포켓몬으로 진화를 할지 설정을 해주는 겁니다.


예제)

   class Poketmon {

      var name : String

      var evolution : String!


      init ( name : String ) {

         self.name = name

      }

      

      func evolutionFunc () {

         print("\(name) 이(가) \(evolution)(으)로 진화합니다")

      }

   }


let eevee : Poketmon = Poketmon("이브이")

eevee.evolutionFunc() // evolution 에 초기 값이 할당되어 있지 않아서 오류가 발생합니다.

eevee.evolution = "샤미드"

eevee.evolutionFunc() // 이브이이(가) 샤미드(으)로 진화합니다



실패 가능한 이니셜라이저 :

 이니셜라이저의 매개 변수로 전달되는 초기 값이 잘못되었을 경우 인스턴스 생성에 실패할 수가 있는데요.

인스턴스 생성에 실패할 경우 nil 을 리턴합니다.

때문에 실패 가능한 이니셜라이저의 반환타입은 Optional을 사용합니다.


class Poketmon {

   var name : String

   var age : Int

   

   init?( name : String, age : Int ) {

     if name.character.count == 0 {

        return nil

     }

     self.name = name

     self.age = age

   }

}


// let altongmon : Poketmon = Poketmon("", 10) // 반환타입이 옵셔널이 아니기 때문에 오류 발생

let altong : Poketmon? = Poketmon("알통몬", 10)

let altong2 : poketmon? = Poketmon("", 10) // name 값이 없으므로 nil 반환


마지막으로 디이니셜라이저입니다.

 : 클래스의 인스턴스가 메모리에서 해제되는 시점에서 호출이 되고,

   {} 블록에 인스턴스가 메모리에서 해제되는 시점에 해야할 일을 구현하면 됩니다.


class Poketmon {

    var name : String


    init( name : String) {

      self.name = name

    }

    deinit {

      print("지금까지 포켓몬스터를 사랑해주셔서 감사합니다")

    }

}


let season1 : Poketmon = Poketmon("시즌1")

season1 = nil

// 지금까지 포켓몬스터를 사랑해주셔서 감사합니다

가 호출됩니다.


이상입니다.


다음 포스팅에서는 옵셔널 체이닝에 대해 공부합니다.

반응형