티스토리 뷰

반응형

 

 


Basic Method Parameter
기본 메서드 매개변수

스위프트 메서드에서 사용 되는 인자값(parameters)은 기본적으로 그 값이 변하지 않는 상수(constants)로 되어있습니다. 그렇기 때문에 메서드 블록 내에서 메서드의 인자값 상수를 변경하는 것은 컴파일 타임 에러를 유발합니다. 이 말은 즉, 실수던 고의던, 개발자는 메서드 내에서 일반적인 메서드 인자값을 변경시킬 수 없다는 것을 의미합니다.


위와 같이 메서드의 기본 매개변수는 let 상수이므로, 메서드 내에서 변경을 시도할 시 컴파일 타임 에러를 유발하게 됩니다. 
그렇다면 메서드 내에서 전달받은 매개변수의 값을 변경하고, 해당 원본 변수에도 영향을 주고 싶다면 어떻게 해야할까요?? 😒

만약 메서드 내에서 메서드 인자값을 변경하고 싶다면, 해당 메서드가 끝난 이후에도 그 값을 유지 시키고 싶다면, 해당 메서드의 인자값을 in-out 인자로서 대신 정의하시면 됩니다. 

 

 

 


In-Out Parameters
인-아웃 매개변수

메서드 인자 앞에 inout 키워드를 붙여 in-out parameter를 사용할 수 있습니다. in-out 매개변수는 메서드롤 전달되는 변수 값이 되며, 메서드로 전달되고, 메서드 블럭 내에서 값이 변경될 수 있으며, 메서드가 종료된 후에도 원본 변수에 그 변화 값이 copy-in, copy-out 방식으로 전달됩니다.

* 컴파일러 최적화와 관련있는 in-out 매개변수의 동작방식에 대해 알고 싶다면 해당 문서(In-Out Parameters)를 참고하세요.

in-out 매개변수를 사용한다면, 해당 매개변수로는 상수가 아닌 변수(variable)을 넘겨주어야 합니다. 더 자세히 말하자면, 리터럴 값("AB", 2 등)이나 상수는 in-out 매개변수로서 사용될 수 없습니다. 왜냐하면 리터럴, 상수값들은 변경될 수 없기 때문이죠. 또한 in-out 매개변수로 전달할때, 전달한 변수 앞에서는 '&' 문자를 표시해주어야 합니다. 이는 in-out 매개변수로서 해당 변수가 사용될 것임을 의미합니다.

이렇게 전달된 변수는 in-out 매개변수로서 처리되며, 메서드 내에서 변경되면 그 결과가 원본 변수값에도 적용될 수 있습니다. 

NOTE
In-out 메개변수는 기본값(defalut value)를 가질 수 없습니다. 또한 Int..., Double... 등의 varadic parameter 일 경우에도 in-out 매개변수로서 사용될 수 없습니다.

 

 


위의 코드는 두개의 in-out parameter인 aValue를 갖는 swapTwoIntegers 메서드 입니다.

swapTwoIntegers 메서드는 단순하게 인자로 받은 두개의 in-out 매개변수 값을 서로 swap해주는 메서드입니다. 먼저, aValue 값ㅇ르 temporaryA 상수에 저장하고 aValue, bValue값을 swap하는 방식으로 작동되고 있습니다. 

해당 메서드는 두개의 in-out 변수를 받아 swap할 뿐만 아니라, 메서드 종료 이후에도 swap된 두 값이 원본 변수에도 적용되도록 합니다. 아래 코드에서는 실제 in-out parameter를 가진 메서드를 사용하는 예시를 보여줍니다. 

 

 


먼저, 메서드의 in-out 인자값으로 사용 될 두개의 변수가 선언됩니다. firstInteger, secondInteger입니다. 해당 값을 swapTwoIntegers 메서드의 in-out 매개변수로 사용되었으며(이 때 넘겨진 변수의 앞에 '&'를 붙여줍니다.), 메서드에서 swap된 값은 메서드가 종료한 뒤에도 원본값에 적용됩니다.

그 결과, 메서드 종료 후의 firstInteger, secondInteger 출력값은 swap된 모습을 보여줍니다.

 

 


이처럼 in-out parameter는 Swift 언어 프로그래밍에서 Call by Value가 대신 Call By Reference와 같은 전달방식이 필요할 때 유용하게 사용될 수 있습니다.

NOTE
In-out 매개변수는 메서드의 반환 값과는 다릅니다. swapTwoIntegers 메서드에서의 in-out 매개변수 사용 예시의 경우 별도의 리턴타입, 리턴값을 정의하지 않았습니다. 그저 전달받은 In-out 매개변수를 변경시키고 있을 뿐입니다. In-out 매개변수는 메서드 내부에서 뿐만 아니라, 메서드 외부 영역에서도 전달받은 매개변수 값에 영향을 줄 필요가 있을때 사용될 수 있는 대안이 될 수 있습니다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함