클래스, 구조체, 열거형 안에 구현되는 함수를 메서드라고 함.
2가지가 존재한다.
특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수
인스턴스 메서드는 자신이 속한 타입의 인스턴스에서만 호출될 수 있음
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
라는 암시적인 프로퍼티를 가짐
이 프로퍼티는 인스턴스 자체와 정확하게 일치함
func increment() {
self.count += 1
}
self
를 작성하지 않아도 됨.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의 프로퍼티(== 구조체나 열거형 내의 프로퍼티)는 기본적으로 인스턴스 메서드 내에서 수정될 수 없음.
그러나 mutating
키워드를 사용하면 프로퍼티에 대한 수정이 가능함. 이와 관련된 동작 과정은
self
프로퍼티에 새로운 인스턴스를 할당// 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
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
프로퍼티에 새로운 인스턴스를 할당할 수 있음
구조체
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()
class func
는 override 가능
하위 클래스가 해당 메서드의 상위 클래스 구현을 재정의할 수 있음
따라서 class
메서드는 클래스에서만 사용 가능함!
class SomeSubclass: SomeClass {
override class func secondTypeMethod() {
print("Second Type Method")
}
}
타입 메서드는 타입 자체에 속하는 메서드이므로, self
프로퍼티 사용 시 타입의 인스턴스가 아닌 타입 자체를 참조