코드를 작성할때 가장많이 쓰는 논리구문은 if문이 아닐까 한다.

너무 흔하게 쓰고 많이 쓰기때문에 익숙하기 그지없다.

 

시스템이 예상치 못한 방향으로 움직이는걸 발견하고,

원인을 찾아봤는데, 웃지못할 곳에서 원인을 찾았다.

아주 사소한 수정에서 발생한 버그였는데,

예를 들어 설명하자면 다음과 같다.

 

첨에 이런 코드가 있었다치자.

public class JustTest {

    public static void main(String[] args)
    {
        boolean bCheck1 = true;
        int iResult = 2;
  
        if(bCheck1)
            iResult = 3;
        else
            iResult = 1;

        System.out.println("감정결과 : " +  iResult);  
    }
}

bCheck1값을 확인해서 TRUE이면 3이 나오고, 아니라면 1이 나오는 단순한 구문이다.

 

물론 아래와 같이 if문을 {}로 감싸줘도 되지만,

보통 한줄짜리 구문을 일부러 라인낭비해가며 {}를 쓰는 개발자는 드물것이다.

public class JustTest {

    public static void main(String[] args)
    {
        boolean bCheck1 = true;
        int iResult = 2;
  
        if(bCheck1)

        {
            iResult = 3;

        }
        else

        {
            iResult = 1;

        }

        System.out.println("감정결과 : " +  iResult);  
    }
}

 

 

그런데 확인해야할 bCheck2라는 값이 하나 더 생겼다.

public class JustTest {

    public static void main(String[] args)
    {
        boolean bCheck1 = true;
        boolean bCheck2 = false;
        int iResult = 2;
  
        if(bCheck1)
            iResult = 3;
        else
            iResult = 1;

        System.out.println("감정결과 : " +  iResult);  
    }
}

이젠 bCheck1과 bCheck2가 모두 TRUE여야 3을 반환하게 수정해야한다.

bCheck1과 bCheck1가 모두 TRUE이면 3,

bCheck1만 TRUE이면 2,

둘다 FALSE였으면 1이 되면 된다.

 

그래서 코드를 아래와 같이 고쳤다.

public class JustTest {

    public static void main(String[] args)
    {
        boolean bCheck1 = true;

        boolean bCheck2 = false;
        int iResult = 2;
  
        if(bCheck1)
            if(bCheck2)

                iResult = 3;
        else
            iResult = 1;

        System.out.println("감정결과 : " +  iResult);  
    }
}

나의 실수를 찾았는가?

물론 이 코드는 아무런 문제가 없다.

그렇다면 bCheck2값이 FALSE이므로 결과가 2로 나올 것 같은가?

 

아니다. 이 코드의 결과값은 1으로 나온다.

 

여기서 아래의 빨간 마크부분을 유심히 살펴봐야한다.

public class JustTest {

    public static void main(String[] args)
    {
        boolean bCheck1 = true;

        boolean bCheck2 = false;
        int iResult = 2;
  
        if(bCheck1)
            if(bCheck2)

                iResult = 3;
        else
            iResult = 1;

        System.out.println("감정결과 : " +  iResult);  
    }
}

이 코드의 맹점은 if문의 바디를 지징하는 별도의 {}가 없다라는 점이다.

if~else~구조에서...

else문이 어느 if에 대한 else인지 명확하지가 않다.

 

물론 시스템은 이 else문이 어느 if문의 else문인지,

명확히 알고 있으니 에러를 발생시키지 않는것이다 ^^

(시스템은 논리구문을 속에서부터, 뒤에서부터 바라본다)

 

나의 의도는 if~else~ 구문이 이렇게 되길 바랬지만,

        if(bCheck1)
            if(bCheck2)
                iResult = 3;
        else
            iResult = 1;

 

실제로 시스템은 이렇게 알고 있었던 것이다.

        if(bCheck1)
            if(bCheck2)
                iResult = 3;
        else
            iResult = 1;

 

별 시덥지 않은 실수가 맹붕을 끌어올 수 있다는 사실을 다시한번 통감하는 하루였다.

Google AdSense

+ Recent posts