๊ตฌ์กฐ์ฒด
๐งโ๐ป์ด๋ฒ Swift ์๊ฐ์ ๋ฐฐ์๋ณผ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ๐จ๐ปโ๐ป
- ๊ตฌ์กฐ์ฒด ๋ง๋๋ ๋ฐฉ๋ฒ
- ๋์ ๊ณ์ฐ ๋ฐฉ๋ฒ
- ์์ฑ ๊ด์ฐฐ์
1. ๊ตฌ์กฐ์ฒด ์์ฑ
swift์์๋ ๊ตฌ์กฐ์ฒด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋ณ์์ ๊ธฐ๋ฅ์ผ๋ก ๋ง๋ค์ด์ง ์ฌ์ฉ์ ์ ์์ ๋ํ ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ์ ๋ง๋ค ์ ์๋ค.
struct Album {
let title: String
let artist: String
let year: Int
func printSummary() {
print("\(title) (\(year)) by \(artist)")
}
}
์ ์์ ๋ฅผ Album์ด๋ผ๋ ๊ตฌ์กฐ์ฒด์ ๋ ๊ฐ์ ๋ฌธ์์ด ์์์ ์ ์ ์์๊ฐ ์๋ ์๋ก์ด ์ ํ์ ๊ตฌ์กฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ํตํด String๊ณผ Int์ ๊ฐ์ด ์์ฑ, ํ ๋น, ๋ณต์ฌ ์์ ๋ค๋ ๋คํ ์ ์๋ค. ์ง๊ธ ์์ ์์๋ ์จ๋ฒ์ ๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ช ๊ฐ์ ์จ๋ฒ์ ์๋ฅผ ๋ค์ด ๋ง๋ค์ด๋ณด๊ณ ๊ทธ๊ฒ์ ์ถ๋ ฅํ๊ณ ํจ์๋ก ํธ์ถํด ๋ณด์.
let red = Album(title: "Red", artist: "Taylor Swift", year: 2012)
let wings = Album(title: "Wings", artist: "BTS", year: 2016)
print(red.title)
print(wings.artist)
red.printSummary()
wings.printSummary()
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์ Album๊ตฌ์กฐ์ฒด์ ์ ์๋ ์์๋๋ก ์ ๋ชฉ, ๊ฐ์๋ช , ๋ ๋๋ฅผ ์ ์ง์ผ์ ๊ฐ ์์์ ๋ํ ๊ฐ์ ํ ๋นํ๋ฉด ๋๋ค.
red์ wings ๋ชจ๋ Album๊ตฌ์กฐ์ฒด์์ ์ ๊ณต๋์ง๋ง ์ผ๋จ ์์ฑํ๋ฉด ๋ ๊ฐ์ ๋ฌธ์์ด์ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ถ๋ฆฌ๋๋ค.
๊ทธ๋ฆฌ๊ณ printSummary()๋ฅผ ํตํด ์์ชฝ์์ ํจ์๋ก ์ ์ธํด ๋์๊ธฐ ๋๋ฌธ์ red.printSummary()์ ๊ฒฐ๊ณผ๋ "Red(2012) by Taylor Swift"์ ๊ฐ์ด ์ถ๋ ฅ๋๊ฒ ๋ ๊ฒ์ด๋ค.
๊ณ์ํด์ ์ด๋ฒ ํํธ์์๋ ๊ตฌ์กฐ์ฒด์ ๋ํด ์์ธํ ๊ณต๋ถํ๊ฒ ์ง๋ง ๊ฐ๋จํ ๊ตฌ์กฐ์ฒด์ ๊ท์น๊ณผ ๊ฐ๋ ์ ์ธ ์ค๋ช ์ ์ถ๊ฐํ์๋ฉด
- ๊ตฌ์กฐ์ฒด์ ์ํ๋ ๋ณ์์ ์์๋ฅผ ์์ฑ์ด๋ผ๊ณ ํ๋ค.
- ๊ตฌ์กฐ์ฒด์ ์ํ๋ ํจ์๋ฅผ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
- ๊ตฌ์กฐ์ฒด์์ ์์ ๋๋ ๋ณ์๋ฅผ ๋ง๋ค ๋ ์ด๊ฒ์ ์ธ์คํด์ค๋ผ๊ณ ํ๋ค.
2. ์์ฑ ๊ฐ ๋์ ๊ณ์ฐ๋ฒ
๊ตฌ์กฐ์ฒด๋ ๋ ๊ฐ์ง ์ข ๋ฅ์ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ์ ์ฅ ์์ฑ์ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ ์ฅํ๋ ๋ณ์ ๋๋ ์์์ด๋ค.
๊ณ์ฐ๋ ์์ฑ์ ์ ๊ทผํ ๋๋ง๋ค ๋์ ์ผ๋ก ์์ฑ ๊ฐ์ ๊ณ์ฐํ๋ค. ์ฆ ์ ์ฅ๋ ์์ฑ์ฒ๋ผ ์ ๊ทผ๋์ง๋ง ํจ์์ฒ๋ผ ์๋ํ๋ค๋ ๊ฒ์ด๋ค.
struct Employee {
let name: String
var vacationRemaining: Int
}
var archer = Employee(name: "Sterling Archer", vacationRemaining: 14)
archer.vacationRemaining -= 5
print(archer.vacationRemaining)
archer.vacationRemaining -= 3
print(archer.vacationRemaining)
๊ตฌ์กฐ์ฒด Employee์์๋ ํด๋น ์ง์์ ๋จ์ ํด๊ฐ ์ผ์๋ฅผ ๊ณ์ฐํด ์ฃผ๋ ๊ฒ์ธ๋ฐ ๋ง์ฝ ์ ๋ฐ ์์ผ๋ก ๊ทธ๋๋ก ๋๋ฉด 14์ผ์ ํด๊ฐ๋ฅผ ํ ๋นํ ๋ค์ ์ผ์์ ๋ฐ๋ผ ์ฐจ๊ฐํ์ง๋ง ๊ทธ๋ ๊ฒ ํด๋ฒ๋ฆฌ๋ฉด ์๋ ๋ถ์ฌ๋ ์ผ์๊ฐ ์์ค๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด ๋ง๊ณ ์๋์ ๊ฐ์ด ๋ฐ๊ฟ์ ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ๋๋ก ์กฐ์ ํด ๋ณด์
struct Employee {
let name: String
var vacationAllocated = 14
var vacationTaken = 0
var vacationRemaining: Int {
vacationAllocated - vacationTaken
}
}
var archer = Employee(name: "Sterling Archer", vacationAllocated: 14)
archer.vacationTaken += 4
print(archer.vacationRemaining)
archer.vacationTaken += 4
print(archer.vacationRemaining)
์ด์ ๋ ํด๊ฐ๋ฅผ ์ง์ ๋ฐฐ์ ํ ์ ์๋ ๊ฒ์ผ๋ก ๋จ๊ฒจ๋๊ธฐ๋ ๊ฒ์ด ์๋๋ผ ์ฃผ์ด์ง ํด๊ฐ์์ ์ผ๋ง๋งํผ์ ํด๊ฐ๋ฅผ ๋๋์ง๋ฅผ ๋นผ์ ๊ณ์ฐํด ๋ณด์๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์์ฑ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ์ฝ์ง๋ง ์ฌ์ค ๋ค์์๋ swift๊ฐ ๋งค๋ฒ ๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์ผ๋ถ ์ฝ๋๋ฅผ ์คํํ๊ณ ์๋๋ฐ Swift๋ ๊ทธ๊ฑธ ์๋ ค ์ฃผ์ง ์๋๋ค. ๊ทธ๊ฑธ ์ฐ๋ฆฌ๊ฐ ์์๋ก ์์ ํ๊ธฐ ์ํด์๋ getter์ setter๊ฐ ์ ๊ณต๋์ด์ผ ํ๋ค.
getter์ ๊ฒฝ์ฐ ์ด๋ฏธ ๊ธฐ์กด ์ฝ๋์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋์ด๊ฐ์ setter๋ฅผ ๋ณด์!
vacationRemaining ํ๋ ๊ฒฝ์ฐ ์ง์์ vacationAllocated์ ๊ฐ์ ๋์ด๊ฑฐ๋ ๋ฎ์ถ๊ธฐ๋ฅผ ์ํ ๊น, ์๋๋ฉด vacationAllocated๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ณ ๋์ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์๋ฏธ์ vacationTaken์ผ๊น?๐ค
ํจ์๋ช ์ด ๋๋ฌด ๋น์ทํด์ ๊ทธ๋ฐ๊ฐ ์๋๋ฉด ๊ทธ๋ฅ ๋ด๊ฐ ์ดํด๋ ฅ์ด ๋ถ์กฑํ์ง ์ง๋ฌธ์์ฒด๊ฐ ์ดํด๊ฐ์ง ์๋๋ค..

