티스토리 뷰
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 매개변수는 메서드 내부에서 뿐만 아니라, 메서드 외부 영역에서도 전달받은 매개변수 값에 영향을 줄 필요가 있을때 사용될 수 있는 대안이 될 수 있습니다.
'iOS 개발' 카테고리의 다른 글
SwiftUI 공부, VStack에 다양한 Text 표현하기 (0) | 2020.08.11 |
---|---|
SwiftUI 문서, WindowGroup 윈도우그룹 개요 (0) | 2020.08.06 |
iOS 에러, Could not find module 문제 해결방법 (0) | 2020.06.29 |
iOS swift 코드로 MVVM 디자인패턴 뷰에 표현하기 (0) | 2020.06.28 |
Google Swift 가이드라인, 한 줄에 하나의 선언하기 (0) | 2020.06.28 |
- Total
- Today
- Yesterday
- 자연어처리
- 컬렉션
- 알고리즘
- swift 문자열
- swift문제
- 김프매매
- ios
- swift
- 부스트코스
- Collection
- 알고리즘문제
- 프로그래머스swift
- Swift 알고리즘
- uikit
- 백준swift
- swift언어
- swift string
- SwiftUI
- 프로토콜
- swift reduce
- swift 기초
- 개발자문서
- createML
- 스위프트
- publisher
- 백준알고리즘
- Protocol
- swift알고리즘
- CoreML
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |