# iOS | Swift/--- 공식 문서

[요약본] Method

jiniz.ll 2021. 12. 13. 21:05

 

  • Method 란, 특정 타입과 관련된 함수 function 를 의미
  • 클래스, 구조체, 열거형 모두 Instance Method 를 정의할 수 있음
  • 또한 Type Method 도 정의할 수 있음

 

  • Instance Method : 해당 타입의 instance 내에서 특정 작업과 기능을 하는 함수
  • Type Method : Type 자체와 연관된 함수. Objective-C 에서의 class method 와 유사함

 

  • Swift 의 구조체와 열거형에서 method 를 정의할 수 있다는 것은 C와 Objective-C 와의 아주 큰 차이임
  • C와 Objective-C 에서는 클래스가 함수를 정의할 수 있는 유일한 타입임

 

Instance Method

특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수

 

인스턴스 프로퍼티에 접근하고 수정하는 방법을 제공하거나

인스턴스의 목적과 관련된 기능을 제공

인스턴스의 기능성을 제공함

 

Functions 와 완전히 동일한 syntax 를 가짐

 

  • Instance method 는 그 타입의 모든 다른 instance method 및 프로퍼티에 접근가능함
  • Instance method 는 그것이 속한 타입의 instance 가 있어야만 호출될 수 있음

 

Counter class 예제

class Counter {
    var count = 0
    func increment() {
        count += 1
    }
    func increment(by amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}

 

프로퍼티와 마찬가지로 . (dot syntax)  을 사용하여 instance method 를 호출할 수 있음

let counter = Counter()
counter.increment()
counter.increment(by: 5)
counter.reset()

 

함수(function)의 파라미터는 name(함수 내부에서 사용되는 이름)과 argument label(함수 호출 시 사용되는 이름) 모두 사용 가능

method parameters 와 완전히 동일!

 

The self Property

  • 모든 타입의 Property 는 self(=property 자신과 동일한 의미)라 불리는 암묵적인 property 를 갖고 있음
  • 이것은 자신의 instance method 내에서 현재 instance를 가리키는데 사용
  • 위의 increment() method 는 아래 코드와 같이 작성될 수 있음
func increment() {
    self.count += 1
}

 

하지만 실제로는 self 를 자주 사용할 필요는 없음

swift 가 추론하기 때문

 

self 를 사용해야하는 예외적인 경method parameter와 instance property 가 동일한 이름인 경우

struct Point {
    var x = 0.0, y = 0.0
    func isToTheRightOf(x: Double) -> Bool {
        return self.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")
}

이런 상황에서 self 를 사용하지 않는다면, swift 는 두 가지 사용 방식(여기서는 self.x 와 x 에 사용된 x 를 의미) 모두 method parameter 로 추론할 것임

 

Modifying Value Types from Within Instance Methods

구조체 Structure 와 열거형 Enumeration 은 value type

기본적으로 value type (값 타입) 의 프로퍼티는 instance method 안에서 수정될 수 없음

 

하지만 구조체/열거형의 특정 함수 내에서 어떤 프로퍼티 값을 수정하고 싶다면 해당 method 에 대한 동작을 변경하도록 선택할 수 있음

1. method 내에서 프로퍼티를 변경할 수 있게 됨

2. 또한 self 프로퍼티에 완전히 새로운 instance 를 할당할 수도 있음

기존 값을 새로운 instance 가 대체하게 됨

 

이 동작은 func 키워드 앞에 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))")

→ 이 메서드는 새 point 를 반환하는 대신 실제로 호출된 point 를 수정함

mutating 키워드는 프로퍼티를 수정 가능하도록 정의함

 

하지만 구조체를 상수로 선언한다면 mutating method 를 사용할 수 없음

이것의 프로퍼티들이 변경될 수 없기 때문

이 프로퍼티가 변수일지라도 변경될 수 없음

Stored Properties of Constant Structure Instances 참고

let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0) // -> ERROR

 

Assigning to self Within a Mutating Method

Mutating method 는 self property 에 완전히 새로운 instance 를 할당할 수 있음

위의 예제 코드는 아래와 같이 작성할 수 있음

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 moveBy(x: y: ) method 는 새롭게 설정된 x, y 값으로 새 구조체를 생성함

이 방식의 method 를 호출한 최종 결과는 이전 버전을 호출할 때와 정확히 동일

 

열거형에서의 mutating method 는 self parameter를 동일한 열거형의 다른 case 로 설정할 수 있음

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()
// -> .high
ovenLight.next()
// -> .off

 

> 2021. 12. 13 업데이트