Deep_Dev
article thumbnail

 

โœ… Struct  Class ๋น„๊ต

iOS๊ฐœ๋ฐœ์ž๋กœ ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๋‹ค๋ณด๋ฉด Struct์™€ Class์˜ ์ฐจ์ด์ ์ด๋ผ๋Š” ์งˆ๋ฌธ์„ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋จผ์ € ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฐจ์ด์ ์„ ๋ณด์ž๋ฉด, "Struct๋Š” ๊ฐ’ํƒ€์ž…, Class๋Š” ์ฐธ์กฐํƒ€์ž…" ์ •๋„์ด๋‹ค. ์ด ์งˆ๋ฌธ์„ ํ†ตํ•ด ARC๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ์ฐธ์กฐํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์˜ ์ฐจ์ด์  ๋“ฑ์„ ํ•จ๊ป˜ ๋‹ตํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค.

 

์‚ฌ์‹ค Struct์™€ Class์˜ '์ฐจ์ด์ '๋งŒ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋ฌธ๋ฒ•์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ณง์ด๊ณง๋Œ€๋กœ ์™ธ์šฐ๊ณ  ๊ณต๋ถ€ํ•ด๋„ ๋  ๊ฒƒ์ด๋‹ค. 

ํ•˜์ง€๋งŒ ์ด ์งˆ๋ฌธ์ด ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋‚˜์˜จ๋‹ค๋Š”๊ฒƒ์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด, iOS๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ์งˆ๋ฌธ์ธ์ง€ ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๊ฒฐ๊ตญ "๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์„ฑ๋Šฅ์ด๊ณ , Struct์™€ Class์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ๊ฐœ์„ ์—๋„ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค" ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ๋ฉด์ ‘์—์„œ 'Class์™€ Struct์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?'๋ผ๊ณ  ์งˆ๋ฌธ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์—์„œ ๋จธ๋ฌด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ฒฐ๊ตญ ๊ทธ๋ ‡๊ฒŒ ์ดํ•ดํ•œ ๊ฒƒ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹๊นŒํ•œ๋‹ค.

 

์šฐ์„  ๊ณต์‹์ ์ธ Struct์™€ Class์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

โœ… Class & Struct ๊ณตํ†ต์ 

  • ๊ฐ’์„ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜์  ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด๋ถ€ ๊ฐ’์— .๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • extension์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Protocol์„ ์ฑ„ํƒํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ…  Class & Struct ์ฐจ์ด์ 

Struct

  • ๊ฐ’ ํƒ€์ž…์ด๋‹ค.
  • ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
  • ์ฆ‰ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋’ค ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค ( ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌ )

 

Class

  • ์ฐธ์กฐํƒ€์ž…์ด๋‹ค.
  • ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๊ฐ™์€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋’ค ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ํ• ๋‹นํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค€๋‹ค ( ๋ฉ”๋ชจ๋ฆฌ๋งŒ ๋ณต์‚ฌ )
  • ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์—์„œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • deinit์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฐธ์กฐํƒ€์ž…๊ณผ ๊ฐ’ํƒ€์ž…์˜ ์ฐจ์ด ๋น„๊ต์ฝ”๋“œ

class SimpleClass { 
	var count: Int = 0
    
    deinit {
    	print("ํ• ๋‹น ํ•ด์ œ")
    }
}

struct SimpleStruct {
	var count: Int = 0
}

var class1 = SimpleClass()
var class2 = class1
var class3 = class2

class3.count = 3

print(class1.count) // class3์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ class1๋„ ๋ณ€๊ฒฝ๋จ

var struct1 = SimpleStruct()
var struct2 = struct1
var struct3 = struct2

struct2.count = 2
struct3.count = 3 

