[Swift5] Methods 1

Junyoung Park·2022년 3월 16일
0

Swift5 Docs

목록 보기
24/37
post-thumbnail
  • 다음은 Swift 5.6 Doc의 Methods 공부 내용을 정리했음을 밝힙니다.

Methods

메소드는 특정 타입과 연관된 함수다. 클래스, 구조체, 열거형의 인스턴스 메소드는 그 인스터스 내에서 작동하는 함수 기능을 제공하고, 타입 메소드는 타입 그 자체와 관련 있다.

구조체와 열거형에서도 메소드를 정의할 수 있다는 게 스위프트의 특징.

인스턴스 메소드

인스턴스 내부 함수라고 할 수 있다. 인스터스 프로퍼티 값을 수정하거나 접근하는 등 인스턴스를 사용할 때 주로 호출된다. 지금 있는 인스턴스를 만들지 않고 개별적으로 인스턴스 메소드만 따로 사용할 수는 없다.

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

Counter 클래스로 만든 인스턴스는 count 변수 값 0으로 초기화되어 있고, 각 메소드를 사용할 때마다 값이 바뀐다.

셀프 프로퍼티

인스턴스는 셀프 self를 통해 인스턴스 객체 자기 자신을 가리킬 수 있다. 인스턴스 메소드를 사용할 때 이 인스턴스 내부의 값을 접근할 때 셀프를 활용한다.

func increment() {
    self.count += 1
}

셀프를 쓰지 않아도 스위프트 컴파일러는 자동으로 인스턴스 내 이미 선언된 프로퍼티를 사용하면 셀프의 프로퍼티임이 추론된다.

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")
}
// Prints "This point is to the right of the line where x == 1.0"

메소드 프로퍼티와 인스턴스 프로퍼티를 같이 사용 가능.somePoint의 셀프 프로퍼티 x와 메소드를 사용할 때 넘겨준 프로퍼티 x 값을 비교한다.

인스턴스 메소드에서 값 타입 수정하기

구조체와 열거형은 값 타입이기 때문에 기본적으로는 값 타입의 프로퍼티는 인스턴스 메소드 상에서는 변경할 수 없다. 하지만 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)"

mobeBy 메소드는 mutating 키워드로 선언했기 때문에 값 타입 프로퍼티를 변경할 수 있다.

물론 상수로 선언한 구조체 인스턴스의 프로퍼티는 mutating 키워드를 붙인다고 하더라도 바꿀 수 없다.

let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0)
// this will report an error

뮤테이팅 메소드로 셀프 할당하기

뮤테이팅 메소드를 사용해서 새로운 인스턴스를 셀프 프로퍼티에 할당할 수 있다.

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

뮤테이팅 메소드로 선언된 moveBy는 파라미터로 받은 값을 기존 셀프 프로퍼티의 값으로 만든 인스턴스를 셀프로 넘겨준다.

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

next() 뮤테이팅 메소드를 통해 셀프 프로퍼티를 열거 케이스로 확인해 다른 케이스로 넘긴 케이스가 곧 다시 인스턴스가 된다.

profile
JUST DO IT

0개의 댓글