ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 저장 프로퍼티
    swift 2020. 3. 16. 23:22

     

    프로퍼티란? 

    -> 클래스, 구조체 또는 열거형 등에 관련된 값을 칭함.

     

    프로퍼티의 종류 

    -> 저장 프로퍼티

    -> 연산 프로퍼티

    -> 타입 프로퍼티

     

     

    오늘은 저장 프로퍼티에 대해서 알아보겠습니다. 

     

    저장 프로퍼티는 인스턴스 변수 또는 상수를 의미 (클래스,구조체서만!!)

     

     

    저장 프로퍼티

    -> 클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념 

    -> var : 변수 저장 프로퍼티

    -> let : 상수 저장 프로퍼티

     

     

    struct Student {

       var name : String

       var school : String

    }

    let from_yagom : Student = Student(name : "john",school : "edgehill uni")

     

     

    Class User{

       var name: String

       var id: String

       var pw : String

       let sex : String <-저장 프로퍼티(상수)

       var st_user : Student

     

       init(name : String, id : String, pw : String, sex : String, st_user : Student)

       {

            self.name = name

            self.id = id

            self.pw = pw

            self.sex = sex

            self.st_user = st_user

        }

    }

     

    -> 초기화 및 기본값을 설정할 수 있음

    -> 구조체는 프로퍼티에 맞는 이니셜라이저를 자동으로 제공해주지만, 

    -> 클래스는 그렇지 않음, 그러나 클래스 저장 프로퍼티를 생성시 초기값을 정해주면 

    -> 따로 사용자 정의 이니셜라이저를 해줄 필요가 없음

     

     

     

    Class User{

       var name: String = "from_yagom"

       var id: String = "from_yagom"

       var pw : String = "from_yagom"

       let sex : String = "from_yagom"}

     

     var user : User = User()

    -> 초기값을  정한다면 사용자가 인스턴스를 만드는 과정이 한결 수월해질 것이다.

     

    그러나 

     

    초기값을 설정하여 인스턴스를 간편히 생성할 수 있지만 이럴 때 야기되는 문제가 몇몇 있습니다.

     

    문제는 

    -> 인스턴스를 생성하고 인스턴스의 사용 가능성, 값 할당의 불편성 , 상수의 값 변경 X 이러한 문제점이 발생할 수 있습니다. 

     

    이럴 경우, 

     

    Class User{

       var name: String? = "from_yagom"

       var id: String = "from_yagom"

       var pw : String? = "from_yagom"

       let sex : String = "from_yagom"}

     

      변수의 자료형에 ?을 붙여 줌으로써 현재 값이 있어도 그만, 없어도 그만인 프로퍼티로 설정 됩니다. 

     

     

    "인스턴스를 생성할 때 이니셜라이저를 통해 초깃값을 정하는 이유는 프로퍼티가 옵셔널이 아닌 값으로 선언되어 있기 때문이다."

     

     

    var user : User = User(id : String) 

    -> 옵셔널이 아닌 id 프로퍼티만 작성해주면 됩니다. 

     

     

    옵셔널과는 조금 다른 용도인, 지연 저장 프로퍼티가 있습니다. 

    지연 저장 프로퍼티는 필요할 때 값이 할당된는 것 입니다. 

     

    이때 lazy 키워드를 사용합니다. 

     

    지연 저장 프로퍼티는 복잡한 클래스, 구조체에서 많이 사용됩니다. 

    클래스 인스턴스의 저장 프로퍼티로 다른 클래스 인스턴스나 구조체 인스턴스를 할당할 때가 있습니다, 

    이럴 때, 인스턴스를 초기화 하면서 해당 클래스의 인스턴스, 구조체의 인스턴스를 한번에 다 가져올 필요는 없다고 생각 합니다. 

    굳이 가져와서 모든 저장 프로퍼티를 사용하여 성능저하나 공간 낭비를 야기실킬 수 있으니까요..

     

    이럴 때 lazy라는 키워드를 사용한다고 합니다. 

     

     

    struct CoordinatePoint

    {

       var x : Int = 0

       var y : Int = 0

    }

     

     Class Position

    {

       lazy var point : CoordinatePoint = CoordinatePoint()

       let name : String

     

       init(name : String)

    {

       self.name = name

    }

    }

     

    let yagomPosition : Position = Position(name : "yagom")

     

    ->  yagonPosition 인스턴스를 통해 point에 접근 할 때 그 때 point 프로퍼티의 CoordinatePoint가 생성됩니다. 

     

     

    다음에는 연산 프로퍼티를 공부해 찾아오겠습니다. 

     

     

     

     

    이 글의 출처는 야곰의 스위프트 프로그래밍이며, 이 책을 읽으며 공부하고 기록하기 위해서 오늘도 글을 남깁니다...

     

     

     

     

     

     

     

Designed by Tistory.