print(struct1.count) // 0
print(struct2.count) // 2 <- ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…์ด๋ฏ€๋กœ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
print(struct3.count( // 3

์ด์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ ๊ฐ™์€ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด ์ฐธ์กฐ๋œ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ , ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ตฌ์กฐ์ฒด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋”๋ผ๋„ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์–ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

โœ… Class์™€ ARC, Retain Cycle

๊ฐ„๋‹จํ•˜๊ฒŒ Swift์—์„œ ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ARC๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด์ž.

 

// ARC
print("ARC\n")
var calssARC1 : SimpleClass? = SimpleClass()
print(CFGetRetinCount(classARC1)) // ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ 2๊ฐ€ ๊ธฐ๋ณธ๊ฐ’

var classARC2 : classARC1
print(CFGetRetainCount(classARC1)) // ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 1์ฆ๊ฐ€ํ•œ 3์ด ๋œ๋‹ค.

classARC1 = nil
print(CFGetRetinCount(classARC2)) // ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 1๊ฐ์†Œํ•˜์—ฌ 2๊ฐ€ ๋œ๋‹ค.
classARC2 = nil // ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 1 ๊ฐ์†Œํ•˜์—ฌ ๋” ์ด์ƒ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ deinit ์‹คํ–‰

์œ„์™€ ๊ฐ™์ด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด, ์›๋ž˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œํ•˜๋”๋ผ๋„ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ๋‚จ์•„์žˆ์–ด deinit์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฐธ์กฐ๋˜๋Š” ๋ชจ๋“  ๊ฐ’๋“ค์„ ํ•ด์ œํ•ด์ค˜์•ผ ๋น„๋กœ์†Œ deinit์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠน์ง•๋•Œ๋ฌธ์— RetainCycle์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋„ ๋ณด๊ณ  ๊ฐ€๊ฒ ๋‹ค.

 

 

// retain cycle
class StrongRefClassA {
	var classB : StrongRefClassB?
    deinit {
    	print("ClassA ํ• ๋‹น ํ•ด์ œ")
    }
}

class StrongRefClassB {
	var classA : StrongRefClassA?
    deinit {
    	print("ClassB ํ• ๋‹น ํ•ด์ œ")
    }
}

var classA: StrongRefClassA? = StrongRefClassA()
var classB: StrongRefClassB? = StrongRefClassB()

print(CFGetRetainCount(classA)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ’)
print(CFGetRetainCount(classB)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ’)

classA?.classB = classB
classB?.classA = classA

print(CFGetRetainCount(classA)) // reference count = 3
print(CFGetRetainCount(classB)) // reference coutn = 3

classA = nil
print(CFGetRetainCount(classB?.classA)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ’)
classB = nil // <- ๋” ์ด์ƒ classA, classB์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†์ง€๋งŒ deinit ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Œ -> ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ

 

์œ„์™€ ๊ฐ™์ด ๋” ์ด์ƒ classA, classB์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜์ง€ ์•Š์•„ deinit์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ฌด๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” weak, unowned ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ๋กœ๋งŒ ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๊ฒŒ๋ณด๊ฒ ๋‹ค. ARC์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋”ฐ๋กœ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.

 

class StrongRefClassA {
	weak var classB: StrongRefClassB?
    deinit {
    	print("ClassA ํ• ๋‹น ํ•ด์ œ")
    }
}

class StrongRefClassB {
	weak var calssA: StrongRefClassA?
    deinit {
    	print("classB ํ• ๋‹น ํ•ด์ œ")
    }
}

var classA: StrongRefClassA? = StrongRefClassA()
var classB: StrongRefClassB? = StrongRefClassB()

print(CFGetRetainCount(classA)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ’ )
print(CFGetRetainCount(classB)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ’ )

classA?.classB = classB
classB?.calssA = classA

print(CFGetRetainCount(classA)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ’ )
print(CFGetRetainCount(classB)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ’ ) -> ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ์นด์šดํŠธ ์ฆ๊ฐ€

classA = nil // deinit ์‹คํ–‰๋จ
classB = nil // deinit ์‹คํ–‰๋จ -> ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋จ -> ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

์ด๋ ‡๊ฒŒ weak์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด retain cycle์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์Šค์œ„ํ”„ํŠธ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰๋˜๋Š” ๋‚ด์šฉ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅธ๋ฐ, ๊ตฌ์กฐ์ฒด๋Š” ์–ธ์ œ ์ƒ๊ธฐ๊ณ , ์‚ฌ๋ผ์งˆ์ง€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ Stack ๊ณต๊ฐ„์— ํ• ๋‹น๋˜๊ณ , ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ๊ฐ€ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— Heap์ด๋ผ๋Š” ๊ณต๊ฐ„์— ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. 

 

๊ทธ๋Ÿผ ๋‘ ํ• ๋‹น์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 


โœ… ํ• ๋‹น์˜ ์ฐจ์ด

Stack ํ• ๋‹น

์Šคํƒ์€ LIFO( Last In First Out ) ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ค์–ด๊ฐ„ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ ํŠน์„ฑ์ƒ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น, ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์–ธ์ œ ์ƒ์„ฑ๋˜๊ณ  ํ•ด์ œ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ’๋“ค์ด ์Šคํƒ์— ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค. 

 

์Šค๋ ˆ๋“œ๋“ค์€ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ ์Šคํƒ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ์ž์›์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ์Šคํƒ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Heap์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Heap ํ• ๋‹น

Heap์—๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๊ณผ ํ•ด์ œ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค. ์ฆ‰ ์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ํž™์— ํ• ๋‹น ๋˜๊ฒŒ ๋œ๋‹ค. Heap์€ Stack๋ณด๋‹ค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์•„๊นŒ Stack์—์„œ๋Š” pop, push๋ผ๋Š” ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ํ• ๋‹น, ํ•ด์ œ๊ฐ€ ์ด๋ฃจ์–ด์กŒ์ง€๋งŒ Heap์€ ์ฐธ์กฐ ๊ณ„์‚ฐ๋„ ํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ Stack๋ณด๋‹ค ๋ณต์žกํ•˜๋‹ค.

 

๋˜ํ•œ Heap์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•œ Lock๊ณผ ๊ฐ™์€ ์ž์›๋„ ํ•„์š”ํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋Š” ๊ณง ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ด์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ Stack, Heap ํ• ๋‹น์˜ ์ฐจ์ด์ ๊ณผ Swift์˜ Class, Struct ๊ฐ’๋“ค์ด ์–ด๋””์— ์ €์žฅ๋˜๋Š”์ง€ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

 

๊ทผ๋ฐ ์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋ฉด ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ํด๋ž˜์Šค์•ˆ์— ๊ตฌ์กฐ์ฒด ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๊ฑฐ๋‚˜, ๊ตฌ์กฐ์ฒด ์•ˆ์— ํด๋ž˜์Šค ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

์ด๋ฅผ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ตญ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ’ ํƒ€์ž…์„ ํฌํ•จํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž…
    • ๊ฐ„๋‹จํ•˜๊ฒŒ Class์•ˆ์— Struct ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
    • ์ด ๊ฒฝ์šฐ ์ฐธ์กฐ ํƒ€์ž…์ด ํ• ๋‹น ํ•ด์ œ๋˜๊ธฐ ์ „์— ๊ฐ’ ํƒ€์ž…๋„ ํ• ๋‹น ํ•ด์ œ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ’ ํƒ€์ž…๋„ ํž™์— ์ €์žฅํ•œ๋‹ค.
    • ์œ„์˜ ๊ฒฝ์šฐ ๋ง๊ณ ๋„ Swift์—์„œ๋Š” ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’ ํƒ€์ž…๋„ ์œ„์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค. 
  • ์ฐธ์กฐ ํƒ€์ž…์„ ํฌํ•จํ•˜๋Š” ๊ฐ’ ํƒ€์ž…
    • Struct์•ˆ์— Class ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค .
    • ์ด ๊ฒฝ์šฐ ๊ฐ’ ํƒ€์ž…์€ ํž™์— ํ• ๋‹น๋˜์ง€ ์•Š์ง€๋งŒ ๋‚ด๋ถ€์— ์ฐธ์กฐ ํƒ€์ž…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

โœ… ๊ฐ’ ํƒ€์ž…์˜ Copy-on-assignment, Copy-on-write

๊ฐ’ ํƒ€์ž…์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๋ณต์‚ฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ฐ™์€ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ Copy-on-assignment๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด์™€ ๋‹ค๋ฅด๊ฒŒ Copy-on-wirte๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ์ผ๋‹จ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ๊ณณ์„ ๋ณธ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‹ค์ œ๋กœ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ณ  ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•ด์ฃผ๊ธฐ ์œ„ํ•จํžˆ๋ฉฐ Swift์—์„œ๋Š” Int, Double, String, Array, Set, Dictionary์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ฐธ์กฐ ํƒ€์ž…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฐ’ ํƒ€์ž…์€ ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌผ๋ก  ์–ต์ง€๋กœ ๋งŒ๋“ค ์ˆœ ์žˆ์ง€๋งŒ ์ด๋Š” ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

๊ทธ๋ž˜์„œ ์–ธ์ œ Struct๋ฅผ ์“ฐ๊ณ , ์–ธ์ œ Class๋Š” ์“ฐ๋Š”๊ฒƒ์ด ์ข‹์„๊นŒ ?

  • ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณด์œ ํ•˜๊ณ  ์œ„ํ•ด์„œ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ๋‚ซ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ์€ ํฌ๊ธฐ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Objective-C์™€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์›ํ•  ๋•Œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”—  ์„œ๋ฒ„์—์„œ JSON ์ •๋ณด๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ฌ๋•Œ ๊ตฌ์กฐ์ฒด ( Struct ) ๋ฅผ ์“ด๋‹ค. 

Why ? Struct๋Š” ์–ด๋””์— ์‚ฌ์šฉํ•ด๋„ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค.

์ด๊ฒƒ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋งŒ๋“ค์–ด๋„, ์ตœ์ดˆ ์›๋ณธ์ด ๋ฐ”๋€Œ์–ด๋„ ๋ณต์‚ฌ๋ณธ๋“ค์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ ์™ธ์˜ ํ•จ์ˆ˜๋‚˜ ๊ธฐ๋Šฅ๋“ค์˜ ์ง‘ํ•ฉ ํ˜น์€ ์ƒ์†์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค ( Class ) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

์ด๋ ‡๊ฒŒ Swift์˜ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค. 

 

 

'๐ŸŽ iOS > Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift][iOS] GCD API ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํ•„์š”์„ฑ (1)  (0) 2023.06.13
[Swift][iOS] QOS  (0) 2023.06.13
[Swift] Dispatch Queue  (0) 2023.01.27