Whiteship's Note

if가 있는데 왜 else if 가 있느냐구요?

모하니?/Thinking : 2008.08.07 10:20


모나카님께 얼마전에 이 질문을 받았었습니다. 당시엔 별로 생각하고 싶지 않은 문제여서. "그러네요.."하고 넘어갔는데, 생각해보니 엄연히 용도가 다른 것 같다는 생각이 듭니다.

if()
if()
if()

요런 식으로 분기할 거(1번 케이스)와

if()
else if()
else if()

요런 식으로 분기할 거(2번 케이스)에 따라 적절한 것을 사용해야 합니다.

그럼 어떤 경우에 1번 케이스가 좋고, 어떤 경우에 2번 케이스가 좋을지 생각해 볼까요. 흠.. 예를 들어 가면서 생각해보죠.

만약에 어떤 값이 1~10까지 가질 수 있고, 그 값에 따라 각기 다른 행동을 해야 한다면 어떤 분기문이 적절할까요?

2번 케이스입니다. 물론, 1번 케이스로 분기해도 같은 결과는 나옵니다. 하지만... 10번의 if 문에 모두 걸려서 총 10번의 검사를 거치게 됩니다. 그런데, 2번 케이스로 분기하면, 최악의 경우가 10번이고 최소의 경우 1번의 if문을 거치게 됩니다. 무한대로 테스트를 하면 둘의 효율성은 비슷하겠지만, 평균적으로는 2번 케이스가 좀 더 효율적이죠. 만약에 검사 로직이 엄청나게 복잡해서 한 번 검사할 때마다 프로세스를 마구 잡아 먹는다면... 무조건 if-else로 쓰는게 좋겠습니다.

자 그럼 다음. A, B, C, D, E 이렇게 여러 개의 변수가 있는데, B는 A를 가지고 지지고 볶아야 나오고, C는 B를 가지고 지지고 볶아야 나옵니다. D는 C를 가지고 지지고 볶아야 나오고, E는 D를 가지고 지지고 볶아야 나옵니다. 이 때, E 값을 뽑아 내려면, A, B, C, D가 모두 null 값이면 안 된다. 이 경우라면 어떨까요?

이 경우엔 if-else로 분기하는 건 별 의미가 없습니다.

if(A != null ) {
    //A로 B 뽑아내기
    if(B != null {
        //B로 C 뽑아내기
         ...
    }
    else {
       //someting else
    }
{
else {
   //someting else
}

대체 저기 있는 저 else에선 뭘 할건가요? 예외라도 던질까요? 그렇다고 치죠.. 그런데 과연 저기 있는 저 else 문들이 의미가 있나요? 글쎄요. 없어 보입니다. 어차피 if 문에 안걸리면 실행이 되기 때문에 굳이 else로 감싸지 않아도 됩니다. else는 또 다른 조건문(if)과 연계하기 위해서 사용하면 몰라도 혼자서는 별 의미가 없어 보입니다.

저렇게 작성하지 않고 요렇게 작성할 수도 있겠습니다.

if(A == null) return;
else {
   B = 지지고볶아(A);
}
if(B == null) return;
  C = 지지고볶아(B);
else {
   ...
}
이런식의 코드가 좀 더 깔끔한데, 여기서도 else는 아무 의미가 없습니다.

그냥

if(A == null) {
 // 할일
}

if(B == null) {
 // 할일
}

이런식으로 작성하는게 젤 깔끔하죠. else가 들어간다고 해서 성능이나 효율성에 지장이 생길지는 몰겠습니다. 거의 없다고 생각되는데, 바이트코드가 어떻게 동작하는지 JVM이나 닷넷이 어떻게 그걸 조작하는진 모르니까요. else써서 (거의 안생길거 같지만) 생기는 성능문제보다는 코드가 지져분해진다는게 더 큰 문제라고 생각되기 때문에 저런 경우에는 else를 없애주는게 좋겠습니다.

예제 두 개로 생각해본 결과 if와 else-if는 둘 다 필요합니다. 상황에 따라 적절하게 사용하면 될 뿐입니다. 필요하면 쓰고, 필요 없으면 쓰지 말고.
top

TAG ,



: 1 : ··· : 60 : 61 : 62 : 63 : 64 : 65 : 66 : 67 : 68 : ··· : 125 :