티스토리 뷰
메소드는 클래스, 구조체 그리고 열거형 타입과 연관된 함수 입니다. 앞서 언급한 타입들은 인스턴스 메소드와 타입 메소드를 정의할 수 있습니다. (타입 메소드는 Objective-C의 클래스 메소드와 유사합니다.) swift에서 구조체와 열거형도 메소드를 정의가능하다는 사실은 C나 Objective-C와는 큰 차이점입니다. Objective-C에선 클래스는 메소드를 정의할 수 있는 유일한 타입입니다. 스위프트에서는, 유연성있게 메소드를 정의하기 위해 클래스, 구조체, 열거형을 선택할 수 있습니다.
인스턴스 메소드
인스턴스 메소드는 특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수입니다. 인스턴스 메소드는 인스턴스의 기능적인 부분을 돕거나 인스턴스 프로퍼티들을 수정하고 접근할 방법을 제공합니다. 인스턴스 메소드는 일반 함수와 같은 문법을 가집니다.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
counter.increment(by: 5)
// the counter's value is now 6
counter.reset()
// the counter's value is now 0
self 프로퍼티
모든 타입의 인스턴스들은 self라는 암시적인 프로퍼티를 가지고 있습니다.self는 인스턴스 그 자체와 동일한 의미를 가집니다. 현재 인스턴스 메소드 내에서 현재 인스턴스를 다룰 때 self 프로퍼티를 사용합니다.
func increment() {
self.count += 1
}
이미 프로퍼티의 존재를 알고 있다면 명시해주지 않아도 알아서 해석하기 때문에 self를 안붙여도 별 상관이 없으나 인스턴스 메소드의 파라미터 이름과 인스턴스의 프로퍼티 이름이 겹치는 상황이라면 구별이 필요하기 때문에 self를 붙여 명확하게 만들어야 합니다.
Mutating
구조체와 열거형같은 값 타입은 해당 인스턴스 내부에서 프로퍼티 값들을 수정할 수 없으나 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))")
// Prints "The point is now at (3.0, 4.0)"
또한 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)
}
}
타입 메소드
앞서 설명한 인스턴스 메소드는 특정 타입의 인스턴스에서 불려지는 메소드인 반면, 타입 그자체에서도 메소드를 정의할 수 있습니다.
타입 메소드는 static 키워드를 이용해 생성할 수 있습니다.(클래스의 경우 상속한 하위 클래스에서 오버라이딩을 허용하기 위해 class 키워드도 사용가능합니다.)
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()
타입 메소드 내부에서 암시적 self 프로퍼티는 타입의 해당 인스턴스가 아닌 타입 그 자체를 의미합니다. 또한 타입 메소드 내부에서 다른 타입 메소드를 사용하는 것이 가능합니다.
'Swift Language Guide' 카테고리의 다른 글
11. 상속 (0) | 2020.11.09 |
---|---|
10. 서브스크립트 (0) | 2020.11.08 |
8. 프로퍼티 (0) | 2020.11.03 |
7. Structures and Classes (0) | 2020.11.02 |
6. Enumerations (0) | 2020.11.01 |