์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ Swift ] ํ”„๋กœํผํ‹ฐ(Property) / NetworkManager์™€ shared

๐ŸŽ iOS/Swift

by AHN.Jihyeon 2024. 8. 24. 10:07

๋ณธ๋ฌธ

์ธ์Šคํ„ด์Šค ๋˜๋Š” ํƒ€์ž…์˜ ๋ถ€๋ถ„์ธ ์ €์žฅ๋œ ๊ฐ’๊ณผ ๊ณ„์‚ฐ๋œ ๊ฐ’์— ์ ‘๊ทผํ•œ๋‹ค. 

ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์—์„œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์— ๋Œ€ํ•œ ์ €์žฅ์—ฌ๋ถ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ €์žฅํ”„๋กœํผํ‹ฐ์™€ ๊ณ„์‚ฐํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. 

 

- ํ”„๋กœํผํ‹ฐ์˜ ์œ„์น˜

: ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์—, ๋ฉ”์„œ๋“œ์˜ ์™ธ๋ถ€์— ์ •์˜ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ๋ณ€์ˆ˜. 

 

 

1. ์ €์žฅํ”„๋กœํผํ‹ฐ 

์ƒ์ˆ˜ ๋ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ €์žฅ๋œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• . 

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ๋Š” ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์—ด๊ฑฐํ˜•์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

 

 

 

1-1. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ(lazy)

lazy ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์„ ์–ธ๋งŒ ๋  ๋ฟ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”๋œ๋‹ค. 

์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๋ฉฐ, ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ํ˜ธ์ถœ ๋  ๋•Œ๋Š” ์ฒ˜์Œ ์ดˆ๊ธฐ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์‹œ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

 1-2. ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ์ €์žฅํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”

์•„๋ž˜๋Š” UI ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋งŽ์ด ๋ดค๋˜ ํ˜•์‹์˜ ์ฝ”๋“œ๋‹ค.

๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„ ์ด๋ ‡๊ฒŒ ์ž‘์—…์„ ํ–ˆ๋Š”๋ฐ, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐํ™”๋Š” lazy ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

self๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ ๋„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค. 

 

lazy์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ตœ์ดˆ ํ•œ๋ฒˆ๋งŒ ๋กœ์ง์ด ์‹คํ–‰๋˜๋ฉฐ ์ฐธ์กฐ๋˜๋Š” ์‹œ์ ์— ๋งž์ถฐ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ถ€๋ถ„์—์„œ ํšจ์œจ์ ์ด๋‹ค.

  

์œ„์™€ ๊ฐ™์ด ์ •์˜๋œ ํด๋กœ์ € ๊ตฌ๋ฌธ์€ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด(SearchView)์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•จ๊ป˜ ์‹คํ–‰๋˜์–ด

์ดˆ๊ธฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ดํ›„ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ๋Š” ์žฌ์‹คํ–‰ ๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์€ ๋ช‡์„ ๋‹ค์‹œ ์ฐธ์กฐํ•ด๋„ ์žฌํ‰๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. 

(์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ฐธ์กฐ๋  ๋•Œ๋งˆ๋‹ค ์žฌํ‰๊ฐ€๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜)

 

 

 

 

 

 

2. ์—ฐ์‚ฐํ”„๋กœํผํ‹ฐ

๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค. 

์ด๋•Œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์ด get ๊ตฌ๋ฌธ์ด๊ณ  return ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ’ ๋ฐ˜ํ™˜.

get, set ๊ตฌ๋ฌธ์ด ์žˆ๋Š”๋ฐ get ๊ตฌ๋ฌธ์€ ํ•„์ˆ˜์ด๊ณ  get ๊ตฌ๋ฌธ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.

 

ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ ๊ฐ€๋Šฅ

 

var ํ”„๋กœํผํ‹ฐ๋ช…: ํƒ€์ž… {

   get {

        //์—ฐ์‚ฐ๊ณผ์ •

        return ๋ฐ˜ํ™˜ ๊ฐ’

    }

    set(๋งค๊ฐœ๋ณ€์ˆ˜๋ช…) {

       //์—ฐ์‚ฐ ๊ตฌ๋ฌธ

    }

}

