Kotlin을 공부하다 보면 함수 인자를 함수 안에서 직접 수정하고 싶을 때가 있죠.
하지만 Kotlin은 기본적으로 함수 인자를 **불변(val)**으로 취급해서 직접 재할당이 안 됩니다.
이 글에서 그 이유와 해결 방법을 자세히 정리해 보았어요.

문제 상황: 인자를 직접 수정하려면?
fun increment(number: Int) {
number += 1 // 컴파일 에러! number는 val이라 수정 불가
}
Kotlin의 함수 파라미터는 기본적으로 **읽기 전용(val)**입니다. Java처럼 int를 Integer로 바꾸거나 pass-by-reference로 강제할 수 없어요.

해결 방법 4가지
1. 지역 변수(var)로 복사해서 사용 (가장 추천!)
인자를 수정해야 한다면 함수 안에서 var로 복사하세요. Kotlin의 불변성을 지키는 가장 좋은 방법입니다.
fun increment(number: Int) {
var mutableNumber = number // 복사
mutableNumber += 1
println(mutableNumber) // 출력: 원래 값 + 1
}

2. Mutable한 객체 사용 (참조 타입)
기본 타입(Int, String 등)이 아닌 클래스나 컬렉션을 인자로 넘기면 내부 프로퍼티는 수정 가능합니다.
class Counter(var value: Int)
fun increment(counter: Counter) {
counter.value += 1 // OK! 객체 내부 var 프로퍼티
}
val c = Counter(10)
increment(c)
println(c.value) // 11
- MutableList, MutableMap 등도 동일하게 내부 요소 추가/수정 가능
- 불변 List는 안 됨!

3. 배열(Array) 사용
배열은 참조 타입이라 내용 수정 가능합니다.
fun modifyArray(arr: Array<Int>) {
arr[0] = 999 // OK!
}
4. vararg나 기타
vararg도 내부에서는 불변 배열로 취급되니 복사해서 사용하세요.
요약 테이블
| 방법 | 적용 타입 | 인자 자체 수정 | 내부 내용 수정 | 추천도 |
| var 지역 변수 복사 | 모든 타입 | - | 가능 (복사본) | ★★★★★ |
| Mutable 객체 사용 | 클래스, 컬렉션 | 불가능 | 가능 | ★★★★ |
| Array 사용 | 배열 | 불가능 | 가능 | ★★★★ |
| 직접 수정 시도 | - | 불가능 | - | 불가능 |

결론
Kotlin에서 함수 인자를 수정하고 싶다면 인자 자체를 건드리지 말고, 내부에서 var로 복사하거나 mutable 객체를 활용하세요.
이게 Kotlin의 철학(불변성 우선)을 따르는 깔끔한 코딩 스타일입니다!
반응형