매개변수 할당 제거
더 많은 작업
매개변수 할당 제거(Remove Assignments to Parameters)는 메서드 본문에서 매개변수에 새 값을 대입하던 코드를, 매개변수 값으로 초기화한 지역 변수를 따로 두고 그 변수를 고치도록 바꾸는 리팩토링 기법이다.
매개변수는 호출하는 쪽이 넘긴 값을 나타내는 이름이다. 그런데 본문 중간에서 매개변수에 다시 값을 넣으면, 같은 이름이 앞부분에서는 '넘겨받은 값'을, 뒷부분에서는 '계산 중인 값'을 뜻하게 되어 읽는 사람이 헷갈린다. 언어가 참조 전달을 쓰거나 객체 매개변수를 다루는 경우에는 대입이 호출한 쪽의 값까지 바꾸는 부작용으로 이어질 수도 있다. 이 기법은 매개변수 값을 받은 지역 변수를 하나 만들고, 이후의 모든 변경을 그 지역 변수에 하게 한다.[1]
마틴 파울러의 『Refactoring』 1판(1999)에 독립 기법으로 실렸고, 2판(2018)에서는 하나의 변수가 여러 의미로 재사용되는 문제를 함께 다루는 '변수 쪼개기(Split Variable)'로 합쳐졌다. 파울러의 온라인 카탈로그는 Split Variable 의 다른 이름으로 'Remove Assignments to Parameters'와 'Split Temp'를 함께 적는다.[2]
- 메서드 첫머리에 지역 변수를 선언하고 매개변수 값을 넣는다
- 그 줄 아래에서 매개변수를 쓰던 곳을 모두 지역 변수로 바꾼다
- 매개변수에 대입하던 문장이 지역 변수에 대입하도록 바뀌었는지 확인하고 테스트한다
Java 처럼 언어가 허용하면 매개변수를 final 로 선언해 다시 대입하지 못하게 막아 두기도 한다.[1]
// 바꾸기 전
int discount(int inputVal, int quantity) {
if (quantity > 50) inputVal -= 2;
...
}
// 바꾼 뒤
int discount(int inputVal, int quantity) {
int result = inputVal;
if (quantity > 50) result -= 2;
...
}
바꾼 뒤에도 inputVal 은 끝까지 '넘겨받은 값'만 뜻하고, 계산 중인 값은 result 가 맡는다. 같은 모양으로, inValue 를 그대로 증가시키던 함수를 int grade = inValue; 로 받아 grade 를 증가시키게 바꾸는 것도 이 기법이다.
| 기법 | 대상 | 하는 일 |
|---|---|---|
| 매개변수 할당 제거 | 매개변수 | 매개변수에 하던 대입을 새 지역 변수로 옮긴다 |
| 임시변수 분리(Split Temporary Variable) | 지역(임시) 변수 | 하나의 임시 변수에 서로 다른 중간값을 번갈아 담던 것을 값마다 다른 변수로 나눈다. 예: temp 에 둘레를 넣었다가 넓이를 넣던 것을 perimeter·area 로 나눈다[3] |
| 중간자 제거(Remove Middle Man) | 클래스 | 다른 객체에 일을 넘기기만 하는 위임 메서드가 너무 많은 클래스에서 그 메서드들을 지우고, 클라이언트가 실제 객체를 직접 부르게 한다. 메서드 본문의 변수와는 무관하다[4] |
| 조건문을 다형성으로 바꾸기 | 조건 분기 | 타입에 따라 동작을 고르는 if·switch 를 하위 클래스의 오버라이딩으로 옮긴다 |
매개변수 할당 제거와 임시변수 분리는 '한 이름은 한 가지 뜻만 가진다'는 같은 원칙에서 나왔다. 대상이 매개변수인지 지역 변수인지로 가른다.
- ↑ 1.0 1.1 「Remove Assignments to Parameters」, Refactoring.Guru, https://refactoring.guru/remove-assignments-to-parameters, 확인일: 2026-11-04.
- ↑ Martin Fowler, 「Catalog of Refactorings」, https://refactoring.com/catalog/, 확인일: 2026-11-04.
- ↑ 「Split Temporary Variable」, Refactoring.Guru, https://refactoring.guru/split-temporary-variable, 확인일: 2026-11-04.
- ↑ 「Remove Middle Man」, Refactoring.Guru, https://refactoring.guru/remove-middle-man, 확인일: 2026-11-04.