|
|||
여러분은 지금까지 프로그램을 작성한 후에, 프로그램을 컴파일시킬 때 적어도 한 두 개의 오류를 겪었으며, 컴파일이 성공했다 하더라도 프로그램을 실행시킬 때에도 또 다른 오류를 겪었으리라 생각된다. 저자의 경험으로 볼 때, 아무리 간단한 C 프로그램이라 하더라도 한 개의 오류도 발생하지 않고서 성공적으로 실행시킨 경우가 드물었다고 생각한다. 여러분이 프로그램을 개발할 때 크게 다음 3가지 유형의 오류가 발생할 수 있다: 컴파일 시간 오류, 실행 시간 오류, 논리 오류. 다음은 이러한 오류들을 살펴보고, 이들을 해결하는 방법에 대해서 살펴본다.
1. 컴파일 시간 오류 컴파일 시간 오류는 여러분이 작성한 프로그램을 컴파일시킬 때 발생하는 오류이다. 컴파일러의 역할은 여러분이 작성한 프로그램이 정확한 구문(syntax)을 사용하고 있는지를 점검한다. 여기서 구문이란 문장의 형태 혹은 형식을 의미한다. 만약, C 언어가 정한 구문 규칙을 따르지 않는 문장이 있을 경우에 컴파일러는 구문 오류(syntax error)를 발생시킨다. 컴파일러가 찾아낸 오류를 모두 컴파일 시간 오류라고 한다. 컴파일 시간 오류를 주로 간단히 컴파일 오류라고 부른다. 다음 프로그램을 살펴보자. 이 프로그램을 컴파일시켰을 경우에 많은 컴파일 오류가 발생할 것이다. 여러분은 이러한 모든 오류를 식별해보라.
![]() 여러분은 위에서 지적된 컴파일 오류를 한 두 개쯤은 이미 겪은 바 있을 것이다. 여러분이 컴파일 오류를 피하기 위해서는 C 문장의 형식을 정확히 알고서 프로그램을 작성해야 한다.
2. 실행 시간 오류 여러분이 모든 컴파일 오류를 수정하였다 하더라도 프로그램이 성공적으로 작성되었다고 자신하는 것은 금물이다. 또 다른 오류가 발생할 수 있기 때문이다. 오류는 프로그램 실행 중에 발생할 수도 있다. 이러한 오류를 실행 시간 오류라고 한다. 가령, 다음 배정문을 생각해보자.
m이 0이 경우에는 어떤 일이 발생할 것인가? 이러한 경우, 위의 식은 수학적으로 불능, 즉 평가될 수 없다. 위의 배정문은 형식상 아무런 문제가 없으므로 컴파일 오류가 발생하지 않는다. 그러나 실행중에 m이 0인 사실을 알고서 컴퓨터는 수를 0으로 나눌 수 없다는 실행 오류를 발생시킨다. 다음과 같이 if 문을 사용하여 위의 배정문에서 발생 가능한 실행 오류를 피할 수 있다.
다음 프로그램에는 오류가 포함되어 있는가? 그렇다면, 어떤 종류의 오류인가? 위의 프로그램은 컴파일시 오류를 포함하지 않는다. 실행시에도 컴퓨터로부터 어떠한 오류 메시지도 발생되지 않는다. 그러나 위의 프로그램은 실행이 종료되지 않을 것이다. 즉, while 문의 반복 구조가 무한정으로 반복된다. 이것은 while 문의 본체에서 count의 값을 증가시켜주는 문장이 생략되었기 때문이다. 이와 같이 반복이 종료되지 않는 무한 루프도 일종의 실행 시간 오류이다. 따라서 여러분은 루프를 표현할 때, 반복 여부를 판단하는 조건 식에 영향을 미치도록 그 본체에서 루프제어변수의 값을 변경하는 문장을 반드시 포함시켜야 한다.
|
|
[문장 단위 입력 실행] 여러분은 다음 실습창에서 프로그림 7-6을 한 문장씩 입력하여 실행시켜 볼 수 있다. 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를 살펴 보시오. |
사용법
|
1.아래의 실습창중 <
C 문장 입력 > 란을 통하여 C문장 한문장씩 입력하고 Enter
키나 입력 버튼을 클릭하 면 해당 문장에
대한 시각화가 오른쪽에 나타나게 됩니다. 자세한 사용법은 여기를
클릭하여 주십시요
|
3. 논리 오류 여러분은 프로그램에 대한 컴파일이 성공적으로 수행되었고, 프로그램 실행도 오류가 발생되지 않고 성공적으로 수행되었다고 해서 올바른 프로그램을 개발하였다고 장담할 수 있는가? 결코 그렇지 않다. 여러분은 다양한 입력 값에 대해서 프로그램의 수행 결과 값이 올바른지를 주의 깊게 살펴보아야 한다. 만약, 주어진 입력에 대해서 결과가 제대로 나오지 않는다면 프로그램 상에 오류가 존재하고 있는 것이다. 이러한 종류의 오류를 논리 오류(logic error)라 한다. 이 경우에 여러분은 기대했던 결과와 실제 결과를 비교하면서 프로그램을 철저히 테스트해야 한다. 프로그램의 문제점이 발견되면, 프로그램 상에서 그 원인을 추적하여 찾아내고 적절히 수정해야 한다. 다음은 논리 오류의 몇 가지를 살펴본다. 다음 프로그램은 오류를 포함하고 있는가? 그렇다면, 어떤 종류의 오류를 포함하는가? 위의 프로그램을 컴파일하거나 실행시킬 때 오류가 발생하지 않는다. 그렇다면, 프로그램 실행 결과가 올바른지를 점검해야 한다. 여러분은 위의 프로그램을 작성할 때 1부터 10까지 더해서 그 결과 값을 출력하는 것을 의도했을 것이다. 그러나 프로그램 실행 결과는 무엇인가? 여러분은 1부터 10까지 더한 값 55를 원했지만, 프로그램 실행 결과는 11일 것이다. 무엇이 문제인가? 여러분은 프로그램 상에서 그 원인을 찾아내고 올바르게 수정해야 한다. 위의 프로그램은 다음의 프로그램과 동일한 의미를 갖는다.
위의 프로그램 예제는 여러분이 for 문의 형식을 잘못 사용하는데서 비롯되어 논리 오류가 초래되었음을 알 수 있다. 다음은 다른 프로그램 예제이다. 이 프로그램은 오류를 포함하고 있는가? 그렇다면, 어떤 종류의 오류를 포함하는가?
문제는 여러분이 if 문의 조건 식 부분에서 관계 연산자 == 대신에 배정 연산자 =을 잘못 사용했기 때문에 발생되었다. 여러분은 =이 배정 연산자임을 유의해야 한다. 배정 연산자의 오른쪽에 위치한 식의 평가 결과 값은 왼쪽에 위치한 변수에 배정되는 것과 함께 이 배정 연산자의 결과 값이 된다. 따라서 if 문에서 조건 식의 평가 결과 값이 999가 되고, 이것은 C에서 참으로 인식된다. 따라서 사용자가 0을 입력하지 않는 이상 break 문이 수행되어 while 문을 빠져나온다. 위의 프로그램 예제도 여러분이 if 문의 조건 식에서 관계 연산자 '=='을 배정 연산자 '='으로 잘못 사용하는데서 비롯된 논리 오류가 초래된 경우를 보여준다. |
|
[문장 단위 입력 실행] 여러분은 다음 실습창에서 프로그램 7-8을 한 문장씩 입력하여 실행시켜 볼 수 있다. 새로운 프로그램을 한 문장씩 입력하고 오른쪽 창에서 그 실행 결과를 살펴 보시오. |
사용법
|
1.아래의 실습창중 <
C 문장 입력 > 란을 통하여 C문장 한문장씩 입력하고 Enter
키나 입력 버튼을 클릭하 면 해당 문장에
대한 시각화가 오른쪽에 나타나게 됩니다. 자세한 사용법은 여기를
클릭하여 주십시요
|
다음 프로그램을 생각해보자. 이 프로그램은 사용자가 읽어들인 0이나 양의 정수들에 대해서 짝수의 개수와 홀수의 개수를 계산하여 출력한다. 이 문제는 이미 6주차 강의 프로그램 예제 6-2에서 다루었음을 기억하라. 위의 프로그램은 오류를 포함하고 있는가? 여러분이 확인해 보면 알겠지만, 컴파일 오류나 실행시간 오류가 발생하지 않는다. 그러나 다음의 사용자 입력에 대한 프로그램 실행 결과를 살펴보라. ![]() 사용자 입력과 프로그램 실행 결과를 주의 깊게 살펴보면, 문제가 있음을 알 수 있다: 사용자가 입력한 0이상의 수들 중에서 짝수는 3개이고, 홀수는 2개이다. 그러나 프로그램 실행 결과는 짝수의 개수를 2이고, 홀수의 개수는 3임을 보여준다. 위의 프로그램은 컴파일 오류나 실행 시간 오류를 포함하고 있지는 않으나, 사용자 입력에 대해서 프로그램 결과가 올바르게 생성되지 않았으므로 논리 오류를 포함한다. 이러한 논리 오류는 사용자가 even과 odd를 각각 짝수의 개수와 홀수의 개수를 저장하는 변수로 선언하고 사용하고 있으나, if 문에서 even과 odd가 바뀌어 잘못 사용되어 초래된 결과이다.
|
![]() |
|