λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ₯– Bread Basics/Swift

Swift 곡식 λ¬Έμ„œ 정리 - λ©”μ„œλ“œ (Methods)

by BreadDev 2025. 4. 11.
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ˜€λŠ˜μ€ Swift의 'λ©”μ„œλ“œ'에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. λ©”μ„œλ“œλŠ” νŠΉμ • νƒ€μž…κ³Ό μ—°κ΄€λœ ν•¨μˆ˜λ‘œ, Swiftμ—μ„œλŠ” 클래슀뿐만 μ•„λ‹ˆλΌ ꡬ쑰체와 μ—΄κ±°ν˜•μ—μ„œλ„ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ λ©”μ„œλ“œλž€?

λ©”μ„œλ“œ(Method)λŠ” νŠΉμ • νƒ€μž…(클래슀, ꡬ쑰체, μ—΄κ±°ν˜•)에 μ—°κ΄€λœ ν•¨μˆ˜μž…λ‹ˆλ‹€. λ©”μ„œλ“œλŠ” 크게 두 κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€:

  1. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ: νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ— μ†ν•˜λŠ” λ©”μ„œλ“œ
  2. νƒ€μž… λ©”μ„œλ“œ: νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” λ©”μ„œλ“œ (λ‹€λ₯Έ μ–Έμ–΄μ˜ '정적/클래슀 λ©”μ„œλ“œ'와 μœ μ‚¬)

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: λ°˜ν™˜κ°’μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ κ²½κ³ κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œλŠ”:

  1. LevelTracker κ΅¬μ‘°μ²΄λŠ” νƒ€μž… λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  ν”Œλ ˆμ΄μ–΄μ˜ μ§„ν–‰ 상황을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  2. Player ν΄λž˜μŠ€λŠ” κ°œλ³„ ν”Œλ ˆμ΄μ–΄μ˜ μ§„ν–‰ 상황을 μΆ”μ ν•©λ‹ˆλ‹€.
  3. νƒ€μž… λ©”μ„œλ“œ unlock(_:)κ³Ό isUnlocked(_:)λŠ” 전체 κ²Œμž„μ˜ 레벨 잠금 μƒνƒœλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  4. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ advance(to:)λŠ” κ°œλ³„ ν”Œλ ˆμ΄μ–΄μ˜ ν˜„μž¬ λ ˆλ²¨μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

πŸ“Œ 정리

  • Swift의 λ©”μ„œλ“œλŠ” 크게 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ νƒ€μž… λ©”μ„œλ“œλ‘œ λ‚˜λ‰©λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” νŠΉμ • μΈμŠ€ν„΄μŠ€μ˜ λ™μž‘μ„ μ •μ˜ν•˜κ³ , νƒ€μž… λ©”μ„œλ“œλŠ” νƒ€μž… 자체의 λ™μž‘μ„ μ •μ˜ν•©λ‹ˆλ‹€.
  • κ°’ νƒ€μž…(ꡬ쑰체, μ—΄κ±°ν˜•)μ—μ„œ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œλŠ” mutating ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. νƒ€μž… λ©”μ„œλ“œλŠ” static λ˜λŠ” class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.
  • Swift의 λ©”μ„œλ“œ κΈ°λŠ₯은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ…μΈ μΊ‘μŠν™”λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. λ©”μ„œλ“œλ₯Ό 톡해 νƒ€μž…μ˜ λ‚΄λΆ€ κ΅¬ν˜„μ„ 숨기고 μ™ΈλΆ€μ—λŠ” κΉ”λ”ν•œ μΈν„°νŽ˜μ΄μŠ€λ§Œ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.