Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„ (property observer)

๊ฐ์ž ๐Ÿฅ” 2022. 1. 19. 02:47
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”! ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ• ๊ฒŒ์š”! ๊ทธ๋Ÿผ go!!

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„(Property Observer) ๋ž€?

ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ, "์ €์žฅ ํ”„๋กœํผํ‹ฐ"์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ €์žฅํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์—ฌ๊ธฐ click!) ์ƒˆ ๊ฐ’์˜ ์†์„ฑ์ด ํ˜„์žฌ ๊ฐ’๊ณผ ๋™์ผํ•˜๋”๋ผ๋„ ์†์„ฑ ๊ฐ’์ด ์„ค์ •๋˜๋ฉด ํ˜ธ์ถœ ๋œ๋‹ค.

์ฆ‰, ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ž€ ๊ด€์ฐฐ์ž! ๋ผ๋Š” ๋œป์ธ๋ฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€์ฐฐํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์— ๋ˆ„๊ฐ€ ๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ํ•˜๋ฉด์„œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„์˜ ์˜ต์…˜

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค.

1) willSet: ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.

willSet์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ์ง์ „์— ์ƒˆ๋กœ ์ €์žฅ๋  ๊ฐ’์ด 'ํŒŒ๋ผ๋ฏธํ„ฐ'๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ๊ด„ํ˜ธ๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ newValue๋กœ ์ž๋™ ์‚ฌ์šฉ๋œ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

var name: String = 'name' {
	willSet(newName) {
    	print("ํ˜„์žฌ์ด๋ฆ„ = \(name), ๋ฐ”๊พผ์ด๋ฆ„ = \(newName)")
	}
}

newName ์ด๋ผ๊ณ  ๋‚ด๊ฐ€ ์ง€์ •ํ•ด์ฃผ์—ˆ์ง€๋งŒ, ์ด๊ฑธ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด newValue ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์—์„œ ํ™•์ธํ•ด๋ณด์ž.

var name: String = "unknown" {
	willSet {
    	print("ํ˜„์žฌ์ด๋ฆ„ = \(name), ๋ฐ”๊พผ์ด๋ฆ„ = \(newValue)")
	}
}

 

์ด๋ ‡๊ฒŒ willSet ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ”๊ฟ€๋•Œ ์ž‘๋™ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด name์„ ๋ฐ”๊พธ๊ฒŒ ๋ ๋•Œ ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋กœ ์ธํ•ด์„œ ๋‚ด๊ฐ€ print๋กœ ์„ค์ •ํ•ด๋†“์€ ๊ตฌ๋ฌธ์ด ์ถœ๋ ฅ๋œ๋‹ค.

name = "potato"
//prints (ํ˜„์žฌ์ด๋ฆ„ = unknown, ๋ฐ”๊พผ์ด๋ฆ„ = potato")

 

2) didSet: ์ƒˆ ๊ฐ’์ด ์ €์žฅ๋œ ์งํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.

didSet ์˜ต์ €๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ฐ’์ด ์ €์žฅ๋œ ์งํ›„์— ์ด์ „ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ๊ด„ํ˜ธ๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” oldValue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ธฐ๋ณธํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

var name: String = "unknown"{
	didSet(oldName) {
    	print(ํ˜„์žฌ์ด๋ฆ„ = \(name), ๋ฐ”๊พผ์ด๋ฆ„ = \(oldName)")
	}
}

์ด๊ฒƒ๋„ ์œ„์—์„œ ๋ดค๋˜ willSet๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ oldName์ด๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์ง€ ์•Š์•„๋„, ๋ฐ”๋กœ oldName์ด๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

didSet๋„ ์‹ค์ œ name์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์งํ›„์— ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์—์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, name์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐ”๋กœ ๊ฐ’์ด๋ณ€๊ฒฝ๋œ ์งํ›„์— ์‹คํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋ณ€๊ฒฝ๋œ ์งํ›„๋ผ ํ˜„์žฌ์ด๋ฆ„์ธ name์—๋Š” ๋ฐ”๋€Œ์–ด์ง„ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , oldName์—๋Š” ๋ฐ”๋กœ ์ง์ „์— ๋ฐ”๊พธ๊ธฐ ์ „์˜ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ„๋‹ค.

name = "potato"
//prints (ํ˜„์žฌ์ด๋ฆ„ = potato, ๋ฐ”๊พผ์ด๋ฆ„ = unknown")

 

3) willSet๊ณผ didSet ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๊ธฐ

var name: String = "unknown" {
	willSet {
    	print("ํ˜„์žฌ์ด๋ฆ„ = \(name), ๋ฐ”๊พผ์ด๋ฆ„ = \(newValue)")
	}
    didSet {
    	print("ํ˜„์žฌ์ด๋ฆ„ = \(name), ๋ฐ”๊พธ๊ธฐ ์ „ ์ด๋ฆ„ = \(oldValue)")
	}
}

ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. willSet ๋จผ์ € ์‹คํ–‰
  2. ์ €์žฅ ํ”„๋กœํผํ‹ฐ name ๊ฐ’ ๋ณ€๊ฒฝ
  3. didSet ์‹œใ„นํ–‰

 

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

๋ฐ˜์‘ํ˜•