티스토리 뷰

코드를 짜다보면 복잡한 분기문이 필요할때가 있다. 복잡한 분기문을 좋아하는 개발자는 없지만 복잡한 비즈니스로직을 요구한쪽이 문제라고 생각하며 자신의 코드를 용서하는경우가 많게된다. 하지만 각종 조건들로인해 분기문이 많아지고 그 깊이가 깊어지면 추후 다른 동료 개발자는 물론이고, 그 코드를 직접 상대한 스스로조차 이해하기 힘들정도의 코드가 탄생하게된다. 이번 포스팅에서는 대단한 기법이나 어려운 기법은 아니지만 소소하게 좀 더 이해하기 쉬운 분기문을 작성하는법을 알아보자. 코드는 자바로 작성되지만 분기문은 자바에만 존재하는 개념은 아니므로 이해하기 어렵진 않을것이다.


1. 불필요한 else 문

이런 코드는 실제로 쉽게 만날 수 있다.


private static boolean isSenior(int age){
if(age > 60) {
return true;
}else{
return false;
}
}


나이를 인자로받아 60살 초과면 true, 그렇지않으면 false를 반환한다. else는 if가 false 일때 실행되는 구문인데 , 분기문 이후에 추가적인 코드가 없다. 굳이 else 문을 써서 코드의 깊이를 한단계라도 만들 필요가 없다.


private static boolean isSenior(int age){
if(age > 60) {
return true;
}

return false;
}


2. true면 true고, false면 false다.

다시한번 똑같은 코드를 봐보자.


private static boolean isSenior(int age){
if(age > 60) {
return true;
}else{
return false;
}
}


사실 이 코드는 1번 예제에서 else 만 지울필요가 없었다. 뭐가 문제인지 잘 모르겠다면 if라는 제어문의 들어오는 수식에 대해 생각해보자. if 안에 들어올 수 있는 수식은 boolean 을 반환하는 수식만이 올 수 있다. 어차피 if 안에 boolean 수식이 들어오는데 그걸 또 분기할 필요가 없는것이다. 


private static boolean isSenior(int age){
return age > 60;
}


간결하게 표현하자.


3. 불필요한 분기문

private static boolean isHelpTarget(Human human){
switch (human){
case ADULT:
return false;
case KID:
case SENIOR:
return true;
default:
return false;
}
}

enum Human{
KID, ADULT, SENIOR;
}


도움이 필요한 대상인지를 판별하는 메서드이다. Human enum을 인자로 받아 ADULT일땐 도와줄 대상이 아니라고 판단하고, 아이나 노인이면 도와준다고 판단한다. 적절한 default 문도 있다.


이미 여기엔 중복 코드가 발생한다. return false; 가 바로 그부분이다. default가 false인데 굳이 ADULT인걸 확인할 필요가 없다.


private static boolean isHelpTarget(Human human){
switch (human){
case KID:
case SENIOR:
return true;
default:
return false;
}
}


이렇게 수정할 수 있다. 예제는 switch-case 문으로 작성하였지만 이런 경우는 if문에서도 흔하게 볼 수 있다.


4. 깊은 분기문

private static boolean isDaddy(Human human){
if(human.age > 30){
if(human.sexType == SexType.M){
if(human.humanType == HumanType.ADULT){
return true;
}
}
}

return false;
}


아빠인지 확인하는 메서드이다. 지금이야 예제코드로 반환문밖에 없지만 보통 저 사이사이에 각종 로직으로 라인을 채우고있는 경우도 어렵지않게 볼 수 있다. 사람의 사고방식은 보통 아닌걸 걸러내기보다 긍정적인 조건들로 범위를 줄이려는 경향이 많아 저런 코드가 상당히 많이 생성되게되는데 깊이가 깊어질수록 코드의 가독성은 급격히 저하되게되게된다. 깊이를 줄이자.


private static boolean isDaddy(Human human){
if(human.age <= 30){
return false;
}

if(human.sexType == SexType.F){
return false;
}

if(human.humanType != HumanType.ADULT){
return false;
}

return true;
}


5. 마무리

좀 더 나아가자면 메서드를 추출하여 가독성을 향상시키거나, 다형성을 활용하는 방안으로까지 갈 수 있겠지만 이번 포스팅에서 거기까지 나가진않는다. 여기서 소개한 안좋은 예들은 실제로 회사에서 수없이 만났던 코드들이고, 이 글을 보는 사람들에게 전달하고자하는 목적과 스스로도 상기하기위한 포스팅이다. 가독성을 향상시키자. 이해하기 쉬운 코드를 작성하자.

'기타 프로그래밍' 카테고리의 다른 글

github contribution 그래프 3D로 보기  (0) 2018.01.01
동시성(Concurrency)과 병렬(Parallel)  (0) 2017.10.20
간결한 분기문 사용하기  (2) 2017.07.15
클로저(Closure)  (0) 2017.05.15
정규표현식  (0) 2017.03.09
프로시저, 함수, 서브루틴  (0) 2016.12.04
댓글
댓글쓰기 폼