suvera-dev ๐Ÿฅฆ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ Swift - Struct, Class, Property, Method ๋ณธ๋ฌธ

Language/Swift

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ Swift - Struct, Class, Property, Method

suvera 2023. 3. 30. 15:01

๊ธฐ๋ณธ๊ธฐ ๋ณด์ถฉ์„ ์œ„ํ•ด ์Šค์œ„ํ”„ํŠธ์˜ ๊ต๊ณผ์„œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์•ผ๊ณฐ์ฑ…์„ ๋‹ค์‹œ ๋ณด๋Š” ์ค‘์ธ๋ฐ์š”.

๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด์ง€๋งŒ ์—ญ์‹œ ๋ณผ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฒƒ ๊ฐ™๋„ค์š” ใ…‹ใ…‹ใ…Žใ…Ž

 

์ž‘๋…„์— ์›ํ‹ฐ๋“œ์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ์„ ๋•Œ๋„ ์•ผ๊ณฐ๋‹˜์ด ๊ธฐ์ดˆ์ ์ธ ๊ฐœ๋…์„ ๋งค์šฐ ๊ฐ•์กฐํ•˜์‹œ๋ฉด์„œ

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ 1์ฐจ์‹œ์— ์†Œ๊ฐœํ•ด์ฃผ์…จ๋˜ ๊ฒƒ์ด ์ƒ๊ฐ๋‚˜๋„ค์š”.. ^^.. 

 

๋งค๋‹ฌ 1๊ถŒ์”ฉ์€ ๊ผญ ์ฑ…์„ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋Š”๋ฐ,

์ด๋ฒˆ ๋‹ฌ์—” ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด. ๋ผ๋Š” ์ฑ…์„ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค. 

์ €๋ฒˆ ๋‹ฌ๊นŒ์ง„ ์ž๊ธฐ๊ณ„๋ฐœ์„œ, ์ธ๋ฌธํ•™ ๋„์„œ๋ฅผ ํ•œ ๋‹ฌ์— 1~2๊ถŒ ์ •๋„ ์ฝ์—ˆ๋Š”๋ฐ

์ด๋ฒˆ ๋‹ฌ์—” ๊ฐœ๋ฐœ ์„œ์ ์„ ์ข€ ์ฝ์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค !

 

์จ‹๋“ , ์ฑ…์„ ์ฝ๊ธฐ ์ „์— Swift์—์„œ์˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ฐ๋‹ค์ž„์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์„ ์งš์–ด๋ณด๊ณ ์ž ๋ณต์Šต์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค !

1ํƒ„์—์„œ๋Š” ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค, ํ”„๋กœํผํ‹ฐ, ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด์ „์— ์ •๋ฆฌํ•ด๋‘” ๊ฒƒ์„ ์กฐ๊ธˆ ๋‹ค๋“ฌ์–ด์„œ ํ•ฉ์นœ ๊ฒƒ.. ใ…Ž..

๊ฐ€๋…์„ฑ ์žˆ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ์•„๋‹ˆ๋ผ์„œ,,, ๊ทธ๋ƒฅ ์ญ‰ ๋ณด๋ฉด์„œ ๋†“์ณค๋˜ ๋ถ€๋ถ„๋งŒ ์ƒ๊ธฐ์‹œํ‚ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 


์Šค์œ„ํ”„ํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฐ•์กฐํ•˜์ง€๋งŒ, ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„๋„ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๊ทผ๊ฐ„์„ ๋‘ก๋‹ˆ๋‹ค !

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ํ•„์ˆ˜ !

 

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

- ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ

- ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ์†Œ๋ฉธ

- ์ ‘๊ทผ์ œ์–ด

 

์œ„์˜ 4๊ฐœ ํŒŒํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋งŽ์•„์„œ ๊ธ€์ด ๊ธธ์ง€๋งŒ,

ํ•œ๋ฒˆ์— ๋ชจ์•„์„œ ๋ณด๊ธฐ ์œ„ํ•ด 2ํŒŒํŠธ์”ฉ ๋‚˜๋ˆ ์„œ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 


 

1. ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค

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

๊ทธ๋ž˜์„œ ์ด์ „์— ์ •๋ฆฌํ•ด๋†จ๋˜ ๋‚ด์šฉ์„ ๋ณต๋ถ™ํ–ˆ์Šต๋‹ˆ๋‹ค. ใ…‹ใ…‹ 

 

 

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

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…


๊ตฌ์กฐ์ฒด - Struct

- ๊ตฌ์กฐ์ฒด ์ •์˜๋ฅผ ๋งˆ์นœ ํ›„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๊ณ ์ž ํ• ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์‚ฌ์šฉ

- ๋ฉค๋ฒ„์™€์ด์ฆˆ ์ด๋‹ˆ์…œ๋ผ์ด์ €? ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €

- ๊ตฌ์กฐ์ฒด์— ๊ธฐ๋ณธ ์ƒ์„ฑ๋œ ์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ ์ž๋™ ์ง€์ • 

- ๊ตฌ์กฐ์ฒด๋ฅผ var๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ .์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

- ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

ํด๋ž˜์Šค - Class

- Swift ์˜ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจํด๋ž˜์Šค ์—†๋”๋ผ๋„ ์ƒ์†์—†์ด ๋‹จ๋…์œผ๋กœ ์ •์˜ ๊ฐ€๋Šฅ.

- ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ ํ›„, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™” ํ•˜๊ณ ์ž ํ• ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉ

- ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋ณธ ๊ฐ’์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ „๋‹ฌ์ธ์ž๋ฅผ ํ†ตํ•˜์—ฌ ๋”ฐ๋กœ ์ดˆ๊นƒ๊ฐ’์„ ์ „๋‹ฌํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

- ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค = ๊ฐ์ฒด 

- ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋œ ํ›„ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋งˆ์นจํ‘œ ์‚ฌ์šฉ.

- ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ let์œผ๋กœ ์„ ์–ธํ•ด๋„ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 


ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ์†Œ๋ฉธ

๐Ÿ”ฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐํƒ€์ž…์ด๋ฏ€๋กœ ๋”๋Š” ์ฐธ์กฐํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ ๋ฉ๋‹ˆ๋‹ค.

 

 

์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „ deinit์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ(๋””์ด๋‹ˆ์…œ๋ผ์ด์ € deinitializer) ํ˜ธ์ถœ

- ํด๋ž˜์Šค ๋‚ด๋ถ€์— deinit ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด, ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋จ

- ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๋งŒ ๊ตฌํ˜„, ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ

Class Person {
...
	deinit {
		print("์ธ์Šคํ„ด์Šค ์†Œ๋ฉธ")
	}
}

