inout 매개변수
swift에서는 함수의 매개변수를 기본적으로 값 복사 방식으로 처리한다. 즉 함수 내부에서 매개변수의 값을 변경해도 원본 데이터에는 영향을 미치지 않는다. 그러나 inout 매개변수는 함수가 호출된 변수의 값을 직접 수정할 수 있도록 메모리 주소를 전달한다. 이를 통해 값 복사가 아닌 참조 전달 방식으로 작업을 수행할 수 있다.
예시 코드
func addOne(value: inout Int) {
value += 1
}
var number = 5
print("Before: \(number)") // Before: 5
addOne(value: &number)
print("After: \(number)") // After: 6
- inout 키워드: addOne 함수에는 매개변수 value의 원본 값을 직접 수정한다.
- & 기호: 함수 호출 시 변수의 메모리 주소를 전달하기 위해 사용한다.
inout 매개변수의 특징
- 원본 수정: 함수 내부에서 매개변수를 수정하면 원래 변수의 값도 변경된다.
- 값 복사 방지: 메모리 효율성을 높이고, 큰 데이터 구조를 다룰 때 성능을 개선할 수 있다.
- & 사용 필수: 호출 시 반드시 & 기호를 사용하여 변수의 메모리 주소를 전달해야 한다.
inout 매개변수 사용법
여러 매개변수 전달 예제 코드
func swapValue<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
var first = "Hello"
var second = "World"
print("Before: first = \(first), second = \(second)")
swapValue(a: &first, b: &second)
print("After: first = \(first), second = \(second)")
inout을 활용한 데이터 수정
func doubleValue(_ value: inout Int) {
value *= 2
}
var number = 10
print("Before: \(number)") // Before: 10
doubleValue(&number)
print("After: \(number)") // After: 20
주의사항
1. 상수 전달 불가
inout 매개변수는 변수에만 사용할 수 있으며, 상수나 리터럴 값을 전달할 수 없다.
var num = 10
doubleValue(&num) // 가능
doubleValue(&20) // 오류 발생
2. 변수의 값 복사 및 반환
함수가 종료될 때 inout 매개변수는 원본 변수에 변경된 값을 복사한다.
3. Swift의 안정성
함수 내부에서 inout 매개변수를 다른 변수에 참조로 저장하거나 클로저에서 캡쳐할 수 없다. 이는 메로리의 충돌을 방지하기 위해 설계한 것이다.
inout 매개변수의 장점
- 직접 수정 가능: 함수 호출 후 원본 데이터를 수정해야 하는 경우 유용하다.
- 효율성: 대규모 데이터(예: 배열, 딕셔너리 등)를 다룰 때 메모리 복사를 방지하여 성능을 개선한다.
- 코드 간결화: 복잡한 수정 로직을 함수로 분리하여 코드의 가독성과 재사용성을 높일 수 있다.
inout 매개변수는 Swift에서 값 전달 방식의 제한을 넘어서 원본 데이터를 직접 수정할 수 있도록 설계된 강력한 도구이다. 이를 통해 함수 내부에서 효율적으로 데이터를 조작할 수 있으며, 메모리 관리 측면에서도 유용하다. 다만, 사용 시 안정성을 고려하고, 메모리 충돌을 방지하기 위한 Swift의 규칙을 준수해야 한다. inout 매개변수를 적절히 활용하면 코등이 효율성과 가독성을 동시에 향상시킬 수 있다는 장점이 존재한다.
'TIL(Today I Learned)' 카테고리의 다른 글
| 2025.01.07 Today I Learned (0) | 2025.01.07 |
|---|---|
| 2025.01.06 Today I Learned (1) | 2025.01.06 |
| 2025.01.01 Today I Learned (0) | 2025.01.01 |
| 2024.12.24 Today I Learned (0) | 2024.12.23 |
| 2024.12.23 Today I Learned (0) | 2024.12.23 |