[소프트웨어공학]소프트웨어 오류. 에러의 종류 및 차이.

소프트웨어 오류

아무리 숙련된 프로그래머라도 오류를 찾고 고치는 과정을 통해 프로그램을 완성해나간다.

소프트웨어 오류는 크게 Syntax Error/Runtime Error 그리고 Semantic Error(혹은 Logic Error)로 나눈다.

 

소프트웨어 버그. 이렇게 귀엽기만 하면 얼마나 좋을까!

 

 

ㅁ Syntax Error(구문적 오류)

프로그래밍 언어의 문법적인 에러를 말하는 것으로 컴파일 과정에서 나오는 것들이며 구문 오류라 할 수 있다. 그래서 컴파일 타임 에러라고도 한다.  이는 코드를 작성하면서 키워드를 잘못 작성하거나, 중요한 구두점을 빠뜨리거나 여는 괄호는 있는데 닫는 괄호가 없는 것과 같은 경우이다. 문법 오류는 컴파일러가 어떤 줄에서 어떤 이유로 오류가 발생했는지를 알려주기 때문에 찾기 쉽다.

 

 

ㅁ Runtime Error(실행 오류)

프로그램 실행 중에 발생하는 오류로 프로그램이 비정상 종료되는 오류를 말한다. 실행 중에 실행할 수 없는 연산을 만나면 발생하는 오류이다.  잘못된 입력이 있는 경우 발생하는 입력 오류는 대표적인 런타임 에러이다.

아마 프로그래밍을 해보면 런타임 에러가 가장  짜중난다는 것을 느낄 것이다 ㅎㅎ

 

 

Semantic Error(의미적 오류)

프로그래밍 언어의 문법은 정상적인 것이지만 실행의 결과가 원하는 대로 나오지 않는 것이라 할 수 있다.  문법적으로는 옳기 때문에 컴파일 오류는 나타나지 않는다.

 

 

 

 * Semantic error(의미적 오류)와 logical error(논리 오류)의 차이?

Logical Error도 프로그램이 의도하지 않은 결과가 나온다는 점에서 Semantic error와 비슷하다. 

굳이 차이 따진다면, 예를 들어, Semantic error는 a 변수를 사용하여야 하는데 b 변수를 사용하여 뜻하지 않은 결과를 내는 것이고 Logical Error는 문제 자체를 잘못이해하여 a+b를 해야하는데 a-b를 한 것이라고 하겠다.

그냥 글자그대로 의미적 오류가 있는 것이나 논리 오류가 있는 것이나. 어쨌든 의도하지 않는 결과가 나온다는 것이다.

 

 

 

예시 

아래는 내가 실제로 겪었던 프로그래밍 오류들이다.

 

1) 처음 c++ 프로그래밍을 배울 때 생겼던 에러인데 처음으로 프로그래밍 코딩을 하면서 고생했기 때문에 잊을 수가 없다. 그동안의 오류는 컴파일 시에 출력 창에 “error C2143: 구문오류: ';'이가'}' 앞에 없습니다.”처럼 오류 내용을 알려주었기 때문에 그것을 보고 고칠 수가 있었거늘 이때의 에러는 프로그램은 잘 돌아가는데 내가 원하는 대로 답이 나오지 않았다. 출력 값만 계속 찍혔다. 그러나 중단점을 찾고 디버깅하는 것도 몰랐던 나는 쉴 새 없이 찍히는 프로그램에 당황하며 어쩔 줄 몰랐다. 왜 틀렸는지도 알 수 없었으니 고칠 수가 없었다. 프로그램을 고쳐 봐도 무한루프에 빠져 계속 출력 값만 찍혔다. 결국 시간이 지나고 나서야 찾아낼 수 있었는데 중첩 루프를 쓰면서 반복 조건이 잘못 설정되어 무한루프에 빠졌던 것이었다. 이 에러는 고생해서 잊을 수가 없다.

 