var yagom: Person? = Person()
yagom = nil // Person ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.

→ ๋ณดํ†ต deinit ๋ฉ”์„œ๋“œ์—๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๊ธฐ ์ง์ „์— ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์Šคํ„ด์Šค ์†Œ๋ฉธ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์ธ์Šคํ„ด์Šค ์†Œ๋ฉธ์„ ์•Œ๋ ค์•ผํ•  ๋•Œ๋Š” ํŠนํžˆ deinit ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ตœ๊ทผ์— ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด deinit ํ˜ธ์ถœ์„ ํ™•์ธํ–ˆ๋˜ ๊ธฐ์–ต์ด๋‚ฉ๋‹ˆ๋‹ค.

deinit ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์„ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค :)


๊ฐ’ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž… ??

๊ฐ’ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ?? → ๋ฌด์—‡์ด ์ „๋‹ฌ๋˜๋Š๋ƒ??

- ์–ด๋–ค ํ•จ์ˆ˜์˜ ์ „๋‹ฌ ์ธ์ž๋กœ ๊ฐ’ ํƒ€์ž…์˜ ๊ฐ’์„ ๋„˜๊ธด๋‹ค๋ฉด ์ „๋‹ฌ๋  ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

- ๊ทธ๋Ÿฌ๋‚˜ ์ฐธ์กฐ ํƒ€์ž…์ด ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋ ๋•Œ๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ(์ฃผ์†Œ)๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

- ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ๋„˜๊ธธ๋•Œ๋„ ์ฐธ์กฐ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜์— ํ• ๋‹น๋  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฐธ์กฐ๊ฐ€ ํ• ๋‹น๋œ๋‹ค !

 

๊ฐ’ ํƒ€์ž…

struct BasicInformation {
	let name: String
	var age: Int
}

var yagomInfo: BasicInformation = BasicInformation(name: "yagom", age: 99)
yagomInfo.age = 100

//friendInfo ์— yagomInfo ์˜ ๊ฐ’์„ "๋ณต์‚ฌ"ํ•˜์—ฌ ํ• ๋‹น (extra memory)
var friendInfo: BasicInformation = yagomInfo

print("yagom's age: \\(yagomInfo.age)")
print("friend's age: \\(friendInfo.age)")

friendInfo.age = 25
//friendInfo ๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— yagomInfo.age ์—๋Š” ๊ฐ’ ๋ณ€๊ฒฝ X

func changeBasicInfo(_ info: BasicInformation){
	var copiedInfo: BasicInformation = info
	copiedInfo.age = 1
}

changeBasicInfo(yagomInfo)
print("yagom's age: \\(yagomInfo.age)")
//call by reference ๊ฐ€ ์•„๋‹Œ call by value ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ 100์ž„

์ฐธ์กฐํƒ€์ž…

class Person{
	var height: Float = 0.0
	var weight: Float = 0.0
}

var yagom: Person = Person()
var friend: Person = yagom
//yagom์˜ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•œ๋‹ค

friend.height = 182.3
print("yagom height: \\(yagom.height)")
//friend.height ์„ ๋ฐ”๊ฟจ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  yagom.height ๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค
// ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ

func changePersonInfo(_ info: Person){
	info.height = 155.2
}

changePersonInfo(yagom)
print("yagom height: \\(yagom.height)")
//Call by reference ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฐ’์ด ๋ณ€ํ™”๋˜์–ด 155.2 ์ถœ๋ ฅ

 

 

- ๊ฐ’ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋‹ฌ์ธ์ž๋ฅผ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

- ์ƒ์„ฑ๋œ ์ƒˆ ์ธ์Šคํ„ด์Šค์—๋Š” ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ๋“ค์–ด๊ฐ.

- ๋ฐ˜๋ฉด, ์ฐธ์กฐํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋Š” ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌํ•  ๋•Œ ๊ธฐ์กด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌ.

- ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ๊ธฐ์กด์˜ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

 

๐Ÿ”ฅ ์‹๋ณ„์—ฐ์‚ฐ์ž === : ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ผ๋ฆฌ ์ฐธ์กฐ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ !

 

 

์Šค์œ„ํ”„ํŠธ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ชจ๋‘ ๊ตฌ์กฐ์ฒด

๐Ÿ”ฅ ์• ํ”Œ์˜ ๊ฐ€์ด๋“œ๋ผ์ธ์—์„œ ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

 

- ์—ฐ๊ด€๋œ ๊ฐ„๋‹จํ•œ ๊ฐ’์˜ ์ง‘ํ•ฉ์„ ์บก์Šํ™”ํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๋ชฉ์ ์ผ ๋–„

- ์บก์Šํ™”ํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•  ๋•Œ

- ๊ตฌ์กฐ์ฒด์— ์ €์žฅ๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ’ํƒ€์ž…์ด๋ฉฐ, ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋‹นํ•  ๋•Œ

- ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ถ€ํ„ฐ ์ƒ์† ๋ฐ›๊ฑฐ๋‚˜ ์ž์‹ ์„ ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ

์ ์ ˆํ•œ ์˜ˆ๋กœ๋Š” ์ขŒํ‘œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

- ์ขŒํ‘œ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„๋•Œ Int ํƒ€์ž…์œผ๋กœ x,y ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ

- ๋Œ€๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ• ์ผ์ด ๋” ๋งŽ์„ ๊ฒƒ !

 

 

์Šค์œ„ํ”„ํŠธ์˜ ๋ณต์‚ฌ ์ฒ˜๋ฆฌ

 

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

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Œ.

 

ํ•˜์ง€๋งŒ, ์Šค์œ„ํ”„ํŠธ๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ง„์งœ๋ณต์‚ฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค !

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŒ๋‹จํ•ด์„œ ์•Œ์•„์„œ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

 

์Šค์œ„ํ”„ํŠธ๋Š” ์†Œ์ŠคํŒŒ์ผ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ตฌํ˜„ํ•ด๋„ ๋ฌธ์ œ์—†์Œ.

์ค‘์ฒฉํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค‘์ฒฉ ํƒ€์ž…์˜ ์ •์˜ ๋ฐ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•จ.

 

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

๊ณตํ†ต์ 

1. ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๊ธฐ๋Šฅ ์‹คํ–‰์„ ์œ„ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ๊ตฌ์กฐ์ฒด ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๊ฐ–๋Š” ๊ฐ’์— ์ ‘๊ทผํ•˜๋„๋ก ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ

4. ์ดˆ๊ธฐํ™” ๋ ๋•Œ์˜ ์ƒํƒœ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์ดˆ๊ธฐ๊ตฌํ˜„๊ณผ ๋”๋ถˆ์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ์ต์Šคํ…์…˜์„ ํ†ตํ•ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐจ์ด์ 

