코드 품질 개선 기법 23편: 반환의 끝이 에지 케이스의 끝 (새 탭에서 열림)
조기 반환(Early Return)은 에러 케이스를 미리 배제하여 함수의 주요 로직에 집중하게 돕는 훌륭한 기법이지만, 모든 상황에서 정답은 아닙니다. 만약 에러 케이스와 정상 케이스의 처리 방식이 본질적으로 같다면, 이를 분리하기보다 하나의 흐름으로 통합하는 것이 코드의 복잡성을 낮추는 데 더욱 효과적입니다. 무분별한 조기 반환 대신 언어의 특성과 라이브러리 기능을 활용해 에지 케이스를 정상 흐름에 포함시키는 것이 코드 품질 개선의 핵심입니다.
조기 반환 대신 정상 케이스로 통합하기
- 빈 컬렉션 순회 활용:
map,filter,sum과 같은 고차 함수는 컬렉션이 비어 있어도 오류 없이 자연스럽게 동작하므로,isEmpty()를 통한 별도의 조기 반환 처리가 불필요한 경우가 많습니다. - Safe Call과 엘비스 연산자:
null을 체크하여 조기 반환하는 대신,?.(세이프 콜)이나?:(엘비스 연산자)를 사용하면null을 정상적인 데이터 흐름의 일부로 처리할 수 있어 코드가 간결해집니다. - 인덱스 범위 체크의 추상화: 리스트 인덱스를 직접 조사하기보다
getOrNull이나getOrElse같은 함수를 사용하면, 범위를 벗어난 경우를null처리 흐름에 통합하여 조건문을 줄일 수 있습니다.
속성 의존성 및 예외 처리의 최적화
- 무의미한 대입 배제 지양: UI 요소의 가시성(
isVisible)에 따라 텍스트 대입 여부를 결정할 때, 조기 반환으로 대입을 막기보다는 가시성 여부와 상관없이 값을 대입하도록 로직을 통합하는 것이 상태 관리에 더 유리할 수 있습니다. - flatMap을 이용한 연쇄 함수 호출: 여러 단계에서 발생하는 예외를 각각
try-catch와 조기 반환으로 처리하면 흐름이 복잡해집니다. 이때Result객체와flatMap을 활용하면 성공과 실패 케이스를 동일한 파이프라인에서 처리할 수 있습니다. - 성능과 가독성의 균형: 로직을 통합하는 과정에서 인스턴스 생성 등으로 인한 미세한 성능 저하가 발생할 수 있으나, 대부분의 경우 코드의 명확성과 유지보수성이 주는 이점이 더 큽니다.
조기 반환을 작성하기 전, 현재 다루고 있는 에지 케이스가 정말로 '별도의 처리'가 필요한 예외 상황인지, 아니면 '일반적인 처리' 과정에 자연스럽게 녹여낼 수 있는 데이터의 한 형태인지 고민해보는 것이 좋습니다. 에러 케이스와 정상 케이스의 경계를 허물 때 코드는 더욱 단순하고 견고해집니다.