Early Return 하는 코드를 작성하자

일하면서 어떤 조건문을 작성하다 보니 아래와 같은 코드를 작성하게 되었다(실제 코드를 실을 수는 없기 때문에 일단 구조만 가져왔다).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public String getValue(final int id) {

String value;

if (id > 0) {
if (id > 10) {
value = "Id is greater than 10.";
} else {
value = "Id is greater than 0 and below 10."
}
} else if (id == 0) {
value = "This id is zero.";
} else {
value = "Invalid id.";
}

return value;
}

그런데 작성하고 보니 뭔가 마음에 들지 않는 코드였다. 분명 내가 의도한 바를 실행하는 코드이기는 하지만, 뭔가 자연스럽게 읽기 어려운 코드라는 생각이 들었다.

그래서 아래와 같이 Early Return 하는 코드로 바꿨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String getValue(final int id) {

if (id == 0) {
return "This id is zero."
}

if (id < 0) {
return "Invalid id.";
}

if (id > 10) {
return "Id is greater than 10.";
}

return "Id is greater than 0 and below 10.";
}

그런데 Early Return 이란 무엇일까?

구글에서 검색하다가 이러한 글을 발견했다. 여기서 Early Return 에 대해서 설명하고 있는데, 그 내용을 대략적으로 설명하자면 아래와 같다(아래 내용은 글의 전체 내용이 아닌 일부만 발췌하여 의역했으며, 해당 글의 내용 전부에 동의하지는 않는다).

종종 프로그래머에게 “메서드 내의 결과를 반환하는 부분을 오직 한 군데에서만 하도록(single exit point라고 해당 글의 필자는 표현하고 있다)” 하는 경우가 있는데, 이는 빈곤한 가이드라인(poor guideline이라고 되어 있는데, 적당한 번역인지는 모르겠다…)이다.

“결과를 할당하는 것”은 “이게 최종 값이며, 처리는 여기서 멈춘다”라는 의도를 설명하지 않으며, “이 결과는 완료된거야? 수정할 수 있는거야?”라는 질문을 남기고, 결과를 수정하는 실수를 허용하기도 한다. 그러므로 함수가 더 이상 의미있는 동작을 하지 않는다는 것을 알자마자 반환하고, if/else 대신에 if/return 구조를 사용하여 들여쓰기를 최소한으로 줄이자.

내 생각에도 처음 작성했던 코드보다 Early Return 형태로 작성한 코드가 더 자연스럽게 읽혀지는 듯 하다. 아니, 읽히는 것도 그렇지만 의미도 명확하다. if 조건문에 들어오면 해당하는 동작을 하고 return 한다. 이 함수에서 더 이상의 동작은 없다. 이 함수가 어떤 조건일 때 무엇을 반환하는지 매우 명확하다. 또한 아래에 누군가가 실수로 결과를 수정하려는 코드를 넣는다고 해도 안전하다.

물론 Early Return 하는 코드를 작성할 때에는 유의할 것이 있다. 조건문의 범위 및 순서를 잘 고려하면서 배치하지 않으면 망한다(!). 만약 아래와 같이 코드를 수정했다면 원래 실행에 문제 없었던 동작에도 문제가 생겨버리는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public String getValue(final int id) {

if (id > 0) {
// 여기가 문제다. 바보 같지만 10보다 큰 값이 들어와도 이 조건문 안에서 끝나버린다...
return "Id is greater than 0 and below 10.";
}

if (id == 0) {
return "This id is zero."
}

if (id < 0) {
return "Invalid id.";
}

return "Id is greater than 10.";
}

이렇게 정리해보면서 다시금 느끼지만, 읽기 좋은 코드를 작성하는 것은 정말 쉽지 않은 일인 것 같다. 언제쯤 자연스럽게 읽을 수 있는 코드를 작성할 수 있는 수준이 될 지 모르겠지만, 그래도 꾸준히 시도하다보면 언젠가 도달할 수 있지 않을까?