1. ๊ตฌ์กฐ์ฒด๋Š” ์ƒ์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. ๋””์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ฐธ์กฐํšŸ์ˆ˜ ๊ณ„์‚ฐ์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

4. ํƒ€์ž…์บ์ŠคํŒ…์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ํ—ˆ์šฉ.

5. ๊ตฌ์กฐ์ฒด๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ default initalizer ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

6. ๊ตฌ์กฐ์ฒด๋Š” let์œผ๋กœ ์„ ์–ธํ–ˆ์„ ๊ฒฝ์šฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ. ํด๋ž˜์Šค๋Š” let์œผ๋กœ ์„ ์–ธํ•ด๋„ ์ˆ˜์ • ๊ฐ€๋Šฅ.

 

 


2. ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ 

 

ํ”„๋กœํผํ‹ฐ๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์—ด๊ฑฐํ˜• ๋“ฑ์— ๊ด€๋ จ๋œ ๊ฐ’.

๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ํƒ€์ž…์— ๊ด€๋ จ๋œ ํ•จ์ˆ˜.

 

 

Property = ์ €์žฅ ํ”„๋กœํผํ‹ฐ, ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ, ํƒ€์ž… ํ”„๋กœํผํ‹ฐ

- ์ €์žฅ ํ”„๋กœํผํ‹ฐ : ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜ ( ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค์—์„œ๋งŒ ) 

- ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ : ๊ฐ’์„ ์ €์žฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ด๊ฐ’. ( ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์— ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. )

- ํƒ€์ž… ํ”„๋กœํผํ‹ฐ : ํŠน์ • ํƒ€์ž…์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ

 

์ •๋ฆฌ : ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ => ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋กœ, ํด๋ž˜์Šค ๋ณ€์ˆ˜ => ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ๋ถ„.

 


Property Observers : ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์‹œ.

- ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰. 

- ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ถ€๋ชจํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.

 


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

= ํด๋ž˜์Šค ๋˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ด€๋œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ.

 

- ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

** ํด๋ž˜์Šค์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ์˜ต์…”๋„์ด ์•„๋‹ˆ๋ผ๋ฉด ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ ๊ฐ’์„ ๊ธฐ์ •ํ•ด์ฃผ๊ฑฐ๋‚˜

- ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ†ตํ•ด ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

** ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋  ๋•Œ ํ•œ๋ฒˆ๋งŒ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ.

์ž์‹ ํด๋ž˜์Šค์—์„œ ์ด ์ดˆ๊ธฐํ™”๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

ํด๋ž˜์Šค์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค !

 

- ์ด ๋ง์€ ์ฆ‰, ํด๋ž˜์Šค์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋”ฐ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ตฌํ˜„ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค !

- ํ•˜์ง€๋งŒ, ์˜๋„์™€ ๋งž์ง€ ์•Š๊ฒŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚จ์•„์žˆ๊ณ , ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„์— ์›ํ•˜๋Š” ๊ฐ’์„ ์ผ์ผ์ด ํ• ๋‹นํ•ด์•ผํ•ด์„œ ๋ถˆํŽธํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜, let์œผ๋กœ ์ •์˜ํ•ด์ฃผ๊ณ  ์‹ถ์—ˆ๋˜ ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„์— ๊ฐ’์„ ํ• ๋‹นํ•ด์ฃผ๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค !

 

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

 

- ์ธ์Šคํ„ด์Šค๋Š” ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์ด ๊ผญ ์žˆ์–ด์•ผํ•˜๋Š” ์ƒํƒœ์ด๊ธฐ์—, ์˜ต์…”๋„์ด ์•„๋‹Œ ๊ฐ’์ผ๋• ์ดˆ๊นƒ๊ฐ’์„ ๋ณด๋‚ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์˜ต์…”๋„์ด๋ผ๋ฉด, ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

 

struct CoordinatePoint {
	// ์œ„์น˜๋Š” x, y ๊ฐ’์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ต์…”๋„์ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
    var x: Int
    var y: Int
}

class Position {
    // ํ˜„์žฌ ์‚ฌ๋žŒ์˜ ์œ„์น˜๋ฅผ ๋ชจ๋ฅผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. - ์˜ต์…”๋„
    var point: CoordinatePoint?
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

// ์ด๋ฆ„์€ ํ•„์ˆ˜์ง€๋งŒ ์œ„์น˜๋Š” ๋ชจ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let eunseoPosition: Position = Position(name: "eunseo")

// ์œ„์น˜๋ฅผ ์•Œ๊ฒŒ๋˜๋ฉด ๊ทธ๋•Œ ์œ„์น˜ ๊ฐ’์„ ํ• ๋‹นํ•ด์ค๋‹ˆ๋‹ค.
eunseoPosition.point = CoordinatePoint(x: 3, y: 6)

-> ์ด๋ ‡๊ฒŒ ์˜ต์…”๋„๊ณผ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ, ๋‚ด๊ฐ€ ์ฒ˜์Œ ์˜๋„ํ–ˆ๋˜ ๋Œ€๋กœ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์–ด์š” !

 


 

+ ) ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ

- ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์ด ํ•„์š”์—†๋‹ค๋ฉด ์˜ต์…”๋„๋กœ ์„ ์–ธํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค ํ–ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ์šฉ๋„๋กœ ํ•„์š”ํ• ๋•Œ ๊ฐ’์ด ํ• ๋‹น๋˜๋Š” ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์ €์žฅํ”„๋กœํผํ‹ฐ๋Š” ํ˜ธ์ถœ์ด ์žˆ์–ด์•ผ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์š”. lazy ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ.


- ์ƒ์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์™„์ „ํžˆ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•˜๋ฏ€๋กœ var๋กœ ์ •์˜ํ•ด์š”.

- ์ฃผ๋กœ ๋ณต์žกํ•œ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

 

=> ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ์ €ํ•˜๋‚˜ ๊ณต๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

struct CoordinatePoint {
    var x: Int = 0
    var y: Int = 0
}

