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

Swift/Swift BASIC

[Swift] ๊ธฐ์ดˆ ๋ฌธ๋ฒ• - ํ”„๋กœํผํ‹ฐ(property)

๊ฐ์ž ๐Ÿฅ” 2022. 1. 17. 13:15
๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž„๋‹ˆ๋‹น. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด์„œ ์ž ๊น ์ง‘๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๊ฐ์ฒด๋‚˜ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ์š”, ๋ฉ”์„œ๋“œ๋Š” ์ฆ‰ func ํ•จ์ˆ˜!! ์ฃ .. ๊ทธ๋Ÿผ ๊ณผ์—ฐ ํ”„๋กœํผํ‹ฐ์˜ ์—ญํ• ์€ ๋ฌด์—‡์ผ๊นŒ์š”?? ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค!

 

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ 30๊ฐœ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” iOS์•ฑ๊ฐœ๋ฐœ with Swift ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
 

ํŒจ์ŠคํŠธ์บ ํผ์Šค [์ง์žฅ์ธ ์‹ค๋ฌด๊ต์œก]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์˜์ƒํŽธ์ง‘, UX/UI, ๋งˆ์ผ€ํŒ…, ๋ฐ์ดํ„ฐ ๋ถ„์„, ์—‘์…€๊ฐ•์˜, The RED, ๊ตญ๋น„์ง€์›, ๊ธฐ์—…๊ต์œก, ์„œ๋น„์Šค ์ œ๊ณต.

fastcampus.co.kr

 

ํ”„๋กœํผํ‹ฐ(property) ๋ž€?

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

โ–ท ํ”„๋กœํผํ‹ฐ ์ข…๋ฅ˜

  1. ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    • ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜
  2. ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ
    • ๊ฐ’์„ ์ €์žฅํ•œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’
  3. ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
    • ํŠน์ • ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํŠน์ • ํƒ€์ž…์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ

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

์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

1.1) struct ๊ตฌ์กฐ์ฒด์—์„œ์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ

struct Dog {
	var name: String
    let gender: String
}

var dog = Dong(name: "potato", gender: "Male")
print(dog)
//prints --> Dog(name: "potato", gender: "Male")

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

์ด์ œ๋Š” ๊ทธ๋Ÿผ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ๋ณด์ž.

dog.name = "albert"
dog.gender = "Female"

// ERROR : Cannot assign to property: 'gender' is a 'let' constant

์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ ๊นŒ? ๋‹น์—ฐํ•˜๋‹ค. ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์— let ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ, ์ƒ์ˆ˜(let)์œผ๋กœ ์„ ์–ธ๋œ ์ธ์Šคํ„ด์Šค ๋˜ํ•œ ๊ฐ’ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

let dog2 = Dog(name: "andy", gender: "Male")
dog2.name = "abc"

// Error~~!

์ด๋ ‡๊ฒŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋˜๋ฉด, ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๋„ ๋ชจ๋‘ ์ƒ์ˆ˜ํ™”๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. 

 

1.2) class ํด๋ž˜์Šค์—์„œ์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ

์ง€๊ธˆ์€ ๋ชจ๋“  ์˜ˆ์‹œ๋ฅผ struct ๊ตฌ์กฐ์ฒด์—์„œ ์‚ดํŽด๋ณด์•˜๋‹ค. ๊ทธ๋Ÿผ ํด๋ž˜์Šค๋Š” ์–ด๋–จ๊นŒ? ํด๋ž˜์Šค๋Š” ์ฐธ์ดˆํƒ€์ž…์ด๋ผ ๊ตฌ์กฐ์ฒด์™€๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ํด๋ž˜์Šค์ธ์Šคํ„ด์Šค๋Š” ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•ด๋„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

class Cat {
	var name: String
    let gender: String
    
    init(name: String, gender: Stirng) {
    	self.name = name
        self.gender = gender
	}
}

let cat = Cat(name: "jason", gender: "male")
cat.name = "albert"
print(cat.name)
// prints "albert"