์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋Š” get๋ธ”๋ก ์ƒ๋žต ๊ฐ€๋Šฅ

์—ฐ์‚ฐํ”„๋กœํผํ‹ฐ๋Š” ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์— ์˜์กด์ ์ด๊ฑฐ๋‚˜, ํŠน์ • ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํฌ์ผ“๋ชฌ ๋„๊ฐ ์•ฑ ๋งŒ๋“ค๊ธฐ ๊ณผ์ œ ์ค‘์—์„œ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์˜ฌ ๋•Œ 

id๊ฐ€ ํ•„์š”ํ•œ๋ฐ id๊ฐ’์ด ํ•จ๊ป˜ ๋‚ด๋ ค ์˜ค์ง€ ์•Š์•„์„œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค.

์ด๋•Œ id๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. 

 

 

์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ ์—ฐ์‚ฐํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„

๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค์— ์†Œ์†๋˜์–ด ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ์ฒ˜๋ฆฌ. 

๋”ฐ๋ผ์„œ, ์ด ํ”„๋กœํผํ‹ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ธ์Šคํ„ด์Šค์— ์†Œ์†๋œ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•œ๋‹ค.

 

์˜ˆ์™ธ์ ์œผ๋กœ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด ์ž์ฒด์— ์†Œ์†๋˜์–ด ๊ฐ’์„ ๊ฐ€์ง€๋Š”,

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…ํ”„๋กœํผํ‹ฐ๋„ ์žˆ๋‹ค. 

 

 

3. ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ vs ํƒ€์ž… ํ”„๋กœํผํ‹ฐ

๐ŸŒŸ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ

ํŠน์ • ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ํ”„๋กœํผํ‹ฐ. ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. 
์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ

 

์‚ฌ์šฉ : ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ

 

์˜ˆ์‹œ

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let person1 = Person(name: "Alice", age: 30)
let person2 = Person(name: "Bob", age: 25)

print(person1.name)  // Alice
print(person2.name)  // Bob

name๊ณผ age๋Š” ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋‹ค. person1๊ณผ person2 ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ name๊ณผ age ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

 

 

๐ŸŒŸ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ

ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํƒ€์ž… ์ž์ฒด์— ์†ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ. ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ฐ’์„ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. 

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ ์•ž์— static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์ผ ๊ฒฝ์šฐ class ํ‚ค์›Œ๋“œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. 

class๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ž…ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ƒ์†๋ฐ›์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ override ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์‚ฌ์šฉ: ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์„ค์ •์„ ๊ด€๋ฆฌํ•  ๋•Œ

 

 

์˜ˆ์‹œ

class Person {
    var name: String
    var age: Int
    
    // ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
    static var species = "Homo Sapiens"
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let person1 = Person(name: "Alice", age: 30)
let person2 = Person(name: "Bob", age: 25)

print(Person.species)  // Homo Sapiens

Person.species = "Human"
print(Person.species)  // Human

species๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋‹ค.

Person์ด๋ผ๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” species๋ผ๋Š” ๊ณตํ†ต๋œ ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ,

์ด ๊ฐ’์€ ํƒ€์ž… ์ž์ฒด์— ์†ํ•ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

NetworkManager์™€ ํƒ€์ž…ํ”„๋กœํผํ‹ฐ

 

์—ญํ• : ๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ €์—์„œ shared๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋œ ๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ €์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์•ฑ ์ „์ฒด์—์„œ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ € ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

 

์‚ฌ์šฉ: ๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ €์™€ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ,

ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉ.

 

์œ„ ์˜ˆ์ œ์—์„œ NetworkManager.shared๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๋งค๋‹ˆ์ €์˜ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋‹ค. 

shared๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ, NetworkManager ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ณณ์—์„œ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„

ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ชจ๋ฆฌํ„ฐ๋ง ํ•˜๋Š” ์—ญํ• ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํŠน์ • ์•ก์…˜์— ๋ฐ˜์‘ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค. 

์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