๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ Mobile/iOS

[iOS - Swift] Class(ํด๋ž˜์Šค)์™€ Struct(๊ตฌ์กฐ์ฒด)์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ - ์ฐธ์กฐ ํƒ€์ž…, ๊ฐ’ ํƒ€์ž…

Swift ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜์ธ Class(ํด๋ž˜์Šค)์™€ Struct(๊ตฌ์กฐ์ฒด)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๋Š” Swift ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋งŒํผ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜ ์ด ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ž์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณผ๊ฒƒ์ด๋‹ค. 

 

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ์ฐจ์ด์ 

ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…, ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…์ด๋‹ค.

์ฐธ์กฐ ํƒ€์ž… : reference type

๊ฐ’ ํƒ€์ž… : value type

 

์ฒ˜์Œ์—๋Š” ๋„๋Œ€์ฒด ์ฐธ์กฐ๊ฐ€ ๋ญ๊ณ  ๊ฐ’์ด ๋ญ์•ผ? ๋ญ๊ฐ€ ๋‹ฌ๋ผ?๐Ÿค” ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋‹น์—ฐํžˆ ๋‚˜๋„ ๊ทธ๋žฌ๋‹ค. 

C์–ธ์–ด์—์„œ์˜ ํฌ์ธํ„ฐ๋ฅผ ์•Œ๋ฉด ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค. ์ผ๋‹จ ์ฐธ์กฐ ํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ‘์—์„œ ๋‹ค์‹œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค. 

 

 

ํด๋ž˜์Šค (Class)

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

Class ์ฝ”๋“œ๋ฅผ ๋ณด์ž. 

class MyClass {
	var cnt : Int = 10
    
	deinit {
		print("CLEAR")
	}
}

var cnt1 = MyClass()
var cnt2 = cnt1
var cnt3 = cnt1

cnt3.count = 999

print(cnt1.count) //999
print(cnt3.count) //999
//cnt3์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ cnt1๋„ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

 

cnt1.count๊ฐ€ 10์ด ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ ์ถœ๋ ฅํ•ด๋ณด๋ฉด 999๊ฐ€ ๋‚˜์˜จ๋‹ค. 

ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— cnt3์˜ ๊ฐ’์„ 999๋กœ ๋ฐ”๊พธ๋ฉด cnt1์—๋„ ์˜ํ–ฅ์„ ์ค€๋‹ค. 

 

 

Heap ์˜์—ญ

Heap ์˜์—ญ์—๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๊ณผ ํ•ด์ œ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.  

  • ํด๋ž˜์Šค(ํ‹€)๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
  • ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
  • ์Šคํƒ์—๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
๋ฐ์ดํ„ฐ ํž™ ์Šคํƒ
class ์ €์žฅ class ๊ฐ์ฒด ์ €์žฅ  class ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์ €์žฅ

 

 

 

๊ตฌ์กฐ์ฒด (Struct)

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

๊ตฌ์กฐ์ฒด ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

struct MyStruct {
	var cnt : Int = 10
}

var cnt1 = MyStruct()
var cnt2 = cnt1
var cnt3 = cnt1

cnt2.count = 20
cnt3.count = 30

print(cnt1.count) //10
print(cnt2.count) //20
print(cnt3.count) //30

 

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

 

 

Stack ์˜์—ญ

๊ตฌ์กฐ์ฒด๋Š” ์–ธ์ œ ์ƒ๊ธธ์ง€, ์–ธ์ œ ์‚ฌ๋ผ์งˆ์ง€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— stack ์˜์—ญ์— ์ €์žฅ์ด ๋œ๋‹ค. 

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

 

 

Class(ํด๋ž˜์Šค)์™€ Struct(๊ตฌ์กฐ์ฒด) ์˜ let๊ณผ var

 

๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” let์€ ์ƒ์ˆ˜์ด๊ณ , ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. var์€ ๋ณ€์ˆ˜์ด๊ณ , ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 

ํ•˜์ง€๋งŒ, class์™€ struct์—์„œ์˜ let์€ ๋‹ค๋ฅด๋‹ค.

 

ํด๋ž˜์Šค๋Š” let ์œผ๋กœ ์„ ์–ธํ•ด๋„ ๊ทธ ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์กฐ์ฒด๋Š” let ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

 

 

 

์ฐธ์กฐ ํƒ€์ž… - Reference Type

๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ „๋‹ฌ (์ฃผ์†Œ๊ฐ’)

 

๊ฐ’ ํƒ€์ž… - Value Type

๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌ

 

 

 

๊ทธ๋Ÿผ Class(ํด๋ž˜์Šค)์™€ Struct(๊ตฌ์กฐ์ฒด) ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ณด์œ ํ•  ๋•Œ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ๋‚ซ๋‹ค.

๋งŒ์•ฝ ๋ฐ์ดํ„ฐ์—์„œ ์ƒ์†์˜ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

728x90