๋์ด๊ฐ์ ์ด ๋ ๊ฐ์ง ์ค์ ์ฒซ ๋ฒ์งธ๊ฐ ๋ง๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด
var vacationRemaining: Int {
get {
vacationAllocated - vacationTaken
}
set {
vacationAllocated = vacationTaken + newValue
}
}
๊ฐ์ ์ฝ๊ฑฐ๋ ์ธ ๋ ์คํํ ๊ฐ๋ณ ์ฝ๋ ์กฐ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํด์ผ ํ๋ค. ๋ ์ค์ํ ๊ฒ์ Swift์์ ์๋์ผ๋ก ์ ๊ณตํ๋ newValue์ด๋ค. ์ฌ์ฉ์๊ฐ ์์ฐ์ ํ ๋นํ๋ ค๊ณ ํ๋ ๋ชจ๋ ๊ฐ์น๋ฅผ ์ ์ฅํ๋ค.
Getter์ Setter๋ฅผ ๋ชจ๋ ๋ฐฐ์นํ๋ฉด ์ด์ vacationRemaining์ ์์ ํ ์ ์๋ค.
3. ์์ฑ ๊ด์ฐฐ์
Swift๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ์คํ๋๋ ์์ฑ ๊ด์ฐฐ์๋ฅผ ๋ง๋ค ์ ์๋ค. ์์ฑ ๊ด์ฐฐ์๋ ๋ ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง๋ค.
- didSet : ์์ฑ์ด ๋ณ๊ฒฐ๋ ๋ ์คํ
- willSet : ์์ฑ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ์คํ
์ด์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ ์์ฑ ๊ด์ฐฐ์๊ฐ ํ์ํ์ง ์์๋ณด์.
struct Game {
var score = 0
}
var game = Game()
game.score += 10
print("Score is now \(game.score)")
game.score -= 3
print("Score is now \(game.score)")
game.score += 1
Game ๊ตฌ์กฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ ์๊ฐ ์๋์์ 3๋ฒ ์์ ๋๋ค. ์ ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค print() ์ค๋ก ๋ณ๊ฒฝ์ฌํญ์ ์ถ์ ํ ์ ์๋ค. ํ์ง๋ง ์ฝ๋์์ ์ฝ๋๊ฐ ์๋๋ฐ ๋ง์ง๋ง์ ์ธ์๋์ง ์๊ณ ์ ์๊ฐ ๋ณ๊ฒฝ๋์๋ค.
์ฌ๊ธฐ์ ์์ฑ ๊ด์ฐฐ์์ธ didSet์ ์ฌ์ฉํ์ฌ print() ์์ฑ๊ณผ ์ฐ๊ฒฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด์. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ธ์ ๋ ์ง ์ํ ๋ ํญ์ ์ผ๋ถ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค. ์ฝ๋๋ก ํ์ธํด ๋ณด์๐ต๏ธโโ๏ธ
struct Game {
var score = 0 {
didSet {
print("Score is now \(score)")
}
}
}
var game = Game()
game.score += 10
game.score -= 3
game.score += 1
์ฝ๋๊ฐ ์คํ๋ ๋ ํ๋ฆ์ ๋ณผ ์ ์๋๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ฉ์์ง๋ฅผ ์ธ์ํ๋ ํ๋์ ์ฝ๋ ์ํ์ ์ฌ์ฉํ์ฌ ์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ์ค์ ๋ก ์์ฐํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฑด ์ด๋ ์ชฝ์ ์ ํํ๋์ง ๊ฐ์ ์์ฑ ๊ด์ฐฐ์์๊ฒ ๋๋ฌด ๋ง์ ์์ ์ ์๊ตฌํ๊ฑฐ๋ ๋ฐ๋ณต์ ์ธ ์์ ์ ๊ณ์ํด์ ์๊ตฌํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ ํฌ ์๋ ์๋ค๋ ๊ฒ์ด๋ค.
learning by repetition