class Position {
    lazy var point: CoordinatePoint = CoordinatePoint()
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

let eunseoPosition = Position(name: "eunseo")

// ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด point ํ”„๋กœํผํ‹ฐ๋กœ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ
// point ํ”„๋กœํผํ‹ฐ์˜ CoordinatePoint๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
print(eunseoPosition.point)

์ฃผ์˜ : ๋‹ค์ค‘์Šค๋ ˆ๋“œ์™€ ์ง€์—ฐ์ €์žฅ ํ”„๋กœํผํ‹ฐ

- ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ์ ‘๊ทผํ• ๋•Œ๋Š” ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.

- ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ง€์—ฐ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋น„์Šทํ•œ ์‹œ์ ์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ฒˆ ์ดˆ๊ธฐํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค !

 

 


 

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

= ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํŠน์ • ์ƒํƒœ์— ๋”ฐ๋ฅธ ๊ฐ’์„ ์—ฐ์‚ฐํ•˜๋Š” ํ”„๋กœํผํ‹ฐ.

 

- ์ธ์Šคํ„ด์Šค ๋‚ด/์™ธ๋ถ€์˜ ๊ฐ’์„ ์—ฐ์‚ฐํ•˜์—ฌ ์ ์ ˆํ•œ ๊ฐ’์„ ๋Œ๋ ค์ฃผ๋Š” ์ ‘๊ทผ์ž(getter) ์—ญํ• 

- ์€๋‹‰ํ™”๋œ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ์„ค์ •์ž(setter)์˜ ์—ญํ• 

 


๊ตณ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋‘๊ณ  ์™œ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์“ธ๊นŒ??? 

- ์ธ์Šคํ„ด์Šค ์™ธ๋ถ€์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ๋‘๊ฐœ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค . ( getter setter )

- ์ด๋ฅผ ๊ฐ์ˆ˜ํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ๋‹คํ•ด๋„ ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ถ„์‚ฐ ๊ตฌํ˜„๋˜์–ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

- ํƒ€์ธ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ž…์žฅ์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฉ”์„œ๋“œ ํ˜•์‹๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์  !

 

์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์˜ ๋‹จ์ 

- ์ ‘๊ทผ์ž์ธ get ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•ด๋‘” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์“ฐ๊ธฐ ์ „์šฉ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

- ๋ฉ”์„œ๋“œ๋กœ๋Š” ์„ค์ •์ž ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•˜์—ฌ ์“ฐ๊ธฐ ์ „์šฉ ์ƒํƒœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ๊ทธ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„๋œ getter, setter ์ž…๋‹ˆ๋‹ค.

struct CoordinatePoint {
    var x: Int // ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var y: Int // ์ €์žฅ ํ”„๋กœํผํ‹ฐ 

   // ๋Œ€์นญ์ ์„ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ - ์ ‘๊ทผ์ž
   // Self๋Š” ํƒ€์ž… ์ž๊ธฐ ์ž์‹ ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
   // Self ๋Œ€์‹  CoordinatePont๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
   func oppositePoint() -> Self {
        return CoordinatePoint(x: -x, y: -y)
    }
    
    // ๋Œ€์นญ์ ์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ - ์„ค์ •์ž
    mutating func setOppositePoint(_ opposite: CoordinatePoint) {
        x = -opposite.x
        y = -opposite.y
    }
}

var yagomPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)

yagomPosition // ํ˜„์žฌ์ขŒํ‘œ
yagomPosition.oppositePoint() // ๋Œ€์นญ ์ขŒํ‘œ

yagomPosition.setOppositePoint(CoordinatePoint(x: 15, y:10))
yagomPosition // ๋Œ€์นญ์ขŒํ‘œ๋ฅผ 15,10์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ˜„์žฌ๋Š” -15, -10 ์ด ๋œ๋‹ค.

-> oppositePoint() ๋กœ ๋Œ€์นญ์ ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ , setOppositePoint()๋กœ ๋Œ€์นญ์ ์„ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

 

์—ฐ์‚ฐํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ž

struct CoordinatePoint {
    var x: Int
    var y: Int
    
    // ๋Œ€์นญ์ขŒ์ตธ 
    var oppositePoint: CoordinatePoint {
        // ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ 
        get {
            return CoordinatePoint(x: -x, y: -y)
        }
        
        set(opposite) {
            x = -opposite.x
            y = -opposite.y
        }
    }
}

- ์ด๋Ÿฐ์‹์œผ๋กœ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ์ž์™€ ์„ค์ •์ž๊ฐ€ ๋ชจ๋‘ ๋ชจ์—ฌ์žˆ๊ณ , ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ! ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๋งˆ์น˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

- ์„ค์ •์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์›ํ•˜๋Š” ์ด๋ฆ„์„ ์†Œ๊ด„ํ˜ธ์— ๋ช…์‹œํ•ด์ฃผ๋ฉด, set๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ „๋‹ฌ๋ฐ›์€ ์ „๋‹ฌ์ธ์ž ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

- ๊ด€์šฉ์ ์ธ ํ‘œํ˜„์œผ๋กœ newValue๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๊ฒฝ์šฐ, ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋”ฐ๋กœ ํ‘œ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

- ์ ‘๊ทผ์ž ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๊ฐ€ ๋‹จ ํ•œ ์ค„ ์ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์˜ ํƒ€์ž…์ด ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๊ณผ ๊ฐ™์œผ๋ฉด return ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

- ๊ตณ์ด ๋Œ€์นญ์ ์„ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด, get๋งŒ ๊ตฌํ˜„ํ•ด์„œ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

// ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
yagomPosition.oppositePoint = CoordinatePoint(x: 15, y: 10)

 

 


ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„ Property Observers

- ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ž‘์—…์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

- ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋Š” ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ์ƒˆ๋กœ ํ• ๋‹น๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

- ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์ด ํ˜„์žฌ์™€ ๊ฐ™๋”๋ผ๋„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

- ์ €์žฅํ”„๋กœํผํ‹ฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ํ•ด ์ƒ์†๋ฐ›์€ ์ €์žฅ,์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ด์š”.

- ์ƒ์†๋ฐ›์ง€ ์•Š์€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ ‘๊ทผ์ž์™€ ์„ค์ •์ž๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

- ์ƒ์† ๋ฐ›์•˜์„ ๋•Œ๋งŒ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ ํ•ด์ค๋‹ˆ๋‹ค.

 

 

ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „ : willSet, ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„ : didSet

- willSet๊ณผ didSet ๋ฉ”์„œ๋“œ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์žˆ๋Š”๋ฐ์š”.

- willSet ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ์ „๋‹ฌ์ธ์ž๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ’์ด๊ณ , didSet ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ์ „๋‹ฌ์ธ์ž๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

- ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, willSet์—๋Š” newValue / didSet์—๋Š” oldValue๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์ž๋™์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

- ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์†Œ๊ด„ํ˜ธ ์•ˆ์— ์ ์–ด์ฃผ์„ธ์š”.

- didSet ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ oldValue ๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์— ๋ช…์‹œ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด didSet ๋ธ”๋ก์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค !

 

