안녕하십니까. 김동우입니다.
이번 글에서는 문법 오류에 대해 얘기해보고자 합니다.
문법 오류, 이게 무슨 말일까요?
이러한 단어로 검색을 하다 보면, 의미적 오류라는 추가적인 키워드를 얻을 수 있습니다.
그럼, 이번 시간에는 C++ 언어의 오류에 대해 알고 넘어갑시다.
keywords
- 런타임 에러
- 컴파일타임 에러
- 논리 에러
우리가 코딩을 하다 보면, 이상하게 잘못된 부분이 없는데 실행에서 번번히 막히는 경우가 있습니다. 그런데 이 실행의 과정을 하나씩 까보고 들어가다 보면, 어디서 잘못된건지 잘 모르겠단 말이죠.
대부분 이러한 오류를 경험하면 빌드창을 뚫어져라 쳐다본 다음 어려운 독해를 뚫고 찾아가서 코드에게 질문하거나, 그래도 모르겠으면 그대로 복사해서 구글창에 던져둔 다음 stackoverflow 형님들의 글이 있는지 찾기 마련입니다.
아니면 해당 로직을 그냥 다시 짜버리는 상남자식 코딩도 있죠.
이러한 오류들에도 나름의 구분이 있습니다. 뭘 잘했다고 서로 가슴을 치켜세우며 나눠달라는지 모르겠지만, 애초에 에러를 창조한 것은 우리 자신이니 미워도 알아둡시다!
런타임 에러
사실 이 에러는 자주 볼 수 있는 에러는 아닙니다. 런타임 환경에서 에러니까 로직 자체는 컴파일 혹은 실행까지 가능하다는 점이 희망적인 수준입니다.
기계의 결함으로도 발생할 수 있는 이 에러는 안타깝게도 대부분 우리의 실수로 발생하는 에러입니다. 무한루프를 빠져나올 수 없는 상황에서 발생하는 것으로 빈도를 채우니까요. 즉, 무한한 반복문을 실행하게 되는 조건문의 설계에서 발생합니다.
브레이크가 고장난 8톤 트럭 느낌인거죠.
JS에서는 이런 경우 컴퓨터가 멈출 정도로 브라우저가 메모리를 잡아먹습니다. C++에서의 무한루프는 어떤 위험성이 있는지 직접 경험해본 경험이 없어 적어드리기 어렵지만, 쉽게 IDE를 종료할 수 없는 시점에서는 작업관리자를 통한 프로세스 종료를 야기할 만큼 귀찮은 에러가 될 수 있다는 점을 알아두셔야 합니다.
노드나 파이썬에서는 ran(running) out of memory 라는 문구를 볼 수도 있겠네요.
반복문이 포함된 조건문의 설계는 상당히 중요하다는 얘기입니다. 즉, 대다수의 조건문이겠죠?
컴파일타임 에러
이 녀석은 대부분 마주하는 에러의 주된 종류입니다.
error C2143: syntax error : missing ‘;’ before ‘if’
눈에 익은 녀석이죠? 바로 syntax error 이 녀석이 문법 오류입니다. 구문 내에 컴파일러가 이해하기 어려운 녀석이 섞여있다! 라고 외치는 것이죠. 그러니 우린 컴파일러가 이해할 수 있도록 문법을 준수하여 코드를 작성해야 합니다.
이외에도 syntax error는 조건문이나 반복문 형식이 옳지 않거나, 괄호를 빼먹는 실수에서도 발생합니다. 예상 외로 괄호를 맞추기가 후에 갈수록 까다로워집니다. 특히나 리팩토링에서는 이런 에러를 마주할 경우 지옥이죠. 그래도 라인을 찾아가서 고치면 되는 오류이니, 상당히 괜찮은 수준의 오류입니다.
의미적 오류는 생각보다 찾기 어렵습니다. 의미적 오류와 논리 에러(오류)는 함께 묶어 설명드리겠습니다.
의미적 오류(컴파일타임) - 논리 오류(실행 이후)
우선은 이 정도로 나눠둡시다. 의미적 오류와 논리 오류 모두 실행까지 갈 경우 애매한 경계에 서있기 때문이죠.
의미적 오류는 쉽게 얘기하면 선언으로 발생하는 오류들을 말합니다. 이 결과, 실행으로 이어질 경우 논리 오류의 범주에는 들어갈 수 없는 오류로 보겠습니다.
예를 들면 실수형 data를 정수형으로 선언해도 원하는 결과는 얻지 못하겠지만, 실행은 가능할겁니다.
이러한 의미적 오류가 컴파일을 불가능하게 하는 경우는 대부분 잘못된 선언, 혹은 잘못된 호출로 인한 경우입니다.
그러나 논리 오류는 좀 다릅니다. 실행도 문제 없이 되는 상태에서 개발자가 원하는 의도대로 프로그램이 작동하지 않는 경우를 우린 논리 오류라고 부릅니다.
사칙연산이 가능한 계산기 프로그램에서 1+1을 계산하기 위해 덧셈 연산을 진행한 결과가 2가 아닌 곱셉인 1이 실행된다던지 하는 등의 오류 말이죠. 이러한 경우에는 문법이나 자료형, loop의 문제가 아닌 수식이 들어가는 파트 자체의 문제가 되는 것이죠.
계산기같이 단순한 로직만을 구현하는 프로그램이 아닌 3D 언리얼 엔진 게임의 논리 오류는 정말 끔찍한 일이 될겁니다.
또는 게임 내 확률성 아이템 확률 알고리즘 내 논리 오류가 존재했다면, 그건 유저의 경제적 손실을 야기하는 치명적 오류가 되겠죠.
자, 어떠셨나요? 프로그램 구조에 대해서 조금 생각해보고자 작성했던 글인데, 그림자료를 넣을 여력이 없어 글로만 끄적거렸습니다.
이런 오류들을 정리하면서 우린 C++의 컴파일 단계가 어떤 식으로 이루어지는지 한 번 생각해볼 수 있지 않았을까 싶네요.
위 그림은 C/C++의 컴파일 과정입니다. 이러한 과정을 조금이나마 눈에 담아두시길 추천드려요. 당분간 눈에 익으실 때 까지 제 글의 시작은 인사와 이 사진으로 하겠습니다.
자, 그럼 이번 글은 여기서 마치겠습니다.
사진자료 출처 - https://inpages.tistory.com/157