์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ ์ค์ํํธ ๊ณต์๋ฌธ์ 11์ฑํฐ์ธ, ๋ฉ์๋์ ๋ํด์ ์ ๋ฆฌํด๋ดค์ต๋๋ค. ์ค์ํํธ ์คํฐ๋๋ฅผ ํ๋ฉด์ ๋๋ฆ ๋งค์ผ๋งค์ผ ๊พธ์คํ ์ ๋ฆฌ์ค์ธ๋ฐ์, ํ์คํ ์คํฐ๋๋ฅผ ์ด์ํ๋ฉฐ ์ฌ๋๋ค๊ณผ ํจ๊ป ๊ณต๋ถํ๋ ๊ฒ์ด ํจ์จ์ด ์ค๋ฅด๋ ๊ฒ๊ฐ์์. ์ผ๋ฅธ ๊ธฐ์ด๊ณต๋ถ๋ฅผ ๋๋ด๊ณ ํ ์ด ํ๋ก์ ํธ๋ ํจ๊ป ํด๋ณด๊ณ ์ถ์ ๋ง์์ด๋ค์! ๊ทธ๋ผ ์์
Swift Documents chap.11 Methods ๋ฐ๋ก๊ฐ๊ธฐ
Methods
ํน์ ํ์ ์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ๊ณผ ๊ด๋ จ๋ ํจ์๋ฅผ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
- Instance Methods ํน์ ํ์ ์ ์ธ์คํด์ค์์ ์คํํ ์ ์๋ ๋ฉ์๋
- Type Methods ํน์ ํ์ ๊ณผ ๊ด๋ จ๋ ๋ฉ์๋
๐๐ป Swift ๋ฉ์๋ vs. Objective-C, C์ ๋ฉ์๋
- Objective-C: ํด๋์ค์์๋ง ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์
- Swfit์์๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ชจ๋์์ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
Instance Methods
์ธ์คํด์ค ๋ฉ์๋๋ ํน์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ธ์คํด์ค์ ์ํ ๋ฉ์๋์ด๋ค. ์ด ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค ๋ด์ ๊ฐ์ ์ ์ดํ๊ฑฐ๋, ๋ณ๊ฒฝํ ์ ์๋ค. ์ธ์คํด์ค ๋ฉ์๋๋ ์ด๋ฆ ๊ทธ๋๋ก ๊ทธ ์ธ์คํด์ค๊ฐ ์ํ ํน์ ํ์ ์ ์ธ์คํด์ค์์๋ง ์คํ ๊ฐ๋ฅํ๋ค.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
// ์ด๊ธฐ count ๊ฐ์ 0์
๋๋ค.
counter.increment()
// count ๊ฐ์ด 1๋ก ๋ณ๊ฒฝ ๋์ต๋๋ค.
counter.increment(by: 5)
// count ๊ฐ์ ํ์ฌ 6์
๋๋ค.
counter.reset()
// count ๊ฐ์ 0์ด ๋ฉ๋๋ค.
โท ์ฝ๋ ์ค๋ช
- Counterํด๋์ค๋ฅผ ์ ์ธํ๊ณ ์ธ์คํด์ค ๋ฉ์๋๋ก ๊ฐ๊ฐ increment(), increment(by amount: Int), reset()์ ์ ์ํด ์ธ์คํด์ค ๋ด์ count property๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ์ํํ๊ฒ ๋๋ค.
self ํ๋กํผํฐ
๋ชจ๋ ํ๋กํผํฐ๋ ์์์ ์ผ๋ก ์ธ์คํด์ค ์์ฒด๋ฅผ ์๋ฏธํ๋ self๋ผ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ๋๋ค. ๋ฉ์๋ ์์์ selfํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ์ธ์คํด์ค ์์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ฐ ์ฌ์ฉํ๋ค.
func increment() {
self.count += 1
}
์์ ์ฝ๋์์ increment()๋ฉ์๋์์๋ count+=1 ์ด๋ผ๊ณ ํํํ์ง๋ง, ์ฌ์ค self.count +=1 ์ด๋ผ๋ ์๋ฏธ์ด๋ค.
swift์์๋ ํน์ ๋ฉ์๋์์ ํด๋น ์ธ์คํด์ค์ ๋ฑ๋ก๋ ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ์ธ์คํด์ค์ ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์๋ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๊ท์น์ด ์ ์ฉ๋์ง ์๋ ์์ธ๊ฐ ์๋ค. ๋ฐ๋ก ์ธ์์ด๋ฆ์ด ํ๋กํผํฐ ์ด๋ฆ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์ ๋ช ์์ ์ผ๋ก selfํค์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
๋ค์ ์ฝ๋๋ self ํค์๋๋ฅผ ์ด์ฉํ์ฌ ํ๋ผ๋ฏธํฐ์ ํ๋กํผํฐ์ ๋ชจํธํจ์ ๋ช ํํ๊ฒ ๋ช ์ํ ์์์ด๋ค.
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x // self.x๋ฅผ ์ด์ฉํด ํ๋กํผํฐ x์ ์ธ์ x๋ฅผ ๊ตฌ๋ถ
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x: 1.0) {
print("This point is to the right of the line where x == 1.0")
}
// "This point is to the right of the line where x == 1.0" ์ถ๋ ฅ
โท ์ถ๊ฐ ์ค๋ช
- ์ด ์ฝ๋์์๋ self.x๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ x์ ์ธ์ x๋ฅผ ๊ตฌ๋ถํ๋ค.
์ธ์คํด์ค ๋ฉ์๋ ๋ด์์ ๊ฐ ํ์ ๋ณ๊ฒฝ
๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ๊ฐํ์ ์ด๋ค. ๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค ๋ฉ์๋ ๋ด์์ ๊ฐ ํ์ ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ฐ ํ์ ํ์ ๋ฉ์๋์์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋๋ mutating ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋๋ ๊ณ์ฐ์ด ๋๋ ํ ์๋ณธ ๊ตฌ์กฐ์ฒด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฎ์ด์จ์ ๊ฐ์ ๋ณ๊ฒฝํด์ค๋ค
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\\(somePoint.x), \\(somePoint.y))")
// "The point is now at (3.0, 4.0)" ์ถ๋ ฅ
โท ์ถ๊ฐ ์ค๋ช
- ๊ตฌ์กฐ์ฒด๋ผ์ ๋ฉ์๋๋ก ์ธ์คํด์ค ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, mutating func moveBy()๊ฐ์ด ๋ฉ์๋ ์์ mutating์ด๋ผ๋ ํค์๋๋ฅผ ๋ถ์ฌ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋จ.
- Point ๋ด์์ var๋ก ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ๋๋ฌธ์ ๊ฐ๋ฅ. (let์ด๋ฉด ๋ณ๊ฒฝ ๋ถ๊ฐ)
Mutating ๋ฉ์๋ ๋ด์์ self ํ ๋น
Mutating ๋ฉ์๋์์ self ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ์์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์ ๋ฉ์๋๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ ์ ๋ ์๋ค.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
์ด๊ฑฐํ์์์ mutating ๋ฉ์๋๋ self ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ผํ ์ด๊ฑฐํ์์ ๋ค๋ฅธ ์ผ์ด์ค๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// ovenLight ๊ฐ์ .high
ovenLight.next()
// ovenLight ๊ฐ์ .off
Type Methods (ํ์ ๋ฉ์๋)
์ธ์คํด์ค ๋ฉ์๋๋ ํน์ ํ์ ์ ์ธ์คํด์ค์์ ํธ์ถ๋๋ค.
ํ์ ๋ฉ์๋๋ ํน์ ํ์ ์์ฒด์์ ํธ์ถํด์ ์ฌ์ฉํ๋ค. ํ์ ๋ฉ์๋์ ์ ์ธ์ ๋ฉ์๋ ํค์๋ func์์ static ํน์ class ํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
- static ๋ฉ์๋ : ์๋ธํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์๋ ํ์ ๋ฉ์๋
- class ๋ฉ์๋ : ์๋ธํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์๋ ํ์ ๋ฉ์๋
ํ์ ๋ฉ์๋๋ ์ ๋ฌธ๋ฒ์ผ๋ก ํธ์ถํ๋ค. ํ์ง๋ง ์ธ์คํด์ค์์ ํธ์ถํ๋๊ฒ ์๋๊ณ , ํ์ ๋ฉ์๋ ์ด๋ฆ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
class SomeClass {
class func someTypeMethod() {
// ํ์
๋ฉ์๋ ๊ตฌํ
}
}
SomeClass.someTypeMethod() // ํ์
๋ฉ์๋ ํธ์ถ!
ํ์ ๋ฉ์๋ ์์์๋ self ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง self ์ธ์คํด์ค๊ฐ ์๋๋ผ, ํ์ ์์ ์ ์๋ฏธํ๋ค. ๋ ํ์ ๋ฉ์๋ ์์์ ๋ค๋ฅธ ํ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค.
struct LevelTracker {
static var highestUnlockedLevel = 1
var currentLevel = 1
static func unlock(_ level: Int) {
if level > highestUnlockedLevel { highestUnlockedLevel = level }
}
static func isUnlocked(_ level: Int) -> Bool {
return level <= highestUnlockedLevel
}
@discardableResult
mutating func advance(to level: Int) -> Bool {
if LevelTracker.isUnlocked(level) {
currentLevel = level
return true
} else {
return false
}
}
}
โท ์ฝ๋ ์ค๋ช
- ํ์ ๋ฉ์๋ 3๊ฐ์ mutating ๋ฉ์๋ 1๊ฐ๋ฅผ ์ ์ธํด ํ์ฌ ๋ ๋ฒจ๊ณผ ์ต๊ณ ๋ ๋ฒจ, ๋ค์ ๋ ๋ฒจ ์ฐ๊ธฐ, ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
- ๊ฒ์์์ ์ต๊ณ ๋ ๋ฒจ์ด ์ด๋์ธ์ง ์ถ์ ํ๊ณ ๋ง์ฝ ๊ทธ ๋ ๋ฒจ์ด ์ด๋ ค ์์ผ๋ฉด ๊ทธ ์ชฝ์ผ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ๋์ด๊ฐ ์ ์๋ (advance) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- advance ๋ฉ์๋ ์์ ๋ถ์ @discardableResultํค์๋๋ ๋ฆฌํด ๊ฐ์ด ์๋ ๋ฉ์๋์์ ๋ฆฌํด ๊ฐ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, ๊ทธ ์๋ฌ๋ฅผ ๋ฐ์ํ์ง ์๋๋ก ํด์ค๋ค.
- xx.advance ๋ผ๊ณ ํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ์คํํ๊ณ ๋์ bool ๊ฐ์ ๋ฆฌํด ๊ฐ์ ์ด๋ค ๋ณ์์๋ ํ ๋นํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, @discardableResult์ด๋ผ๋ ํค์๋๋ฅผ ๋ถ์ฌ์ค์ ๋ง ๊ทธ๋๋ก ์ด ๊ฒฐ๊ณผ ๊ฐ์ ๋ฒ๋ฆด ์ ์๋ ๊ฒฐ๊ณผ ๊ฐ์ด์ผ ๋ผ๊ณ ํ์๋ฅผ ํด์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํด์ฃผ๋ ๊ฒ์ด๋ค.
๋ ๋ค๋ฅธ ์์ ์ฝ๋๋ฅผ ๋ณด์.
์๋ ์ฝ๋๋ Playerํด๋์ค์ complete๋ฉ์๋์์ LevelTracker ์ธ์คํด์ค tracker์ ํ์ ๋ฉ์๋ LevelTracker.unlock๋ฅผ ์ฌ์ฉํด ํน์ ์ฌ์ฉ์์ ํ์ฌ ๋ ๋ฒจ์ ์ถ์ ํ๋๋ก ๊ตฌํํ ์ฝ๋์ด๋ค.
class Player {
var tracker = LevelTracker()
let playerName: String
func complete(level: Int) {
LevelTracker.unlock(level + 1)
tracker.advance(to: level + 1)
}
init(name: String) {
playerName = name
}
}
var player = Player(name: "Argyrios")
player.complete(level: 1)
print("highest unlocked level is now \\(LevelTracker.highestUnlockedLevel)")
// "highest unlocked level is now 2" ์ถ๋ ฅ
๋ ๋ฒจ 1์ ์๋ฃํด์ ๋ ๋ฒจ 2๊ฐ ์ด๋ ธ๋ค.
player = Player(name: "Beto")
if player.tracker.advance(to: 6) {
print("player is now on level 6")
} else {
print("level 6 has not yet been unlocked")
}
// "level 6 has not yet been unlocked" ์ถ๋ ฅ
๋ ๋ฒจ 6์ผ๋ก ๋ฐ๋ก ๊ฑด๋๋ฐ๋ ค ํ์ง๋ง, ์์ง ์ด๋ฆฌ์ง ์์์ ๊ด๋ จ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ค๋ค.