๋งˆ์ง€๋ง‰์— ์ƒ์ˆ˜๋กœ ์„ ์–ธ๋œ cat์˜ ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ struct๋Š” valueํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋ผ๊ณ  ํ•ด๋„ ๊ฐ’๋ณ€๊ฒฝ์ด ์•ˆ๋˜์ง€๋งŒ, class๋Š” ์ฐธ์กฐํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.


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

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

struct Stock {
	var averagePrice: Int
    var quantity: Int
    
    // purchasePrice๊ฐ€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ
    var purchasePrice: Int {
    	get {
        	return averagePrice * quantity
		}
        
        set(newPrice) {
        	averagePrice = newPrice / quantity
	}
}

Getter ๋ถ€๋ถ„ ) purchasePrice ๋‚ด๋ถ€์— ๋งค์ž…๊ฐ€๊ฒฉ (ํ‰๊ท ๊ฐ€ * ์ˆ˜๋Ÿ‰) ์—ฐ์‚ฐ์„ ์ž…๋ ฅํ•˜์—ฌ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด, stock์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด์—์„œ purchasePrice๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ averagePrice์™€ quantity๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ๋œ ๊ฐ’์ด purchasePrice์— ์ €์žฅ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค. 

Setter ๋ถ€๋ถ„ ) ์ƒˆ๋กœ์šด ๊ฐ’์ด ์„ค์ •๋˜๋ฉด Set์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ purchasePrice๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ purchasePrice์— quantity๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ‰๊ท ๋‹จ๊ฐ€๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•ด์ฃผ๋„๋ก ํ–ˆ๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์„œ newPrice๋Š” ๋ณ€๊ฒฝ๋œ purchasePrice๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด๋‹ค. 

์ด๋ ‡๊ฒŒ getter setter๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์—ฐ์‚ฐํ•˜๊ณ  ํ”„๋กœํผํ‹ฐ์— ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์—ฐ์‚ฐํ˜• ํ”„๋กœํผํ‹ฐ ๋ผ๊ณ  ํ•œ๋‹ค. 

var stock = Stock(averagePrice: 2000, quantity: 30)
print(stock)
// prints "Stock(averagePrice: 2000, quantity: 30)"

print(stock.purchasePrice)
// prints 6000 (์—ฐ์‚ฐ๋˜์–ด์ง„ ๊ฐ’์ด ์ถœ๋ ฅ!)

stock.purchasePrice = 3000
print(stock.averagePrice)
//prints 1000

๋งˆ์ง€๋ง‰ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ๋ณด๋ฉด purchasePrice๋ฅผ 3000์œผ๋กœ ๋ฐ”๊พธ๋‹ˆ, averagePrice๊ฐ€ 1000์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์ด๋Š” purchasePrice๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, get๊ณผ set ๋ถ€๋ถ„์ด ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด์„œ averagePrice ๊ฐ’๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์ธ์Šคํ„ด์Šค ๋‚ด์™ธ๋ถ€์˜ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด์„œ ์ ์ ˆํ•œ ๊ฐ’์„ ๋Œ๋ ค์ฃผ๋Š” ์ ‘๊ทผ์ž ์—ญํ• ์ด๋‚˜, ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ์„ค์ •์ž์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. set์„ ์ง€์šฐ๊ณ  get๋งŒ ๊ตฌํ˜„ํ•ด์„œ ์ฝ๊ธฐ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. set์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’ ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (์ฝ๊ธฐ์ „์šฉ) ๋˜ set์„ ์„ค์ •ํ• ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด default๊ฐ’์œผ๋กœ newValue ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. 


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

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์—†์ด ๊ฐ์ฒด ๋‚ด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ”„๋กœํผํ‹ฐ ํƒ€์ž… ์ž์ฒด์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

struct SomeStructure {
	static var storedTypeProperty = "Some value." //์Šคํ† ์–ด
    static var computedTypeProperty: Int {
    	return 1
	}
}

SomeStructure.computedTypeProperty
SomeStructure.storedTypeProperty

// ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
SomeStructure.storedTypeProperty = "hello"
print(SomeStructure.storedTypeProperty)
// prints "hello" (๊ฐ’๋ณ€๊ฒฝ๋จ!)

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

๋ฐ˜์‘ํ˜•