mutating과 inout의 차이

Lily·2021년 12월 20일
1

함수내에서 비슷한 역할을 하는 것 같은 두 키워드.

어떻게 다른지 오늘 파헤쳐보도록 하겠습니다🧐

mutating

Modifying Value Types from Within Instance Methods

기본적으로 구조체와 열거형은 값 타입이기 때문에
인스턴스 메서드 내에서 인스턴스 프로퍼티를 변경해 줄 수 없습니다.

이 때 인스턴스 프로퍼티를 변경가능한 상태로 만드는 키워드가 mutating 입니다.

instance property 변경

메서드 정의 할 때 mutating을 추가해주면, 이 메서드는 인스턴스 프로퍼티를 변경할 수 있게 해주고, 메서드내에서 변경된 사항을 original 프로퍼티에도 적용시켜줍니다.

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}

Assigning to self Within a Mutating Method

그리고 mutating method에서는 새로운 인스턴스를 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)
    }
}

inout

In-Out Parameters

함수의 파라미터는 기본적으로 상수로 정의됩니다. 파라미터의 값을 함수의 바디에서 바꾸려고한다면 컴파일 에러가 날 것입니다. 실수로 함수의 파라미터를 바꿀 수 없다는 말이기도 합니다.

만약 파라미터의 값을 함수의 바디에서 수정하고, 함수의 호출이 끝난 뒤에도 수정된 값을 유지시키고 싶으면
inout parameter를 쓰면 됩니다!

함수 정의부에서는 파라미터의 타입 앞에 inout키워드를 붙여주고, 함수를 사용할 때는 파라미터 앞에 &을 붙여서 사용합니다.

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

In-out parameters are passed as follows:

  1. When the function is called, the value of the argument is copied.
  2. In the body of the function, the copy is modified.
  3. When the function returns, the copy’s value is assigned to the original argument.

단 inout parameter의 인자로 변수만 전달 할 수 있습니다. 상수나 literal value는 전달할 수 없습니다. 상수나 literal value는 수정되니 값으로 변경될 수 없기 때문입니다!


정리

mutating은 값 타입의 구조체나 열거형에서 인스턴스 메서드로 인스턴스 프로퍼티를 변경하고자 할 때!
inout파라미터를 함수 바디에서 수정하고, 수정된 값을 원래의 변수에까지 영향을 미치고 싶을 때!
사용한다 라고 정리해볼 수 있을 것 같습니다!

profile
i🍎S 개발을 합니다

0개의 댓글