티스토리 뷰

특정 타입의 클래스, 구조체, 열거형과 관련된 함수를 메서드라고 부른다. 

 

이는 다른 언어의 메서드와 비슷한 특징을 가지고 있다. 한번 확인해보자.

 

1. 인스턴스 메서드

인스턴스 메서드는 특정 클래스, 구조체, 열거형의 인스턴스에 속한 메서드이다. 이 메서드를 통해 인스턴스의 값을 제어하거나 변경할 수 있다. 

class Counter {
	var count = 0
    
    func increment() {
    	count += 1
    }
    
    func increment(by amount: Int) {
    	count += amount
    }
    
    func reset() {
    	count = 0 
    }
}
let counter = Counter()
// 초기 count 값은 0입니다.
counter.increment()
// count 값이 1로 변경 됐습니다.
counter.increment(by: 5)
// count 값은 현재 6입니다.
counter.reset()
// count 값은 0이 됩니다.

2. self Property

모든 프로퍼티는 암시적으로 인스턴스 자체를 의미하는 self라는 프로퍼티를 갖는다. 

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

self를 사용하면 아래와 같이 인자와 프로퍼티 변수 간 모호함을 없애고 클린하게 코드를 작성할 수 있다.

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")
}

3. 인스턴스 메서드 내에서 값 타입 변경(구조체, 열거형)

구조체와 열거형의 경우 값 타입이기 때문에 인스턴스 메서드 내에서 값 타입의 프로퍼티를 변경할 수 없지만 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))")
// "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)
    }
}

4. 타입 메서드

인스턴스 메서드는 특정 타입의 인스턴스에서 호출되고, 타입 메서드는 특정 타입 자체에서 호출하여 사용하는 메서드이다.

 

선언은 메서드 키워드 func 앞에 static 또는 class 키워드를 추가하면 되는데, static은 서브 클래스에서 오버라이드할 수 없지만, class는 서브 클래스에서 오버라이드할 수 있다는 차이가 있다.

class SomeClass {
    class func someTypeMethod() {
        // 타입 메소드 구현
    }
}
SomeClass.someTypeMethod()    // 타입 메소드 호출!

 

Comments