class Account {
    var credit: Int = 0
        willSet {
            print("์ž”์•ก์ด \(credit)์›์—์„œ \(newValue)์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.")
        }
    
        didSet {
            print("์ž”์•ก์ด \(oldValue)์›์—์„œ \(credit)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        }
    }
}

let myAccount: Account = Account()
// ์ž”์•ก์ด 0์›์—์„œ 1000์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
myAccount.credit = 1000
// ์ž”์•ก์ด 0์›์—์„œ 1000์›์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

- ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•˜๋‹ค๋ฉด ๊ธฐ์กด์˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Œ.

- ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ํ•ด๋„ ๊ธฐ์กด์˜ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ ๊ธฐ๋Šฅ์€ ๋™์ž‘

 

dollarValue๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” Account ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ForeignAccount ํด๋ž˜์Šค์—์„œ ๊ธฐ์กด dollarValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ฐ์‹œ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์˜ˆ์ œ

class Account {
    var credit: Int = 0
        willSet {
            print("์ž”์•ก์ด \(credit)์›์—์„œ \(newValue)์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.")
        }
    
        didSet {
            print("์ž”์•ก์ด \(oldValue)์›์—์„œ \(credit)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        }
    }

    var dollarValue: Double {
        get {
            return Double(credit) / 1000.0
        }
        
        set {
            credit = Int(newValue * 1000)
            print("์ž”์•ก์„ \(newValue)๋‹ฌ๋Ÿฌ๋กœ ๋ณ€๊ฒฝ์ค‘")
        }
    }
}


class ForeignAccount: Account {
    override var dollarValue: Double {
        willSet {
            print("์ž”์•ก์ด \(dollarValue)์—์„œ \(newValue)๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •")
        }
        
        didSet {
            print("์ž”์•ก์ด \(oldValue)์›์—์„œ \(dollarValue)๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
        }
    }
}

let myAccount: ForeignAccount = ForeignAccount()
// ์ž”์•ก์ด 0์›์—์„œ 1000์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •
myAccount.credit = 1000
// ์ž”์•ก์ด 0์›์—์„œ 1000์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// ์ž”์•ก์ด 1.0๋‹ฌ๋Ÿฌ์—์„œ 2.0๋‹ฌ๋Ÿฌ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •
// ์ž”์•ก์ด 1000์›์—์„œ 2000์›์œผ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •
// ์ž”์•ก์ด 1000์›์—์„œ 2000์›์œผ๋กœ ๋ณ€๊ฒฝ๋จ

myAccount.dollarValue = 2 // ์ž”์•ก์„ 2.0๋‹ฌ๋Ÿฌ๋กœ ๋ณ€๊ฒฝ์ค‘
//์ž”์•ก์ด 1.0๋‹ฌ๋Ÿฌ์—์„œ 2.0๋‹ฌ๋Ÿฌ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

- ๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ ๊ฐ์‹œ์ž๊ฐ€ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•จ์ˆ˜์˜ ์ž…์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค๋ฉด ํ•ญ์ƒ willSet๊ณผ didSet ๊ฐ์‹œ์ž๋ฅผ ํ˜ธ์ถœ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋“  ๋˜์ง€ ์•Š๋“  ๊ฐ„์— ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์— ๊ฐ’์„ ๋‹ค์‹œ ์“ฐ๊ธฐ ๋•Œ๋ฌธ !!


์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜

์•ž์„œ ์„ค๋ช…ํ•œ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ ๊ฐ์‹œ์ž๋Š” ์ „์—ญ๋ณ€์ˆ˜์™€ ์ง€์—ญ๋ณ€์ˆ˜ ๋ชจ๋‘์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค !

 

- ํ”„๋กœํผํ‹ฐ์— ํ•œ์ •ํ•˜์ง€ ์•Š๊ณ , ์ „์—ญ์—์„œ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜์—๋„ ๋‘ ๊ธฐ๋Šฅ ์‚ฌ์šฉ๊ฐ€๋Šฅ

- ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ „์— ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ณ€์ˆ˜์™€ ์ƒ์ˆ˜๋Š” ๋ชจ๋‘ ์ง€์—ญ๋ณ€์ˆ˜ ์ƒ์ˆ˜

- ์ „์—ญ๋ณ€์ˆ˜ ๋˜๋Š” ์ „์—ญ์ƒ์ˆ˜๋Š” ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ ์ฒ˜์Œ ์ ‘๊ทผํ• ๋•Œ ์ตœ์ดˆ๋กœ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง

- lazy ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ์„ ๋Šฆ์ถœ ํ•„์š”๊ฐ€ ์—†๋‹ค.

- ์ง€์—ญ๋ณ€์ˆ˜ ๋ฐ ์ง€์—ญ์ƒ์ˆ˜๋Š” ์ ˆ๋Œ€๋กœ ์ง€์—ฐ ์—ฐ์‚ฐ๋˜์ง€ ์•Š๋Š”๋‹ค !

 


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

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

 


๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ, ํƒ€์ž… ์ž์ฒด์— ์†ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค !

- ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ํƒ€์ž… ์ž์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค.

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

 

ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

1. ์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ดˆ๊นƒ๊ฐ’์„ ์„ค์ •ํ•ด์•ผํ•˜๋ฉฐ ์ง€์—ฐ ์—ฐ์‚ฐ๋ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋Š” ๋ณด์žฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

2. ์—ฐ์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€์ˆ˜๋กœ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

class AClass {
    // ์ €์žฅ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
    static var typeProperty: Int = 0
    
    // ์ €์žฅ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ 
    var instanceProperty: Int = 0 {
    	didSet {
            // Self.typeProperty๋Š”
            // AClass.typeProperty ์™€ ๊ฐ™์€ ํ‘œํ˜„
            Self.typeProperty = instanceProperty + 100
        }
    }
    
