아메리카노가 그렇게 맛있답니다 여러분

프로그래밍을 처음하는 대부분의 사람들이 Error와 Warning에 대해 분별없이 말합니다. 분별없이 말하는 대부분의 경우는 Warning을 Error라고 말하는 것이죠. (대부분이 Error를 Warning이라고 말하지 않는 것은 정말 다행이긴 합니다.)


"Error와 Warning. 어떻게 다를까요?"



Error(오류)


한국어로 오류라고 합니다. 오류는 Compile Error와 Runtime Error가 있으며 Error는 잡아주지 않으면 원활한 실행이 되지 않습니다. (Compile error의 경우 컴파일 단계에서 멈추고 Runtime error는 오작동하거나 멈춥니다.)


Compile Error는 컴파일 시에 발생하는 오류입니다. 없는 함수(메소드)를 사용하려고 하거나 문법 오류(Syntax Error) 등이 이에 해당됩니다. Compile Error는 Runtime Error보다 찾기 쉽습니다. 대부분의 IDE에서 Compile Error는 빨간줄을 그어주며 알려주기 때문이죠.


Runtime Error는 실행 시에 발생하는 오류입니다. 배열을 int a[] = new int[10]; 또는 int a[10];이라고 만들어놓고서 나중에 10번째나 11번째 배열을 쓰려는 경우나 가능한 Stack Memory영역을 꽉 채워쓴 경우가 있습니다.(보통 Recursive call을 쓸 때 일어납니다.)


Logic Error는 논리 오류라 하여 말하기 좀 애매한 오류입니다.  MSDN에서는 다음과 같이 예시를 들었습니다.


"예를 들어 처음에 빈 문자열로 설정된 FirstName이라는 변수가 있습니다.

이는 나중에 프로그램에서 FirstName을 LastName이라는 다른 변수와 연결하여 전체 이름을 표시할 수 있습니다.

사용자가 깜빡 잊고 FirstName에 값을 지정하지 않으면 의도한 바와 달리 전체 이름이 아닌 성만 표시됩니다."


즉, 오류없이 컴파일 및 실행은 가능하나 원하는대로 결과가 나오지 않을 경우를 Logic Error라 할 수 있습니다.




Warning(주의)


옛날 8-bit 게임에서 보스를 만나기 전에 자주 뜨는 문구였죠. Warning의 경우 Error와는 달리 다양합니다. 예를 들어 변수를 만들었는데 사용하지 않을 경우 Warning이 뜰 수 있고, Scanner같은 입력 클래스를 사용하였는데 close()를 하지 않으면 Resource Leak이라 하여 자원을 낭비하고 있다고 Warning이 뜨기도 합니다.


C의 경우 scanf_s와 scanf도 Warning이 뜨는 경우로 들 수 있습니다. scanf를 사용하면 BOF 문제 때문에 보안에 취약한 함수이므로 scanf_s를 쓰라고 Warning을 줍니다. (물론 경고만 주는 컴파일러도 있고, 아무 문구도 안 주는 컴파일러도 있긴 합니다만 일단 gcc는 확실히 줍니다.)





결론요약 

1. Error는 실행에 영향을 미치지만 Warning은 큰 영향을 미치지 않습니다.

2. Warning은 시스템 자원이나 보안에 좋지 않을 수 있으므로 처리해주는 것이 좋습니다.