프로그래밍을 위하여 - 0x03 "경고와 오류"
경고(Warning)와 오류(Error)
우리가 프로그래밍을 하면서 수많은 경고와 오류를 접하게 된다. 그런데 "경고는 무엇이고 오류는 무엇인가? 둘은 같은 것이 아니었나?"라고 생각하는 사람도 있을 것이다. 실제로 조금 프로그래밍을 배운 사람들도 이 두 단어를 혼동해서 사용하고 있는 경우를 종종 발견할 수 있다. 하지만 '경고'와 '오류'는 엄연히 다른 단어이다. (글자 생김새부터 다르지 않은가? :-) )
우선 경고에 대해서 알아보자.
경고(Warning)란 "컴파일은 가능하지만 문제가 발생할 수 있다." 라는 의미이다.
대표적인 예로 Visual Studio 2010에서의 scanf 함수를 살펴보자. 우리는 scanf를 사용하여 코드를 작성하여 F5를 눌러 컴파일을 하면 다음과 같은 메시지를 확인할 수 있다.
c:\users\jun\documents\visual studio 2010\projects\test\test\test.cpp(5): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
visual studio의 경고와 오류메시지는 이곳에서 확인할 수 있다.
다양한 종류의 경고들
영어라서 해석이 어렵지만 scanf라는 함수 또는 변수(여기서는 함수 되시겠습니다.) 안전하지 않으므로, 대신 scanf_s를 사용해 볼 것을 권하고 있다. 이렇게 경고(warning)을 띄워서 이 코드가 문제를 일으킬 수도 있지만 일단 컴파일은 시켜주는 것이 경고이다. 경고가 등장하는 경우는 아주 다양하다. 또 언어마다 다르며 컴파일러마다 다르다. 예를들어 short(2byte)에 int(4byte)를 넣는 것처럼 값이 잘려버릴 수 있는 코드에 대해서 C에서는 경고로 처리하지만, 자바에서는 이것을 경고가 아닌 오류(Error)로 처리한다.
오류(Error)는 "문법적으로 틀려서 컴파일 할 수 없다."라는 의미이다. (여기서 하나 짚고 넘어가지 않을 수 없는데, 사실 문법적으로 틀리지 않은 오류도 있다. 문법적으로 틀리지 않았는데 발생하는 오류를 '논리적 오류'라고 말하며 이는 프로그램의 흐름상에서 논리적으로 문제가 되는 부분이 있어 실행 도중에 발생하는 오류를 의미한다. -ex.. 초기화, 잘못된 배열 인덱스 참조 등등- 여기서 말하는 오류란 '문법적인 오류'를 의미한다고 생각하자. 문법적 오류와 논리적 오류에 대해서 다른 글에서 다루도록 하겠다.)
다음은 대표적으로 발생할 수 있는 오류의 예시이다. 바로 세미콜론(;)을 빼먹어서 발생한 오류다. 이러한 문법적 오류는 아래 그림에서도 볼 수 있는 것처럼 빨간줄을 그어준다. (여기도 마찬가지로 문법적 오류인 경우만 컴파일러가 찾아준다는 것이 중요하다. 논리적 오류를 찾아내는 것이야말로 프로그래머의 몫이다.)
아주 간단하게 경고와 오류에 대해 알아보았다. 이 글을 보고 경고와 오류가 어떻게 다르다는 것만 알았다고 해도 큰 발전이다. 크게 어려운 개념도 아니고 하니 절대 잊지 말고 기억하도록 하자. 다음 글에선 위에서 언급한 문법적 오류와 논리적 오류의 차이, 그리고 컴파일 에러와 런타임 에러에 대해 알아보겠다.