    // ์—ฐ์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ 
    static var typeComputedProperty: Int {
        get {
            return typeProperty
        }
        
        set {
            typeProperty = newValue
        }
    }
}

AClass.typeProperty = 123

let classInstance: AClass = AClass()
classInstance.instanceProperty = 100

print(AClass.typeProperty) // 200
print(AClass.typeComputedProperty) // 200

- ์ด์ฒ˜๋Ÿผ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. !

- ์ธ์Šคํ„ด์Šค ์ ‘๊ทผ ํ•„์š”์—†์ด ํƒ€์ž… ์ด๋ฆ„ ๋งŒ์œผ๋กœ๋„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

- static let dollarExchangeRate: Double = 1000.0 ์™€ ๊ฐ™์ด ํƒ€์ž… ์ƒ์ˆ˜๋กœ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค.

 

 


ํ‚ค ๊ฒฝ๋กœ Key Path

- ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰์‹œ๋ฏผ์œผ๋กœ์„œ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์—ˆ์Œ

- ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•ด๋‘๊ณ  ๋‚˜์ค‘์— ์›ํ• ๋•Œ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

 

func someFunction(paramA: Any, paramB: Any) {
    print("์–ด์ฉŒ๊ตฌ")
}

var functionReference = someFunction(paramA:paramB)
functionReference("A","B")
functionReference = anotherFunction(paramA:paramB)

ํ”„๋กœํผํ‹ฐ๋„ ์ด์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ”๋กœ ๊บผ๋‚ด์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์–ด๋–ค ํ”„๋กœํผํ‹ฐ์˜ ์œ„์น˜๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ”๋กœ KeyPath๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• !

- KeyPath๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„์ ‘์ ์œผ๋กœ ํŠน์ • ํƒ€์ž…์˜ ์–ด๋–ค ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ• ์ง€ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

KeyPath ํƒ€์ž…์€ AnyKeyPath๋ผ๋Š” ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค.

 

- ์ œ์ผ ๋งŽ์ด ํ™•์žฅ๋œ ํ‚ค ๊ฒฝ๋กœ ํƒ€์ž…์€ WritableKeyPath<Root, Value> ์™€ ReferenceWritableKeyPath<Root, Value> ํƒ€์ž…

- WritableKeyPath<Root, Value> : ๊ฐ’ ํƒ€์ž…์— ํ‚ค ๊ฒฝ๋กœ ํƒ€์ž…์œผ๋กœ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ ์šฉ

- ReferenceWritableKeyPath<Root, Value> : ์ฐธ์กฐํƒ€์ž…, ์ฆ‰ ํด๋ž˜์Šค ํƒ€์ž…์— ํ‚ค ๊ฒฝ๋กœ ํƒ€์ž…์œผ๋กœ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ ์šฉ

- ํ‚ค๊ฒฝ๋กœ๋Š” ์—ญ์Šฌ๋ž˜์‹œ์™€ ํƒ€์ž…, ๋งˆ์นจํ‘œ ๊ฒฝ๋กœ๋กœ ๊ตฌ์„ฑ๋จ => \ํƒ€์ž…์ด๋ฆ„.๊ฒฝ๋กœ.๊ฒฝ๋กœ.๊ฒฝ๋กœ (์—ฌ๊ธฐ์„œ ๊ฒฝ๋กœ๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„)

 

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

struct Stuff {
    var name: String
    var owner: String
}

print(type(of: \Person.name)) // ReferenceWritableKeyPath<Person,String>
print(type(of: \Stuff.name)) // WritableKeyPath<Stuff, String>

// ๊ธฐ์กด์˜ ํ‚ค ๊ฒฝ๋กœ์— ํ•˜์œ„ ๊ฒฝ๋กœ ๋ง๋ถ™์ด๊ธฐ 

let keyPath = \Stuff.owner
let nameKeyPath = keyPath.appending(path: \.name)

 

- ๊ฐ ์ธ์Šคํ„ด์Šค์˜ KeyPath ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์„œ๋“œ์— ํ‚ค ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

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

struct Stuff {
    var name: String
    var owner: String
}

let yagom = Person(name: "yagom")
let hana = Person(name: "hana")
let macbook = Stuff(name: "MacBook Pro", owner: yagom)
var iMac = Stuff(name: "iMac", owner: yagom)
let iPhone = Stuff(name: "iPhone", owner: hana)

let stuffNameKeyPath = \Stuff.name
let ownerkeyPath = \Stuff.owner

// \Stuff.owner.name ๊ณผ ๊ฐ™์€ ํ‘œํ˜„
let ownerNameKeyPath = ownerkeyPath.appending(path: \.name)

// ํ‚ค ๊ฒฝ๋กœ์™€ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
print(macbook[keyPath: stuffNameKeyPath]) // MacBook Pro
print(iMac[keyPath: stuffNameKeyPath]) // iMac
print(iPhone[keyPath: stuffNameKeyPath]) // iPhone

print(macbook[keyPath: ownerNameKeyPath]) // yagom
print(iMac[keyPath: ownerNameKeyPath]) // yagom
print(iPhone[keyPath: ownerNameKeyPath]) // hana

//  ํ‚ค ๊ฒฝ๋กœ์™€ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝ

iMac[keyPath: stuffNameKeyPath] = "iMac Pro"

// ์ƒ์ˆ˜๋กœ ์ง€์ •ํ•œ ๊ฐ’ ํƒ€์ž…๊ณผ ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋Š” ํ‚ค ๊ฒฝ๋กœ ์Šคํฌ๋ฆฝํŠธ๋กœ๋„ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค„์ˆ˜ ์—†๋‹ค.
// macbook ์˜ stuffName์€ ์œ„์ฒ˜๋Ÿผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

- KeyPath๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ํ”„๋กœํ† ์ฝœ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํƒ€์ž… ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ”๋Š”๋ฐ ๋งŽ์€ ๋„์›€์„ ์ค€๋‹ค๊ณ  ํ•ด์š”! 

- ๊ทธ๋ฆฌ๊ณ , ์• ํ”Œ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ‚ค-๊ฐ’ ์ฝ”๋”ฉ ๋“ฑ ๋งŽ์€ ๊ณณ์— KeyPath๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ, ์ž˜ ์•Œ์•„๋‘ก์‹œ๋‹ค !!

- KeyPath๋Š” ํƒ€์ž… ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋œ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ํ˜น์€ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์— ํ•œํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

TIP ! ) ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š” KeyPath์ธ \.self๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค ๊ทธ ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” KeyPath๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” KeyPath์—์„œ ํƒ€์ž… ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 


Swift 5.2 ~ 

- (SomeType) -> Value ํƒ€์ž…์˜ ํด๋กœ์ €๋ฅผ ํ‚ค ๊ฒฝ๋กœ ํ‘œํ˜„์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

struct Person {
    let name: String
    let nickname: String?
    let age: Int
    
