[Swift] method

·2024년 6월 23일
0

Swift 문법

목록 보기
5/16

메서드

클래스, 구조체, 열거형 안에 구현되는 함수를 메서드라고 함.

  • 인스턴스 메서드
  • 타입 메서드

2가지가 존재한다.



인스턴스 메서드(Instance Methods)

특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수
인스턴스 메서드는 자신이 속한 타입의 인스턴스에서만 호출될 수 있음


class Counter {
    var count = 0

		// count 프로퍼티의 값을 1씩 증가시키는 메서드
    func increment() {
        count += 1
    }

		// 특정 크기(amount)만큼 count 프로퍼티의 값을 증가시키는 메서드
    func increment(by amount: Int) {
        count += amount
    }

		// count의 값을 0으로 초기화시키는 메서드 
    func reset() {
        count = 0
    }
}

프로퍼티와 동일하게 점 구문으로 인스턴스 메서드 호출

let counter = Counter()
counter.increment()
print(counter.count) // 1

counter.increment(by: 5)
print(counter.count) // 6

counter.reset()
print(counter.count) // 0

self 프로퍼티

모든 인스턴스는 self 라는 암시적인 프로퍼티를 가짐
이 프로퍼티는 인스턴스 자체와 정확하게 일치함

func increment() {
    self.count += 1
}
  • 이 예시에서는 실제로 self를 작성하지 않아도 됨.
  • Swift는 self 를 명시적으로 작성하지 않으면, 현재 인스턴스 내의 프로퍼티나 메서드를 참조한다고 가정
  • 인스턴스 메서드의 파라미터 이름이 인스턴스의 프로퍼티와 동일할 때는?
    • 파라미터 명이 우선순위가 높음.
      • 이때 인스턴스 프로퍼티를 참조하고 싶다면 self 프로퍼티를 사용하면 됨

self 사용 - x가 인스턴스의 프로퍼티임을 인식

struct Center {
    var x: Double = 0.0
    var y: Double = 0.0
    
    func moveToRight(x: Double) -> Double {
        return self.x + x
    }
}

let test = Center(x: 5, y: 5)
test.moveToRight(x: 10) // 15

self 사용 x - 파라미터를 참조

struct Center {
    var x: Double = 0.0
    var y: Double = 0.0
    
    func moveToRight(x: Double) -> Double {
        return x + x
    }
}

let test = Center(x: 5, y: 5)
test.moveToRight(x: 10) // 20

인스턴스 메서드 내에서 value type 수정

구조체와 열거형은 value type.
value type의 프로퍼티(== 구조체나 열거형 내의 프로퍼티)는 기본적으로 인스턴스 메서드 내에서 수정될 수 없음.


그러나 mutating 키워드를 사용하면 프로퍼티에 대한 수정이 가능함. 이와 관련된 동작 과정은

  1. 암시적 self 프로퍼티에 새로운 인스턴스를 할당
  2. 변경하는 메서드가 종료되면 새로운 인스턴스가 기존에 존재하던 인스턴스로 대체

// 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
struct Center {
    var x: Double = 0.0
    var y: Double = 0.0

    func moveToRight(deltaX: Double) {
        x += deltaX
    }
    // 🚨 Left side of mutating operator isn't mutable: 'self' is immutable
}

// ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
struct Center {
    var x: Double = 0.0
    var y: Double = 0.0

    mutating func moveToRight(deltaX: Double) {
        x += deltaX
    }
}

var test = Center(x: 5, y: 5)
test.moveToRight(deltaX: 3) // Center(x: 8.0, y: 5.0)

Mutating 메서드 내에서 self 할당

Mutating 메서드 내에서는 self 프로퍼티에 새로운 인스턴스를 할당할 수 있음


구조체

struct Point {
    var x = 0.0, y = 0.0

    mutating func moveByXY(x deltaX: Double, y deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
    }
}

var test = Point(x: 5, y: 5)
test.moveByXY(x: 3, y: 3) // Point(x: 8.0, y: 8.0)
struct Point {
    var x = 0.0, y = 0.0

    mutating func moveByX(x deltaX: Double) {
        print("*", self.x, self.y) // * 5.0 5.0
        self = Point(x: x + deltaX)
        print("*", self.x, self.y) // * 8.0 0.0
    }
}

var test = Point(x: 5, y: 5)
test.moveByX(x: 3)
print(test) // Point(x: 8.0, y: 0.0)

열거형

열거형의 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 is now equal to .high
ovenLight.next()
// ovenLight is now equal to .off  


타입 메서드

  • 클래스, 구조체, 열거형에 정의할 수 있음
  • 타입 프로퍼티처럼 타입 자체에서 호출되는 메서드
    • 따라서 타입 자체에서 바로 접근해야 함
  • static / class 키워드 사용
class SomeClass {
    static func firstTypeMethod() {
    // static func
    }
    
    class func secondTypeMethod() {
    // class func
    }
}

SomeClass.firstTypeMethod()
SomeClass.secondTypeMethod()

🔧 static func vs class func

class funcoverride 가능
하위 클래스가 해당 메서드의 상위 클래스 구현을 재정의할 수 있음
따라서 class 메서드는 클래스에서만 사용 가능함!

class SomeSubclass: SomeClass {
    override class func secondTypeMethod() {
        print("Second Type Method")
    }
}

self 프로퍼티

타입 메서드는 타입 자체에 속하는 메서드이므로, self 프로퍼티 사용 시 타입의 인스턴스가 아닌 타입 자체를 참조



Reference

https://bbiguduk.gitbook.io/swift/language-guide-1/methods

0개의 댓글

관련 채용 정보