요즘 좀 프로젝트 말미라 빡시게 돌아간다.


하면서 개인 스터디를 하고 있는데, 하면서 알게된 기초적인 프로그래밍 문법





다들 if문과 switch문이 비슷한 용도로 쓰이는것을 알것이다.

물른 다르지만 비슷하다.


즉 조건식으로 분기를 하기위해 사용되는데 개발자에 따라, 회사간의 정책에 따라 사용하는 방법은 다 다르겠지

Whatever!


나는 vs2005를 사용(.Net 2.0)


if문과 switch문에서 int a = 10을 주고

if( a == 0) ~

else if (a == 1) ~

else if (a == 2) ~

else if (a == 3) ~

~~~


이렇게 흘러가는데 만약 조건에 맞는 식이 저 밑에 있다고 치면 if문을 위에서부터 하나씩 전부 검사하고 내려온다.

이것을 어셈블리어로 확인할 수 있다.


if문에 진입하기 직전에 BreakPoint를 걸고 실행하면 if문앞에서 걸리면서 소스가 나올것이고,

소스화면에서 마우스 오른쪽 -> Go to Disassembly를 통해 확인할 수 있다.


대충 보면(나도 어셈블리어는 모른다 갸초보라 ㅠㅠ) jmp가 그 주소로 이동한다는  소리인데,

if문은 각 else if 문이 끝나는 지점에서 다음 else if 문의 주소로 jmp를 한다.(왜 jmp명령어를 사용하는지는 어셈블리어를 몰라서 모름. return 도 아닌데..)

if문은 이런식이고.....


switch문도 BreakPoint를 직전에 걸고 실행한 후 Disassembly를 통해 보면 switch인 조건식 검사 구문에서 다음 첫 case를 넘어가기 전까지 여기서 조건을 검사한 후 바로 해당 case로 넘어간다. case가 없으면 default가 지정되어 있으면 거기로 넘어가고  아니면 switch문 밖으로 jmp해버린다.


이것이 바로 if문과 switch문의 차이이기 때문에 실제 실행 속도면에서도 조건식이 많을경우 switch문이 빠른것을 알 수 있다.


이 글은 C++기초플러스(5판)에서 발췌한 글입니다. 
 
실전 프로그래밍 : 조건 표현식의 연산자와 버그 예방법

'같다' 연산자(==)를 사용할 곳에 대입 연산자(=)를 입력하는 실수를 없애기 위하여,
많은 프로그래머들이 더 직관적인 표현인 'variable == value' 를 'value == variable'로 뒤집어 사용하고 있다.
예를 들면, 조건을 다음과 같이 입력하면

 if (3 == nCount)

바르게 동작한다. 그러나 실수로 다음과 같이 입력하면

if (3 = nCount)

리터럴에 어떤 값을 대입하여는 시도로 간주되어 컴파일러가 에러 메시지를 내보낼 것이다.
(3은 언제까지나 3일 뿐이며, 다른값을 대입할 수 없다.) 
그러나 'variable == value'형식을 사용하면서 다음과 같이 == 대신 = 를 입력하는 실수를 범했을 때에는 

if (nCount  = 3)

컴파일러가 nCount에 무작정 값 3을 대입할 것이고, 이 조건은 참이되어 if의 true 블록을 실행할 것이다.
이것은 매우 흔하게 발생하는 에러이지만 찾아내기가 무척 어렵다.
일반적으로, 컴파일러가 에러를 쉽게 찾을 수 있도록 프로그램을 작성하는 것이 찾기 어려운 에러를 만들어 놓고 이를 고치느라 애를 먹는것보다 훨씬 낫다. 

=======================

요약할께요.
if문 쓸때 'if ( nCount == 3)' 이렇게 쓰는것보다 'if (3 == nCount)로 쓰는버릇을 들이는게 좋다 입니다. 

if (nCount = 3) 으로 하면 문법적으로 문제가 없기 때문에 에러검출이 되지 않습니다.
학생분들이야 코드 몇줄 안되지만, 실무로 가면 이걸 일일히 찾아서 수정하기는 어려운 일입니다. 
 
예로 (출력부분에서 예가 잘못되었지만 조건식을 중점으로 든 예이므로 이해 부탁드립니다)

int MyAge = 20;
if (MyAge = 28)

    cout << "내 나이는 28 이다" << endl;

else
{
    cout << "내 나이는 20 이다." << endl;
}

이렇게 하면
"내 나이는 28이다" 가 출력되어 버립니다. 의도에 맞지 않는거죠.
if문에서 '='을 두번 넣는걸 실수로 한번 넣어서 생긴 오류입니다. 하지만 문법적으로 문제는 없죠.
컴파일러가 에러를 잡아주지 않기 때문에 뭐가 문제지? 하면서 오랜시간 디버깅을 해야할수도 있고, 재수좋아서 한방에 끝낼수도있습니다만, 애초에 에러를 안내기 위해서는

int MyAge = 20;
if ( 28 == MyAge)

    cout << "내 나이는 28 이다" << endl;

else
{
    cout << "내 나이는 20 이다." << endl;
}

로 하면  if문의 조건식에서 false를 리턴하기 때문에 if문 안으로 들어가지 않습니다. 그래서 "내 나이는 20 이다"가 출력되는게 정상이죠.

즉, 변경할수 없는 값, 상수값을 앞에 둬야 실수로 '='으로 입력했더라도 컴파일러 수준에서 에러를 검출해 줄수 있습니다. 

ps. 언어마다 다릅니다. java같은 경우는 c와 다른 조건식의 경우를 가집니다.
java는 if문의 조건식에서 대입을 할수 없는것으로 알고있습니다.
이 글은 c와 c++의 경우로 한정하고 있습니다.(제가 아는 범위 한정입니다. 제가 틀렸을경우 신속한 지적 부탁드립니다

+ Recent posts