Search
Duplicate

Immutable

์ƒ์„ฑ์ผ
2023/06/30 03:53
ํƒœ๊ทธ
Grammar

Immutable

โ€ข
immutable
โ—ฆ
let ์ฒ˜๋Ÿผ ๋ถˆ๋ณ€์ 
โ€ข
mutable
โ—ฆ
var ์ฒ˜๋Ÿผ ๊ฐ€๋ณ€์ 
struct Town { let name: String var citizens: [String] var resources: [String : Int] init(citizens: [String], name: String, resources: [String : Int]) { self.citizens = citizens self.name = name.uppercased() self.resources = resources } func harvestRice() { resources["Rice"] = 100 // self.resources["Rice"] = 100๊ณผ ๋™์ผ } }
Swift
๋ณต์‚ฌ
โ€ข
์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, struct ๋‚ด๋ถ€์—์„œ ์ €๋ ‡๊ฒŒ ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ, โ€˜Cannot assign through subscript: โ€˜selfโ€™ is immutableโ€™ ์ด๋ผ๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
โ€ข
struct ๋‚ด๋ถ€์—์„œ โ€œSelfโ€๊ฐ€ ์ž๋™์ ์œผ๋กœ let์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
โ€ข
์œ„ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ์€ self.resources[โ€Riceโ€] = 100 ๊ณผ ๋™์ผํ•˜๊ณ , self ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
โ€ข
struct ๋‚ด๋ถ€์—์„œ โ€œselfโ€๊ฐ€ ์ž๋™์ ์œผ๋กœ let์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
โ€ข
์œ„ ํ•จ์ˆ˜์˜ ์ฝ”๋“œ ๋ธ”๋Ÿญ์€ self.resources[โ€Riceโ€] = 100 ๊ณผ ๋™์ผํ•˜๊ณ , self ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
โ€ข
๋งŒ์•ฝ struct ๋‚ด๋ถ€์—์„œ property๋ฅผ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, func ์•ž์— โ€˜mutatingโ€™ keyword๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค(๋งˆํ‚น)
struct Town { let name: String var citizens: [String] var resources: [String : Int] init(citizens: [String], name: String, resources: [String : Int]) { self.citizens = citizens self.name = name.uppercased() self.resources = resources } mutating func harvestRice() { resources["Rice"] = 100 // self.resources["Rice"] = 100๊ณผ ๋™์ผ } }
Swift
๋ณต์‚ฌ
โ€ข
์ด๋ ‡๊ฒŒ mutating ์„ ๋งˆํ‚นํ•จ์œผ๋กœ์จ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
mutating ์œผ๋กœ ๋งˆํ‚น์„ ํ•˜๊ฒŒ ๋˜๋ฉด โ€˜selfโ€™ ๊ฐ€ โ€˜varโ€™ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ณ , ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์—์„œ ๊ตฌ์กฐ์ฒด์˜ property๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
struct Town { let name: String var citizens: [String] var resources: [String : Int] init(citizens: [String], name: String, resources: [String : Int]) { self.citizens = citizens self.name = name.uppercased() self.resources = resources } mutating func harvestRice() { resources["Rice"] = 100 // self.resources["Rice"] = 100๊ณผ ๋™์ผ } } var myTown = Town(citizens: ["Angela", "Jack"], name : "Mytown", resources : ["Wool" : 82]) myTown.harvestRice() print(myTown.resources)
Swift
๋ณต์‚ฌ
โ€ข
์œ„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด harvestRice() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
โ€ข
์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ myTown์ด var ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ์ผ์ด๋ฉฐ, ๋งŒ์•ฝ let myTown๊ณผ ๊ฐ™์ด let ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด mutating ๋งˆํ‚นํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ํ•ด๋„, ์„ ์–ธ ์ดํ›„์— struct property๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.