์๋ ํ์ธ์, ๊ฐ์์๋๋น. ์ด๋ฒ ํฌ์คํ ์ ํ๋กํผํฐ์ ๋ํด์ ์ ๊น ์ง๊ณ ๋์ด๊ฐ๋ ค๊ณ ํฉ๋๋ค. ์ด์ ํฌ์คํ ์์ ๊ฐ์ฒด๋ ํด๋์ค ๋ด๋ถ์ ํ๋กํผํฐ์ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค๊ณ ๊ณต๋ถํ๋๋ฐ์, ๋ฉ์๋๋ ์ฆ func ํจ์!! ์ฃ .. ๊ทธ๋ผ ๊ณผ์ฐ ํ๋กํผํฐ์ ์ญํ ์ ๋ฌด์์ผ๊น์?? ์์๋ณด๋๋ก ํฉ์๋ค!
ํ๋กํผํฐ(property) ๋?
ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ๋๋ ์ด๊ฑฐํ ๋ฑ์ ๊ด๋ จ๋ ๊ฐ์ ์๋ฏธํ๋ค. ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ์์๋ ๋ณ์ ๋ฐ ์์ฑ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
โท ํ๋กํผํฐ ์ข ๋ฅ
- ์ ์ฅ ํ๋กํผํฐ
- ์ธ์คํด์ค์ ๋ณ์ ๋๋ ์์
- ์ฐ์ฐ ํ๋กํผํฐ
- ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ํน์ ์ฐ์ฐ์ ์คํํ๋ ๊ฒฐ๊ณผ๊ฐ
- ํ์
ํ๋กํผํฐ
- ํน์ ์ธ์คํด์ค์์ ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋ ํน์ ํ์ ์์ ์ฌ์ฉ๋๋ ํ๋กํผํฐ
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" (๊ฐ๋ณ๊ฒฝ๋จ!)
์ด๋ ๊ฒ ํ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์์ ํด๋์ค๋ฅผ ํ ๋นํด ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.