Swift 5 : 메소드(Method)

버들비·2020년 7월 15일
0

Swift

목록 보기
8/10

인스턴스 메소드와 타입 메소드가 있다.

인스턴스 메소드(Instance Method)

특정 클래스나 구조체, 열거형의 인스턴스에 속한 메소드.

self 프로퍼티

모든 프로퍼티는 암시적으로 인스턴스 자체를 의미하는 self 라는 프로퍼티를 갖는다. 인스턴스 메소드 안에서 인스턴스 자체를 참조하는데 사용된다.

mutating 키워드를 이용해 구조체와 열거형에서 값 타입 변경

구조체와 열거형은 값 타입이라, 기본적으로 인스턴스 메소드 내에서 값 타입의 프로퍼티를 변경할 수 없다. 하지만 메소드 선언때 mutating 키워드를 사용하면 변경할 수 있다.

struct MoveForward { 
     var one: Int = 1, two: Int = 2, three: Int = 3 
     mutating func moveForward(_ one: Int, _ two: Int, _ three: Int){ 
     	self.one = one + 1 
     	self.two = two + 1
     	self.three = three + 1
    } 
 }  
var mutatingTest = MoveForward()
mutatingTest.moveForward(1,2,3)
print(mutatingTest.one, mutatingTest.two, mutatingTest.three) // 2,3,4

이때 인스턴스 메소드 선언할때, 내부 매개변수명을 one, two, three 로 했기때문에 인스턴스 프로퍼티명인 one, two, three와 혼동될 수 있다. 인스턴스 프로퍼티 들은 self 키워드를 붙여서 self.one, self.two, self.three 로 써야 에러를 띄우지 않는다.

구조체를 할당할때 var가 아니라 let으로 선언했다면, mutating 키워드를 써도 값을 변경할 수 없다.

mutating 메소드에서 self 프로퍼티를 이용하면 새로운 인스턴스를 만들 수 있다. 아래의 두 코드는 같은 동작을 한다.

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
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)
    }
}

타입 메소드(Type Method)

인스턴스를 할당하지 않고도 호출할 수 있는 메소드. 타입 메소드 선언은 메소드 선언때 class 나 static 을 붙여주면 된다. class 를 붙여 선언한 타입 메소드는 서브클래스에서 오버라이드 할 수 있지만, static은 오버라이드가 불가능하다.

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

타입 메소드 안에서도 self 키워드를 사용할 수 있지만, 이 경우 타입 메소드의 self 는 인스턴스가 아니라 타입 메소드 자기 자신을 의미한다.

reference

https://jusung.gitbook.io/the-swift-language-guide/language-guide/11-methods

0개의 댓글