    var isAdult: Bool {
        return age > 18
    }
}

let yagom: Person = Person(name: "yagom", nickname: "bear", age: 100)
let hana: Person = Person(name: "hana", nickname: "na", age: 100)
let happy: Person = Person(name: "happy", nickname: nil, age: 3)

let family: [Person] = [yagom, hana, happy]
let names: [String] = family.map(\.name)
let nicknames: [String] = family.compactMap(\.nickname)
let adults: [String] = family.filter(\.isAdult).map(\.name)

- family ๋ฐฐ์—ด์€ [Person] ํƒ€์ž…์ด๊ณ , ์ด ํƒ€์ž…์˜ map์€ (Person) -> T๋ฅผ, compactMap์€ (Person) -> T? ๋ฅผ, filter๋Š” (Person) -> Bool ํƒ€์ž…์˜ ํด๋กœ์ €๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์„ ๊ฒƒ.

- ์ด์— ๋”ฐ๋ผ, \.name ํ‘œํ˜„์€ (Person) -> T ํƒ€์ž…์˜ ํด๋กœ์ €๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ํ‘œํ˜„ํ•จ. ์ด๋Š” ํด๋กœ์ € ํ‘œํ˜„์ธ { $0.name } ์˜ ํ‘œํ˜„๊ณผ ๊ฐ™์€ ์—ญํ•  !

- .nickname๊ณผ .isAdult ํ‘œํ˜„๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

 


๋ฉ”์„œ๋“œ

- ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ์€ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์บก์Šํ™”ํ•œ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ.

- ํƒ€์ž… ์ž์ฒด์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ํƒ€์ž… ๋ฉ”์„œ๋“œ ์ •์˜ ๊ฐ€๋Šฅ.

- ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋….

- ์Šค์œ„ํ”„ํŠธ์˜ ํŠน์ด์  : ๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค !

 

 


 

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ = ํŠน์ • ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ํ•จ์ˆ˜

- ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰

- ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ ํŠน์ • ํƒ€์ž… ๋‚ด๋ถ€์— ๊ตฌํ˜„ = ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ.

 

// ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
class LevelClass {
    // ํ˜„์žฌ ๋ ˆ๋ฒจ์„ ์ €์žฅํ•˜๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var level: Int = 0 {
        // ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์‹œ์ž 
        didSet {
            print(level)
        }
    }
    
    // ๋ ˆ๋ฒจ์ด ์˜ฌ๋ž์„ ๋•Œ ํ˜ธ์ถœํ•˜ ใ„น๋ฉ”์„œ๋“œ 
    func levelUp() {
        level += 1
    }
    
    // ๋ ˆ๋ฒจ์ด ๊ฐ์†Œํ•  ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func levelDown() {
        level -= 1
        if level < 0 {
            reset()
        }
    }
    
    // ํŠน์ • ๋ ˆ๋ฒจ๋กœ ์ด๋™ํ•  ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ
    func jumpLevel(to: Int) {
        level = to
    }
    // ๋ ˆ๋ฒจ์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ 
    func reset() {
        level = 0
    }
}

var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp()

levelClass์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” level ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

-> ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ˆ˜์ •ํ• ๋•Œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์–ด์š”. ํ•˜์ง€๋งŒ, ๊ตฌ์กฐ์ฒด๋‚˜ ์—ด๊ฑฐํ˜• ๋“ฑ์€ ๊ฐ’ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ฉ”์„œ๋“œ ์•ž์— mutating ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค !

 

 


self ํ”„๋กœํผํ‹ฐ

- ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋œ self ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ž๋ฐ”์˜ this์™€ ๋น„์Šทํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ์—์š” !

- self ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋” ๋ช…ํ™•ํžˆ ์ง€์นญํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

- level ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์Šค์œ„ํ”„ํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜, ๊ทธ ๋‹ค์Œ์— ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ์•„์„œ level์ด ๋ฌด์—‡์„ ์ง€์นญํ•˜๋Š”์ง€ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค. 

=> ๊ทธ๋Ÿฐ๋ฐ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด level์ธ๋ฐ ์ด level ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์ธ level์„ ์ง€์นญํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ? self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์ค๋‹ˆ๋‹ค.

 

class LevelClass {
	var level: Int = 0 
    
    func jumpLevel(to level: Int) {
    	print("Jump to \(level)")
        self.level = level
    }
}

- ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, jumpLevel ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๊ณผ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์ด ๊ฐ™์Šต๋‹ˆ๋‹ค.

- ๊ทธ๋Ÿด ๋•Œ level = level ์ด๋ผ๊ณ  ์ ์–ด์ฃผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ขŒ์ธก์˜ level์€ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์˜ level์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜ level์„ ์ง€์นญํ•˜๋Š” ๊ฑธ๋กœ ํŒ๋‹จํ•˜๊ฒ ์ฃ  ! ( ์œ„์˜ ์œ ์ถ” ์ˆœ์„œ์— ๋”ฐ๋ผ.. )

- ๊ทธ๋ž˜์„œ ์ขŒ์ธก์˜ level ๋Œ€์‹  self.level์„ ์ ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋ผ๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

 

๋˜, self  ํ”„๋กœํผํ‹ฐ์˜ ๋‹ค๋ฅธ ์šฉ๋„๋Š” ๊ฐ’ ํƒ€์ž… ์ธ์Šคํ„ด์Šค ์ž์ฒด์˜ ๊ฐ’์„ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

=> ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ self ํ”„๋กœํผํ‹ฐ์— ๋‹ค๋ฅธ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ๊ตฌ์กฐ์ฒด๋‚˜ ์—ด๊ฑฐํ˜• ๋“ฑ์€ self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๊ธฐ ์ž์ฒด๋ฅผ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š” !

 

class LevelClass {
    var level: Int = 0
    
    func reset() {
        // ์˜ค๋ฅ˜ ! 
        self = LevelClass()
    }
}

struct LevelStruct {
    var level: Int = 0
    
    mutating func levelUp() {
		level += 1
    }
    
    mutating func reset() {
        self = LevelStruct()
    }
}

enum OnOffSwitch {
    case on, off
    mutating func nextState() {
        self = self == .on ? .off : .on
    }
}

var toggle: OnOffSwitch = OnOffSwitch.off
toggle.nextState()
print(toggle) // on

 

 


 

์ธ์Šคํ„ด์Šค๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋Š” ๋ฉ”์„œ๋“œ

- ํŠน์ • ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌธ๋ฒ•์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ์ธ์Šคํ„ด์Šค๋ฅผ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด callAsFunction์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

- ์ด ๋ฉ”์„œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ฐœ์ˆ˜์— ์ œํ•œ ์—†์ด ์›ํ•˜๋Š” ๋งŒํผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- mutating ํ‚ค์›Œ๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , throws์™€ rethrows๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
struct Puppy {
    var name: String = "ํฐ๋‘ฅ์ด"
    
    func callAsFunction() {
        print("๋ฉ๋ฉ")
    }
    
    func callAsFunction(destination: String) {
        print("\(destination)์œผ๋กœ ๋‹ฌ๋ ค๊ฐ‘๋‹ˆ๋‹ค.")
    }
}

