메서드 인라인
더 많은 작업
메서드 인라인(Inline Method, Inline Function)은 본문이 이름만큼이나 뻔한 메서드를 호출하는 자리에 그 본문을 직접 풀어 넣고 메서드 자체를 없애는 리팩토링 기법으로, 메서드 추출의 반대 방향이다.
메서드를 잘게 나누어 이름을 붙이면 대개 읽기 쉬워지지만, 메서드 본문이 이름과 똑같이 명확할 때는 한 번 더 건너뛰어 읽어야 하는 간접 단계만 늘어난다. 이럴 때 호출하는 곳마다 본문을 넣고 메서드를 지운다. 마틴 파울러의 『Refactoring』 1판(1999)에서는 Inline Method, 2판(2018)에서는 Inline Function 이라 부르며, 파울러의 카탈로그는 이 기법이 Extract Function(메서드 추출)의 역이라고 밝힌다.[1]
// 바꾸기 전
int getRating() {
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {
return _numberOfLateDeliveries > 5;
}
// 바꾼 뒤
int getRating() {
return (_numberOfLateDeliveries > 5) ? 2 : 1;
}
moreThanFiveLateDeliveries() 의 본문 _numberOfLateDeliveries > 5 는 메서드 이름만큼 분명하므로, getRating() 안에 그 식을 그대로 넣고 moreThanFiveLateDeliveries() 를 지웠다. 메서드가 하나 사라졌다는 것이 이 기법의 표지다.[1][2]
- 메서드 본문이 이름보다 더 잘 읽힐 때
- 지나친 위임으로 메서드가 다른 메서드를 부르기만 하는 단계가 겹겹이 쌓였을 때. 한꺼번에 인라인한 뒤 다시 알맞게 나누면 구조를 바로잡기 쉽다
- 잘못 나뉜 메서드들을 하나로 모은 다음 다시 추출하려 할 때
하위 클래스가 그 메서드를 재정의(오버라이딩)하고 있으면 인라인하면 안 된다. 하위 클래스에서 재정의할 메서드가 없어지기 때문이다.[2]
- 하위 클래스에서 재정의하지 않는지 확인한다
- 메서드를 호출하는 곳을 모두 찾는다
- 호출하는 곳마다 메서드 본문으로 바꾼다
- 테스트한 뒤 메서드 정의를 지운다
| 기법 | 하는 일 | 메서드 수 |
|---|---|---|
| 메서드 인라인 | 메서드 본문을 호출부에 풀어 넣고 메서드를 지운다 | 줄어든다 |
| 메서드 추출(Extract Method) | 코드 조각을 이름 있는 새 메서드로 뽑아내고 그 자리에 호출을 둔다. 인라인의 반대 | 늘어난다 |
| 메서드 이동(Move Method) | 메서드를 그 메서드가 주로 쓰는 데이터가 있는 다른 클래스로 옮긴다 | 그대로(소속 클래스가 바뀐다) |
| 알고리즘 교체(Substitute Algorithm) | 메서드 본문의 알고리즘을 같은 결과를 내는 더 명확한 알고리즘으로 통째로 바꾼다 | 그대로(본문 계산 방식이 바뀐다) |
| 임시 변수 인라인(Inline Temp) | 식 하나를 담을 뿐인 임시 변수를 없애고 식을 직접 쓴다 | 그대로(변수가 사라진다) |
앞의 예를 거꾸로, getRating() 안의 _numberOfLateDeliveries > 5 를 moreThanFiveLateDeliveries() 로 뽑아내는 것이 메서드 추출이다. 코드가 어느 쪽으로 바뀌었는지(메서드가 생겼는지 없어졌는지)로 둘을 가른다.
- ↑ 1.0 1.1 Martin Fowler, 「Inline Function」, Catalog of Refactorings, https://refactoring.com/catalog/inlineFunction.html, 확인일: 2026-11-05.
- ↑ 2.0 2.1 「Inline Method」, Refactoring.Guru, https://refactoring.guru/inline-method, 확인일: 2026-11-05.