본문 바로가기

Tech/iOS

[iOS] Day 18 - Property

728x90

문법 용어가 다 비슷비슷한 것 같다

집중해서 이해하고 사용하도록 하자


ProPerty

저장 / 연산 프로퍼티가 있지만 이 포스팅에서는 저장 프로퍼티에 대해서 포스팅하려 한다

 

저장 프로퍼티

struct의 경우 

struct DrinkStruct {
    let name: String
    var count: Int
    var size: DrinkSize
}

let drinkClass = DrinkClass(name: "스무디", count: 2, size: .venti)

초기화를 하지 않아도 initializer를 자동 생성해준다

 

class 의 경우 

init이 필수이기 때문에 struct과 다르기 때문에 

선언과 동시에 초기화를 하거나 옵셔널로 선언하여 nil로 초기화 해주어야한다


Lazy 

웬지 닉값할 것 같다   지연저장 프로퍼티이다

저장 프로퍼티가 초기화 되는 시점을 지연시켜준다

??? 즉 필요한 경우에만 사용되는 프로퍼티이다

 

항상 var로 선언해주어야 한다

-> let은 instance가 생성되기 전에 초기화 하기 때문에 저장 프로퍼티가 초기화 되는 시점에 할당되는 lazy에서는 쓸수가 없다

-> let은 instance가 생성되기 전에 항상 값을 가지고 있어야한다

 

lazy는 메모리에 올라가지 않기 때문에 nil로 있다가 호출되서 사용하기 시작하면 nil이 아님 

struct MediaInfo {
    var mediaTitle: String
    var mediaRuntime: Int
    //아직 공간 차지 하지 않음
    //언제 실행됨? -> 필요한 시점에 사용을 할 때 실행됨
    // 저장 프로퍼티인데 저장시점을 늦춤
    //뭔가 옵션적인 상황이 있거나 초반에 초기화하기 부담 스러울 때 사용자가 필요로 할 때 메모리에 올려줌
    //lazy는 let 불가
    // let 값 안바뀐다 상수는 인스턴스가 생성되기 전에 값을 항상 가지고 있어야 한다
    // 지연저장 프로퍼티는 메모리에 올라가지 않기 때문에 Nil
    // 지연 저장 프로퍼티가 처음으로 호출 되서 사용되기 전에는 값 Nil
    lazy var mediaPoster: Poster = Poster()
}

var media = MediaInfo(mediaTitle: "오징어게임", mediaRuntime: 123)

media.mediaPoster

잘 보면 media에서 mediaPoser가 초기화 되지 않고 media.mediaPoster에서 호출시 초기화


type

타입 자체에 속하는 Property

instance property는 instance 마다 값을 가질  수 있다

typeProperty는 타입자체에 속해서 instance 필요없다

언제 초기화 될까? -> 써야하는 순간에 메모리에 올라간다 

한번 올라가면 앱 실행 내내 메모리에서 사라지지 않는다

항상 선언할 때 초기값을 무조건 넣어줘야한다

 vs instance property -> 생성시에 메모리에 올라갔다가 사라진다

class User {
    var nickname = "고래밥" // 닉네임 메모리가 올라가있고 값은 고래밥 => 저장 프로퍼티(상수 저장프로퍼티/변수 저장 프로퍼티), 인스턴스 프로퍼티
    static var staticNicknmae = "고래밥"
    //인스턴스를 통해서는 접근하지 못함
    //메모리 한군데에서 저장해도 됨 메모리 공간 차지 x 타입 그자체로 여긴다
    // 닉네임이라는 공간에 고래밥 저장 똑같은 저장 프로퍼티지만 인스턴스를 만들어서 저장하는게 아니라 인스턴스를 만들지 않고 타입을 가지고 있는 요소라 생각하자 -> 타입 프로퍼티
    // static 언제 초기화됨? -> 써야하는 순간에 메모리에 올라간다
    // 인스턴스를 생성한다고 해서 초기화 되지 않고 사용할 때 초기화 된다
    // 한번 올라가면 메모리에서 사라지지 않음 앱이 실행 내내
    // 타입 프로퍼티 초기값? 선언할 때 초기값을 무조건 넣어줘야한다
    // vs 인스턴스 프로퍼티는 인스턴스 생성할때 메모리에 올라왔다 사라짐
    
    
}

// user라는 인스턴스 생성하고 user클래스 초기화
let user = User()
user.nickname //

instance property는 User를 초기화 한 후 사용하지만 

타입 프로퍼티인 staticNickname은 타입안에 저장되어 있으므로

User.staticNickname으로 사용된다

'Tech > iOS' 카테고리의 다른 글

[iOS] Day 19 - 첫 화면 구현  (0) 2022.07.22
[iOS] Day 19 - 데이터 전달  (0) 2022.07.22
[iOS] Day - 18 화면 전환 코드 구현  (0) 2022.07.21
[iOS] Day 17 - CollectionView  (0) 2022.07.20
[iOS] Day 16 - TableView(2)  (0) 2022.07.19