2) 또 한 번은 다른 컴퓨터에서는 잘 돌아가는데 내가 앉았던 그 컴퓨터에서만 돌아가지 않던 프로그램을 코딩한 적이 있었다. Binary Search Tree의 deleteNode 프로그램을 스스로 코딩한 후 여러 코드와 비교해 보는 시간이었다. 교수님 컴퓨터에서는 돌아가는 똑같은 프로그램을 내 컴퓨터에서 돌렸는데 계속 돌아가다 중단되었다. 혹시나 해서 다른 컴퓨터에서도 돌려보았는데 잘 돌아갔다. 잘못 썼는지 몇 번씩 확인도 해보고 비교도 해보았는데 다른 점을 찾지 못하였다. 아무래도 컴퓨터마다 상황이 달라지면서 생각하지도 못한 곳에서 에러가 발생한 것 같았다. 시간에 따른 랜덤 값을 받아들여 값이 달라진다 하는 상황이 달라지면서 완벽하지 못했던 코드로 인해 에러를 발생시킬 수 있다는 것이다. 교수님과 중단점을 잡아 디버깅을 하면서 어떤 수를 들여왔는지 확인하면서 코드를 수정하였지만 결국 돌아가다 계속 중단되었다. 같은 코드를 다른 컴퓨터에서 돌리면 잘 돌아갔는데도 말이다. 결국 해결하지 못한 채 미스터리 에러로 남아있다.

 

3) 또 다른 에러는 프로그래밍 수업 시간에 났던 에러이다. 프로그램을 짜는데 내 컴퓨터에서만 돌아가지 않아 당황했던 적이 있다. 나는 또 전에 겪었던 것처럼 컴퓨터의 문제인 줄 알았다. 모두가 교수님과 같은 프로그램을 짰는데 나의 컴퓨터에서만 되지 않았던 것이다. 교수님과 친구들과 거의 1시간 반 동안 오류를 찾아내려 노력했다. 디버깅도 해보고 생각도 해보면서 프로그램 코딩을 하나씩 살펴보기도 했고 교수님 프로그램과도 비교해 보았는데 틀린 곳을 찾지 못했다. 뭐가 문제일까 눈에 불을 켜고 에러난 곳을 찾는데 마침내 교수님께서 변수 이름이 다른 것을 발견 하셨다. prev 변수를 써야 했던 곳에 cur변수를 쓴 것이다. 겨우 이 한 단어 때문에 프로그램이 죽어버린 것이다.

 

 

 

결론

두 번째 에러는 시스템 상의 에러라 생각된다. 중요하지 않은 프로그램이라 다행이지 만약 큰 프로젝트 중에 어느 컴퓨터에서는 돌아가고 어떤 컴퓨터에서는 돌아가지 않으면 정말 치명적인 에러가 될 것이다.

첫 번째와 마지막 에러는 Semantic Error라 할 수 있겠다. 컴파일러가 잡아주지 못하고 사람이 검출해야 하기 때문에 Syntax Error보다 수정하기 어렵다. 컴파일 시에 Syntax Error를 잡아주니 정말 다행이라 생각한다. 컴파일러가 잡아주지 않는다면 현재보다 몇 배의 시간이 들어갈 것이라 생각한다. Syntax Error는 문법을 잘 알고 문법대로 정확하게 쓰면 에러 내지 않을 수 있다. 이 에러들을 해결하기 위해서는 어디서 언제 어떤 문제가 어떻게 일어나는지를 파악하고 원인을 해결하는 작업을 하는 디버깅 작업을 하면 될 것이다.

 

무작정 코드를 작성하기 보다는 생각을 해보고 설계한 후에 코드를 작성하는 것이 에러를 내지 않는 가장 빠른 방법이라 생각한다. 문법을 알고 정확한 문법을 지키는 것도 중요하다. 스스로 헷갈리지 않게 변수 명을 잘 설정하고 함수를 사용할 때에는 대괄호를 닫는 괄호와 여는 괄호를 맞추어 정확한 범위 설정을 해주는 것이 중요하다. 가장 중요한 것은 내 코드에 갇히면 안 된다는 것이다. 코드에 갇히면 에러를 찾아낼 수도 없고 내 코드가 가장 중요하다는 생각에 더 나은 발전을 방해할 것이다.

 

이를 바탕으로 경험을 통해 익힌 디버깅하는 방법(부제. 에러를 이렇게 쉽게 잡다니!)에 대해 포스팅하겠다.

 

 

 

참고 

네이버 지식백과

(http://terms.naver.com/entry.nhn?cid=2959&docId=838819&mobile&categoryId=2959)

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️