본문 바로가기

iOS 앱 개발자 프로젝트/Swift 문법 정복하기

[iOS] lazy var와 private let : 언제 쓰는 걸까?

Swift를 다루다 보면 변수를 설정할 때 var와 let을 자주 쓰게 되는데, 상황에 따라 lazy var와 private let이 필요할 때가 있어. 그럼 이 녀석들을 언제, 왜 써야 하는지 쉽게 풀어볼게. ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚


1. lazy var: 필요할 때만 게으르게!

먼저 lazy var부터 살펴보자. 보통 var는 선언하자마자 값을 설정하지. 그런데, 만약 그 변수가 바로 필요하지 않고, 나중에 특정 상황에서만 사용된다면 어떨까? 바로 이럴 때 lazy var를 쓰는 거야.

 

 

 

"Simplicity is the soul of efficiency." 

코드가 간결할 때 효율적일 수 있다는 점을 기억하기!

 

 

 

lazy var는 변수가 처음부터 초기화되지 않고, 실제로 그 변수에 접근할 때 값을 할당해.

그래서!? 메모리와 성능을 아낄 수 있어!

 

class DataFetcher {
    lazy var data: [String] = {
        print("데이터를 가져오는 중...")
        return ["데이터1", "데이터2", "데이터3"]
    }()
}

let fetcher = DataFetcher()
// 아직 data가 초기화되지 않았어

print("앱 실행 중...")

// 여기서 처음으로 data에 접근하니까, 그때서야 데이터를 가져와
print(fetcher.data)

 

 

위 코드에서 data는 처음부터 데이터를 가져오지 않아. data에 처음 접근하는 시점에만 데이터를 가져오게 돼. 그래서 필요한 시점에만 리소스를 쓰게 하는 거지.

 

 

2. private let: 보호하고 싶은 비밀이 있을 때!

 

이제 private let을 살펴보자. let은 한 번 설정하면 값을 바꿀 수 없는 상수야. 그런데 여기에 private를 더하면, 이 상수는 클래스나 구조체 내부에서만 접근 가능해져. 외부에서 수정하거나 건드릴 수 없게 보호할 수 있는 거지.

 

private let을 언제 쓰느냐? 중요한 데이터를 외부에서 절대 바꾸지 못하게 하거나, 외부에서 보지 못하도록 하고 싶을 때야.

 

class SecureConfiguration {
    private let apiKey: String
    
    init(apiKey: String) {
        self.apiKey = apiKey
    }
    
    func getApiKey() -> String {
        return self.apiKey
    }
}

let config = SecureConfiguration(apiKey: "my-secret-key")
// 외부에서 apiKey에 접근하려고 하면 에러가 나
// print(config.apiKey) // 에러 발생

// 대신 내부 메소드를 통해서만 값을 가져올 수 있어
print("API Key: \(config.getApiKey())")

 

여기서 apiKey는 외부에서 접근이 차단된 중요한 정보야. private let 덕분에 외부에서 함부로 바꾸거나 접근할 수 없게 보호할 수 있어.

 

마지막으로 정리해 보자면,

  • lazy var: 변수가 필요할 때까지 초기화를 미루고 싶을 때 사용. 예를 들어, 복잡한 계산이 필요할 때만 실행되도록 할 때.
  • private let: 외부에서 접근할 수 없고, 변경할 수 없는 상수를 만들고 싶을 때 사용. 중요한 데이터를 보호해야 할 때.

  lazy var는 "효율성"을 위한 기능이고, private let은 "보안"이나 "안전성"을 위한 기능