Dog foot print

[Swift] Inout 본문

IOS/Swift

[Swift] Inout

개 발자국 2021. 7. 8. 14:21

값에 의한 전달

var x = 1;
func add(x : Int){
    x += 1;
    print(x)
}
add(x : x); //2 
print(x); //1

우리가 함수에 전달인자로 어떤 값을 전달하게 되면, 함수 내부에서 매개변수의 값을 증가를 시켜도, 전달인자로 전달한 변수나 상수는 값이 변하지 않는 것을 볼 수 있다. 이는 함수의 전달인자로 변수를 전달 하였을 때, 메모리 주소자체를 넘겨주는 것이 아닌 메모리 내부에 존재하는 값을 전달 하여, 매개변수에 할당 하였기 때문이다. 이를 값에 의한 전달이라 한다.

참조에 의한 전달

class Student{
    var age : Int;
    var name : String;

    init(age : Int,name : String){
        self.age = age;
        self.name = name;
    }
}
let harry = student(10,"harry");

func changeAge(target : Student, age : Int){
    target.age = age;
}

changeAge(target : harry, age : 20); 
print(harry.age) // 20

객체는 독특한 성격을 가지고 있는데, 만약 객체가 함수에 전달인자로 전달되게 되면 이는 객체가 복사되는 것이 아니기 때문에, 함수내에서 전달된 객체의 접근 할 수 있다. 이 처럼 메모리 주소의 값을 복사하는 것이 아니라, 메모리 주소 자체를 파라메터로 전달 하는 것을 참조에 의한 전달이라고 한다.

Inout

import UIKit

var age = 20;

func changeAge(age :inout Int ){
    age = 40;
}

print(age); //20
changeAge(age: &age);
print(age) //40

객체 타입을 제외한 나머지 타입들은 값에 의한 전달 이 발생한다. 그러나, Inout 키워드를 매개변수에 명시해주고, 주소 전달자와 같이 변수를 전달하게 되면 함수내에서 해당 메모리에 접근하여, 파라메터로 전달 받은 변수를 변경 할 수 있다.

물론 이는 특수한 상황에서 사용되어야 하며, 무분별한 사이드 이펙트를 제어 할 수 있다는 장점이 있다.

반응형

'IOS > Swift' 카테고리의 다른 글

[SWIFT] 구조체와 클래스  (0) 2021.07.13
[SWIFT] CLOSURE  (0) 2021.07.09
[SWIFT] 함수 시작하기  (0) 2021.07.07
[SWIFT] Optional  (0) 2021.07.05
[SWIFT] Dictionary  (0) 2021.07.05
Comments