var myPuppy: Puppy = Puppy()
myPuppy.callAsFunction()
myPuppy()
myPuppy.callAsFunction(destination: "์ง‘")
myPuppy(destination: "์ง‘")

 

- Puppy ๊ตฌ์กฐ์ฒด์— ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ callAsFunction ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…, ์ „๋‹ฌ์ธ์ž ๋ ˆ์ด๋ธ”, ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ์•ˆ ๊ฒน์น˜๊ฒŒํ•˜๋ฉด ์›ํ•˜๋Š” ๋งŒํผ ๊ฐ€๋Šฅํ•ด์š”. 

- myPuppy() ์™€ myPuppy.callAsFunction ์ด ๊ฐ™์€ ํ‘œํ˜„. ํ•˜์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ์™ธ์— ํ•จ์ˆ˜ํ‘œํ˜„์œผ๋กœ๋Š” ์‚ฌ์šฉํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

- ์ฆ‰, let function: (String) -> Void = myPuppy(destination:) ์ฒ˜๋Ÿผ์€ ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  let function: (String) -> Void = myPuppy.callAsFunction(destination:) ์œผ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•ด์š”.

 


ํƒ€์ž… ๋ฉ”์„œ๋“œ = ํƒ€์ž… ์ž์ฒด์— ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ

 

- ๋ฉ”์„œ๋“œ์—๋„ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ ํƒ€์ž… ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ํƒ€์ž…๋ฉ”์„œ๋“œ๋Š” ํƒ€์ž… ์ž์ฒด์— ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

- ํ”ํžˆ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ง€์นญํ•˜๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

- static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ž… ๋ฉ”์„œ๋“œ์ž„์„ ๋‚˜ํƒ€๋‚ด์ฃผ๊ณ ์š”.

- ํด๋ž˜์Šค์˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” static ํ‚ค์›Œ๋“œ์™€ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ static์œผ๋กœ ์ •์˜ํ•˜๋ฉด ์ƒ์† ํ›„ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , class๋กœ ์ •์˜ํ•˜๋ฉด ์ƒ์† ํ›„ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•ด์š” !

 

class AClass {
    static func staticTypeMethod() {
        print("์—์ด ํด๋ž˜์Šค ํƒ€์ž…๋ฉ”์„œ๋“œ")
    }
    
    class func classTypeMethod() {
		print("์—์ด ํด๋ž˜์Šค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ")
    }
}

class BClass: AClass {
    override class func classTypeMethod() {
        print("๋น„ ํด๋ž˜์Šค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ")
    }
    // ํƒ€์ž…๋ฉ”์„œ๋“œ๋Š” ์žฌ์ •์˜ ๋ถˆ๊ฐ€๋Šฅ
}

AClass.staticTypeMethod() // ์—์ด ํด๋ž˜์Šค ํƒ€์ž…๋ฉ”์„œ๋“œ
AClass.classTypeMethod() // ์—์ด ํด๋ž˜์Šค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ
BClass.classTypeMethod() // ๋น„ ํด๋ž˜์Šค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ

- ๋˜, ํƒ€์ž… ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ self ํ”„๋กœํผํ‹ฐ๊ฐ€ ํƒ€์ž… ๊ทธ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. 

- ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ๋Š” self๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ํƒ€์ž… ๋ฉ”์„œ๋“œ์˜ self๋Š” ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

- ๊ทธ๋ž˜์„œ ํƒ€์ž… ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ํƒ€์ž…์ด๋ฆ„๊ณผ self๋Š” ๊ฐ™์€ ๋œป์ด์—์š”.

- ํƒ€์ž… ๋ฉ”์„œ๋“œ์—์„œ self ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ํ”„๋กœํผํ‹ฐ ๋ฐ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// ์‹œ์Šคํ…œ ์šฉ๋Ÿ‰์€ ํ•จ ๊ธฐ๊ธฐ์—์„œ ์œ ์ผํ•œ ๊ฐ’
struct SystemVolume {
    // ํƒ€์ž…ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ์ œ๋‚˜ ์œ ์ผํ•œ ๊ฐ’์ด ๋œ๋‹ค.
    static var volume: Int = 5
    
    // ํƒ€์ž…ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
    static func mute() {
        self.volume = 0 // SystemVolume.volume ๊ณผ ๊ฐ™์€ ํ‘œํ˜„, Self.volume๊ณผ๋„ ๊ฐ™์€ํ‘œํ˜„
    }
}

// ๋‚ด๋น„๊ฒŒ์ด์…˜ ์—ญํ• ์€ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
class Navigation {
    // ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ์Œ๋Ÿ‰์„ ๋”ฐ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    var volume: Int = 5
    
    // ๊ธธ ์•ˆ๋‚ด ์Œ์„ฑ ์žฌ์ƒ
    func guideWay() {
        // ๋‚ด๋น„๊ฒŒ์ด์…˜ ์™ธ ๋‹ค๋ฅธ ์žฌ์ƒ์› ์Œ์†Œ๊ฑฐ
        SystemVolume.mute()
    }
    
    // ๊ธธ ์•ˆ๋‚ด ์Œ์„ฑ ์ข…๋ฃŒ
    func finishGuideWay() {
        // ๊ธฐ์กด ์žฌ์ƒ์› ์Œ์„œ ใ…‡๋ณต๊ตฌ
        SystemVolume.volume = self.volume
    }
}

SystemVolume.volume = 10
let myNavi: Navigation = Navigation()

myNavi.guideWay()
print(SystemVolume.volume) // 0

myNavi.finishGuideWay()
print(SystemVolume.volume) // 5

 

 

์˜ค๋Š˜์€ Struct , Class, Property, Method ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ›‘์–ด๋ดค๋Š”๋ฐ์š”.

์•„๋Š” ๋‚ด์šฉ๋„ ์žˆ์—ˆ๊ณ , ๋‹ค์‹œ๋ด์„œ ์ƒ๊ธฐ์‹œํ‚จ ๋‚ด์šฉ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

๋‹ค์Œ์—๋Š” ๋” ๊นŠ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณผ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค !

 

ํƒ€์ž… ๋ฉ”์„œ๋“œ์—์„œ class func๊ณผ static func์˜ ์ฐจ์ด๋ฅผ ์ž์„ธํžˆ ์ฐพ์•„๋ณด๋ ค๊ตฌ์š”.

๊ทธ๋ฆฌ๊ณ , static property๋‚˜ method๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กฐ๋งŒ๊ฐ„ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š” !

 

 

์ถœ์ฒ˜ : ๋ชจ๋“  ๋‚ด์šฉ์€ ์•ผ๊ณฐ๋‹˜์˜ Swift ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฑ…์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Comments