μλ νμΈμ. μ€λμ Swiftμ 'λ©μλ'μ λν΄ μμλ³΄κ² μ΅λλ€. λ©μλλ νΉμ νμ κ³Ό μ°κ΄λ ν¨μλ‘, Swiftμμλ ν΄λμ€λΏλ§ μλλΌ κ΅¬μ‘°μ²΄μ μ΄κ±°νμμλ λ©μλλ₯Ό μ μν μ μλ€λ νΉμ§μ΄ μμ΅λλ€.
π λ©μλλ?
λ©μλ(Method)λ νΉμ νμ (ν΄λμ€, ꡬ쑰체, μ΄κ±°ν)μ μ°κ΄λ ν¨μμ λλ€. λ©μλλ ν¬κ² λ κ°μ§λ‘ λλ μ μμ΅λλ€:
- μΈμ€ν΄μ€ λ©μλ: νΉμ νμ μ μΈμ€ν΄μ€μ μνλ λ©μλ
- νμ λ©μλ: νμ μ체μ μνλ λ©μλ (λ€λ₯Έ μΈμ΄μ 'μ μ /ν΄λμ€ λ©μλ'μ μ μ¬)
Swiftμ λ©μλ ꡬν λ₯λ ₯μ Cλ Objective-Cμ λΉκ΅νμ λ ν° μ°¨μ΄μ μ€ νλμ λλ€. Objective-Cμμλ ν΄λμ€λ§ λ©μλλ₯Ό κ°μ§ μ μμμ§λ§, Swiftμμλ ν΄λμ€, ꡬ쑰체, μ΄κ±°ν λͺ¨λ λ©μλλ₯Ό κ°μ§ μ μμ΅λλ€.
π μΈμ€ν΄μ€ λ©μλ (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()
counter.increment() // countλ 1μ΄ λ¨
counter.increment(by: 5) // countλ 6μ΄ λ¨
counter.reset() // countλ 0μ΄ λ¨
μ ꡬ문(Dot Syntax): μΈμ€ν΄μ€ λ©μλλ μΈμ€ν΄μ€λͺ .λ©μλλͺ () ννλ‘ νΈμΆν©λλ€.
self νλ‘νΌν°
λͺ¨λ μΈμ€ν΄μ€λ selfλΌλ νΉλ³ν νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ΅λλ€. selfλ μΈμ€ν΄μ€ μμ μ κ°λ¦¬ν΅λλ€.
func increment() {
self.count += 1
}
λλΆλΆμ κ²½μ° selfλ₯Ό λͺ μμ μΌλ‘ μμ±ν νμλ μμ΅λλ€. Swiftλ λ©μλ λ΄μμ νλ‘νΌν°λ λ©μλ μ΄λ¦μ μ¬μ©ν λ νμ¬ μΈμ€ν΄μ€μ κ²μ μ°Έμ‘°νλ€κ³ κ°μ ν©λλ€.
κ·Έλ¬λ λ€μκ³Ό κ°μ κ²½μ°μλ selfλ₯Ό λͺ μμ μΌλ‘ μ¬μ©ν΄μΌ ν©λλ€:
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x // λ§€κ°λ³μ xμ νλ‘νΌν° xλ₯Ό ꡬλΆνκΈ° μν΄ self μ¬μ©
}
}
self μ¬μ© μΌμ΄μ€: νλΌλ―Έν° μ΄λ¦μ΄ νλ‘νΌν° μ΄λ¦κ³Ό κ°μ λ νλ‘νΌν°λ₯Ό λͺ νν μ§μ νκΈ° μν΄ selfλ₯Ό μ¬μ©ν©λλ€.
π κ° νμ μ λ©μλμ mutating ν€μλ
ꡬ쑰체μ μ΄κ±°νμ κ° νμ μ΄λ―λ‘, κΈ°λ³Έμ μΌλ‘ μΈμ€ν΄μ€ λ©μλμμ νλ‘νΌν°λ₯Ό μμ ν μ μμ΅λλ€. νμ§λ§ mutating ν€μλλ₯Ό μ¬μ©νλ©΄ λ©μλ λ΄μμ νλ‘νΌν°λ₯Ό λ³κ²½ν μ μμ΅λλ€.
struct Point {
var x = 0.0, y = 0.0
// mutating ν€μλ μ¬μ©μΌλ‘ νλ‘νΌν° λ³κ²½ κ°λ₯
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) // ν¬μΈνΈλ (3.0, 4.0)μ΄ λ¨
mutating ν€μλ: κ° νμ μ λ©μλμμ νλ‘νΌν°λ₯Ό μμ νκΈ° μν΄ νμν ν€μλμ λλ€.
μ£Όμν μ μ μμλ‘ μ μΈλ ꡬ쑰체 μΈμ€ν΄μ€μ κ²½μ° λ³κ²½ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€:
let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0) // μ€λ₯ λ°μ
λ³κ²½ λ©μλ λ΄μμ 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) // μ μΈμ€ν΄μ€ ν λΉ
}
}
μ΄κ±°νμ κ²½μ° λ³κ²½ λ©μλμμ 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κ° λ¨
self ν λΉ: mutating λ©μλμμλ selfμ μ μΈμ€ν΄μ€λ₯Ό ν λΉνκ±°λ, μ΄κ±°νμ κ²½μ° λ€λ₯Έ μΌμ΄μ€λ‘ λ³κ²½ν μ μμ΅λλ€.
π νμ λ©μλ (Type Methods)
νμ λ©μλλ μΈμ€ν΄μ€κ° μλ νμ μ체μ μνλ λ©μλμ λλ€. νμ λ©μλλ static λλ class ν€μλλ₯Ό μ¬μ©νμ¬ μ μν©λλ€.
class SomeClass {
// νμ
λ©μλ μ μ
class func someTypeMethod() {
// νμ
λ©μλ ꡬν
}
}
// νμ
λ©μλ νΈμΆ
SomeClass.someTypeMethod()
static vs class:
- static: λͺ¨λ νμ (ν΄λμ€, ꡬ쑰체, μ΄κ±°ν)μμ μ¬μ© κ°λ₯νλ©°, μ¬μ μ λΆκ°λ₯
- class: ν΄λμ€μμλ§ μ¬μ© κ°λ₯νλ©°, νμ ν΄λμ€μμ μ¬μ μ κ°λ₯
νμ λ©μλ λ΄μμ 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
}
}
}
// μ¬μ© μμ
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"
// λ€λ₯Έ νλ μ΄μ΄ μμ±
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"
@discardableResult: λ°νκ°μ μ¬μ©νμ§ μμλ κ²½κ³ κ° λ°μνμ§ μλλ‘ νλ μμ±μ λλ€.
μ΄ μμ μμλ:
- LevelTracker ꡬ쑰체λ νμ λ©μλμ νλ‘νΌν°λ₯Ό μ¬μ©νμ¬ λͺ¨λ νλ μ΄μ΄μ μ§ν μν©μ κ΄λ¦¬ν©λλ€.
- Player ν΄λμ€λ κ°λ³ νλ μ΄μ΄μ μ§ν μν©μ μΆμ ν©λλ€.
- νμ λ©μλ unlock(_:)κ³Ό isUnlocked(_:)λ μ 체 κ²μμ λ 벨 μ κΈ μνλ₯Ό κ΄λ¦¬ν©λλ€.
- μΈμ€ν΄μ€ λ©μλ advance(to:)λ κ°λ³ νλ μ΄μ΄μ νμ¬ λ 벨μ κ΄λ¦¬ν©λλ€.
π μ 리
- Swiftμ λ©μλλ ν¬κ² μΈμ€ν΄μ€ λ©μλμ νμ λ©μλλ‘ λλ©λλ€. μΈμ€ν΄μ€ λ©μλλ νΉμ μΈμ€ν΄μ€μ λμμ μ μνκ³ , νμ λ©μλλ νμ μ체μ λμμ μ μν©λλ€.
- κ° νμ (ꡬ쑰체, μ΄κ±°ν)μμ νλ‘νΌν°λ₯Ό λ³κ²½νλ λ©μλλ mutating ν€μλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. νμ λ©μλλ static λλ class ν€μλλ₯Ό μ¬μ©νμ¬ μ μν©λλ€.
- Swiftμ λ©μλ κΈ°λ₯μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μΈ μΊ‘μνλ₯Ό ꡬννλ λ° μ€μν μν μ ν©λλ€. λ©μλλ₯Ό ν΅ν΄ νμ μ λ΄λΆ ꡬνμ μ¨κΈ°κ³ μΈλΆμλ κΉλν μΈν°νμ΄μ€λ§ μ 곡ν μ μμ΅λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν ν΄μ (Deinitialization) (1) | 2025.04.11 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν (Initialization) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μμ (Inheritance) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλΈ μ€ν¬λ¦½νΈ (Subscripts) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - νλ‘νΌν° (Properties) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - ꡬ쑰체μ ν΄λμ€ (Structures and Classes) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κ±°ν (Enumerations) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - ν΄λ‘μ (Closures) (0) | 2025.04.11 |