예상과 다른 동작: 논리 오류 찾기
업데이트: 2007년 11월
이 단원에서는 프로그램의 논리 오류를 찾는 방법을 배웁니다.
이전 단원에서는 컴파일러 오류 및 런타임 오류를 찾아서 수정하는 방법을 배웠습니다. 세 번째 프로그래밍 오류 유형이자 가장 찾아내기가 어려운 오류는 논리 오류입니다. 논리 오류가 있으면 경고가 나타나지 않습니다. 즉, 프로그램은 실행되지만 올바르지 않은 결과가 나옵니다. 그러면 코드를 자세히 살펴보고 오류의 원인을 확인해야 합니다.
다행히도 Visual Basic의 디버깅 도구를 사용하면 이 문제를 해결할 수 있습니다. 중단점 설정 및 코드를 통한 단계별 실행의 두 가지 디버깅 기법을 사용하여 오류 찾기를 실행하면 코드를 한 번에 한 줄씩 검사할 수 있습니다.
중단점은 실행 가능한 모든 코드 줄의 코드 편집기에서 설정할 수 있습니다. 프로그램이 실행될 때 중단점이 있는 코드 줄에 도달하면 실행이 중지되고 중단 모드로 들어갑니다. 이 시점에서 프로그램의 상태에 대한 정보를 얻을 수 있습니다. 변수의 값을 확인하거나, 직접 실행 창에서 식을 테스트하거나, 편집하며 계속하기로 코드를 변경할 수 있습니다.
중단 모드에 들어오면 코드를 한 번에 한 줄씩 단계별로 실행하여 코드의 작동 방법을 확인할 수도 있습니다. F8 키를 누르면 현재 코드 줄이 실행되고 다음 줄에서 중지됩니다. 그런 다음 변수 값을 검사하여 줄이 바뀌면서 값이 어떻게 변경되는지 볼 수 있습니다.
F8 키를 눌렀을 때 현재 코드 줄이 코드의 다른 곳에서 함수 또는 Sub 프로시저를 호출하는 경우 해당 프로시저가 단계별로 실행됩니다. 해당 프로시저를 단계별로 실행한 뒤에는 프로시저를 호출한 줄의 다음 줄로 이동합니다. 프로시저를 단계별로 실행하지 않으려면 Shift+F8을 눌러 프로시저 단위 실행을 사용할 수 있습니다.
실습
논리 오류를 확인하려면
파일 메뉴에서 새 프로젝트를 선택합니다.
새 프로젝트 대화 상자의 템플릿 창에서 Windows 응용 프로그램을 클릭합니다.
이름 상자에 LogicErrors를 입력한 다음 확인을 클릭합니다.
새 Windows Forms 프로젝트가 열립니다.
Button1을 두 번 클릭하여 코드 편집기를 엽니다.
Button1_Click 이벤트 처리기에 다음 코드를 추가합니다.
Dim minutes As Integer = CInt(Textbox1.Text) Dim miles As Double = CDbl(Textbox2.Text) Dim hours As Double = 0 hours = minutes / 60 MsgBox("Average speed " & GetMPH(hours, miles))
End Sub 줄 아래에 다음 함수를 추가합니다.
Function GetMPH(ByVal miles As Double, ByVal hours As Double) _ As String GetMPH = CStr(miles / hours) End Function
F5 키를 눌러 프로그램을 실행합니다. 첫 번째 텍스트 상자에 10(10분을 나타냄)을 입력하고 두 번째 텍스트 상자에 5(5마일을 나타냄)를 입력한 다음 Button1을 클릭합니다.
"Average speed 0.03333334"라는 메시지가 있는 메시지 상자가 표시됩니다. 그러나 10분 동안 5마일을 이동한 경우의 올바른 답은 30mph입니다.
다음 프로시저에서 논리 오류를 찾는 방법을 배울 것이므로 프로젝트는 계속 열어 둡니다.
논리 오류 찾기
마지막 예제의 프로그램 논리에는 분명 문제가 있습니다. 결과에 따르면 속도는 예상대로 시간당 30마일이 아니라 시간당 1마일 미만입니다. 그렇다면 오류는 어디에 있을까요?
다음 프로시저에서는 중단점을 설정하고 코드를 단계별로 실행하여 오류를 찾습니다.
실습
중단점을 설정하고 코드를 단계별로 실행하려면
코드 편집기에서 hours = minutes / 60 줄을 찾은 다음 해당 코드 줄 옆의 왼쪽 여백을 클릭합니다.
여백에 빨간 점이 나타나며 코드가 빨간색으로 강조 표시되어 중단점을 나타냅니다.
F5 키를 눌러 프로그램을 다시 실행합니다. 첫 번째 텍스트 상자에 10을 입력하고 두 번째 텍스트 상자에 5를 입력합니다. Button1을 클릭합니다.
프로그램이 중단점에 도달하면 중지됩니다. hours = minutes / 60 줄이 노란색으로 강조 표시됩니다.
변수 값 위에 마우스를 놓은 상태로 값을 검사합니다. hours 값은 0이고 minutes 값은 10이어야 합니다.
F8 키를 눌러 hours = minutes / 60 줄을 실행하고 다음 줄로 이동합니다.
MsgBox("Average speed " & GetMPH(hours, miles)) 줄에서 변수 값을 검사합니다. 이번에는 hours 값이 0.166666672이고 miles의 값은 5.0이어야 합니다.
F8 키를 다시 눌러 현재 줄을 실행합니다.
Function GetMPH 줄까지 단계별로 실행되는지 확인합니다.
이 줄의 변수 값을 검사합니다. 이번에는 앞의 줄과 반대로 miles 값이 0.166666672이고 hours 값이 5.0이어야 합니다. 이제 오류를 발견한 것입니다.
다음 프로시저에서 논리 오류를 수정하는 방법을 배우게 되므로 프로젝트는 계속 열어 둡니다.
논리 오류 수정
앞의 프로시저에서 miles 및 hours 변수 값의 위치가 서로 바뀌었습니다. 그 원인은 무엇일까요?
MsgBox("Average speed " & GetMPH(hours, miles)) 줄을 살펴보면 GetMPH 함수에 두 개의 인수 즉, hours 및 miles가 순서대로 전달되었음을 알 수 있습니다. Function GetMPH(ByVal miles As Double, ByVal hours As Double)... 함수 선언을 살펴보면 첫 번째 인수는 miles이고 두 번째 인수는 hours인 것을 알 수 있습니다.
논리 오류는 인수가 잘못된 순서로 전달되어 잘못된 계산을 수행한 결과 발생한 것입니다. 인수의 형식이 서로 다르면 런타임 오류가 발생했겠지만 두 인수의 형식이 같으므로 런타임 오류는 발생하지 않았습니다. 간단한 실수지만 이로 인해 발견하기 힘든 버그가 발생하게 됩니다.
다음 프로시저에서는 중단점을 설정하고 코드를 단계별로 실행하여 오류를 찾습니다.
실습
논리 오류를 수정하려면
코드 편집기에서 MsgBox("Average speed " & GetMPH(hours, miles)) 줄을 다음과 같이 변경합니다.
MsgBox("Average speed " & GetMPH(miles, hours))
왼쪽 여백의 빨간 점을 클릭하여 중단점을 지웁니다.
F5 키를 눌러 프로그램을 실행합니다. 첫 번째 텍스트 상자에 10을 입력하고 두 번째 텍스트 상자에 5를 입력합니다. Button1을 클릭합니다.
이때 메시지 상자에 "Average speed 30"이라는 정확한 결과가 표시되어야 합니다.
이제 프로그램이 수정된 것처럼 보이지만 좀더 찾기 어려운 논리 오류가 아직 남아 있습니다. 오류를 직접 찾는 경우 특정 상황에 발생하는 논리 오류 처리 단원에서 프로젝트를 다시 사용하므로 계속 열어 둡니다.
다음 단계
이 단원에서는 논리 오류를 찾아서 수정하는 방법을 배웠습니다. 이제 주석 사용에 대한 다음 단원을 계속하거나 특정 상황에 발생하는 논리 오류 처리에서 또 다른 논리 오류를 찾을 수 있습니다.
다음 단원: 프로그램에 설명 넣기: 주석 사용