구문 오류란 무엇인가요?
구문 오류(syntax error)는 콜론, 괄호, 따옴표를 빠뜨리는 것처럼 코드의 구조가 프로그래밍 언어의 문법 규칙을 어긴 실수입니다. 컴파일러나 인터프리터는 프로그램을 한 줄도 실행하기 전에 이 코드를 거부합니다.
업데이트: 2026년 9월 24일
Python은 프로그램을 한 줄이라도 실행하기 전에 파일 전체를 읽고 언어의 문법을 지키는지 확인해요. 한 줄이라도 문법을 어기면 아무것도 실행되지 않아요. 아래 프로그램을 실행해 보고 무엇이 일어나지 않는지 보세요. 첫 번째 print는 끝내 출력되지 않아요.
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
1번 줄은 완전히 올바른데도 출력에 "Checking the temperature"가 없어요. if 줄은 콜론으로 끝나야 하기 때문에 Python이 파일 전체를 거부한 거예요. 30 뒤에 :를 붙이고 다시 실행하면 두 줄 모두 출력돼요.
구문 오류는 어떻게 발견되나요
모든 프로그래밍 언어에는 문법이 있어요. 어떤 단어를 쓸 수 있는지, 괄호가 어디서 열리고 닫히는지, if 뒤에 무엇이 와야 하는지 같은 규칙이죠. 이를 검사하는 프로그램을 파서(parser)라고 하며, 소스 코드를 기계가 실행할 수 있는 형태로 바꾸는 첫 단계에서 동작해요.
- 토크나이저가 텍스트를
if,temperature,>,30같은 토큰으로 나눠요. - 파서가 토큰을 순서대로 읽으며 문법에 맞춰 봐요.
if temperature > 30다음에는:를 기대하지만, 줄이 끝나 버려요. - 파서는 멈추고 포기한 위치를 알려 줘요. 파일, 줄 번호, 그리고 그 위치 아래의 캐럿(
^)이에요. - 파싱에 실패했으니 코드가 생성되지 않고, 따라서 프로그램의 어떤 줄도 실행되지 않아요.
CPython에서는 스크립트를 시작할 때마다 파서가 동작해요. 별도의 빌드 단계가 있는 언어에서는 컴파일러가 이 검사를 해요. gcc, clang, javac는 구문 오류가 하나라도 남아 있으면 프로그램을 만들지 않아요. 그래서 구문 오류는 컴파일 타임 오류로 분류되며, 프로그램이 이미 실행되는 도중에 일어나는 런타임 오류와 대비돼요.
Python에서 흔한 구문 오류
초보자가 보는 구문 오류는 대부분 아래 실수에서 나와요. Python 3.12가 출력하는 메시지를 그대로 옮겼어요.
| 코드 | 메시지 | 해결 방법 |
|---|---|---|
if x > 3 | SyntaxError: expected ':' | if, for, while, def, class 줄은 :로 끝내요 |
print("Hi" | SyntaxError: '(' was never closed | 연 괄호는 모두 닫아요 |
name = "Ada | SyntaxError: unterminated string literal (detected at line 1) | 따옴표를 닫아요 |
if x = 5: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | 비교는 ==로 해요 |
print "Hi" | SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? | Python 3에서는 print(...)가 필요해요 |
if a > 0 && b > 0: | SyntaxError: invalid syntax | Python은 and, or, not을 써요 |
아래에 들여쓴 줄이 없는 if | IndentationError: expected an indented block after 'if' statement on line 1 | 본문을 공백 네 칸 들여써요 |
IndentationError는 SyntaxError의 한 종류예요. Python에서는 들여쓰기가 문법의 일부이기 때문이에요.
오타가 모두 구문 오류인 것은 아니에요. pritn("hello")는 문법을 완벽하게 지켜요. 이름 뒤에 괄호가 오면 함수 호출이니까요. Python은 그 줄에 도달해서야 pritn이라는 함수가 없다는 것을 알게 되고, 그때 NameError: name 'pritn' is not defined. Did you mean: 'print'?를 발생시켜요. 이것은 런타임 오류이고, 그 위의 줄들은 이미 실행된 뒤예요.
보고된 줄 번호가 틀릴 수 있는 이유
파서는 더 이상 진행할 수 없게 된 지점을 보고하는데, 그곳이 항상 실수가 있는 곳은 아니에요. 대표적인 예가 닫히지 않은 괄호예요. 파서는 괄호가 닫혀야 했던 자리를 지나서 읽기 전까지는 괄호가 닫히지 않았다는 것을 알 수 없어요.
File "main.py", line 1
prices = [4.50, 3.20, 7.80
^
SyntaxError: '[' was never closed
Python 3.10 이상은 1번 줄의 여는 [를 가리켜요. Python 3.9 이하는 실제 실수가 있는 다음 줄인 2번 줄에 invalid syntax만 보고했어요. 그러니 보고된 줄이 멀쩡해 보이면 바로 윗줄의 끝을 확인하세요.
다른 파서도 마찬가지예요. FROM을 잘못 쓴 SELECT name FORM users;를 주면, SQLite는 FORM을 name 열의 별칭(두 번째 이름)으로 읽고 한 단어 뒤에서야 실패해요.
Parse error near line 1: near "users": syntax error
SELECT name FORM users;
^--- error here
C, Java, JavaScript의 구문 오류
컴파일 언어는 실행할 때가 아니라 빌드할 때 구문 오류를 보고해요. 다음은 세미콜론이 빠진 선언을 Clang(macOS에서 gcc 명령이 실행하는 컴파일러)으로 컴파일한 결과예요.
#include <stdio.h>
int main(void) {
int count = 3
printf("%d\n", count);
return 0;
}
main.c:4:18: error: expected ';' at end of declaration
Java의 javac는 같은 실수를 error: ';' expected로 보고하고 .class 파일을 만들지 않아요. C에서는 중괄호 하나가 빠지면 파일 아래쪽에서 오류가 열 개 넘게 쏟아질 수 있어요. 첫 번째 오류를 고치고 다시 컴파일하세요. 나머지는 첫 번째 오류 때문에 생긴 경우가 많아요.
V8 같은 JavaScript 엔진도 Python처럼 스크립트 전체를 파싱한 다음 실행해요. Node.js는 "start"를 출력하기도 전에 이 파일을 거부해요.
console.log("start");
if (x > 1 {
console.log("big");
}
SyntaxError: Unexpected token '{'
브라우저에서는 구문 오류가 있는 스크립트 파일 하나만 실행되지 않고, 페이지의 다른 스크립트는 계속 실행돼요.
구문 오류 해결 방법
- 메시지의 마지막 줄부터 읽으세요. 빠진
:, 닫히지 않은(, 예상치 못한 토큰처럼 문제가 무엇인지 알려 줘요. - 보고된 줄로 가서 캐럿을 보세요. 그 줄이 멀쩡해 보이면 윗줄을 확인하세요.
- 짝을 확인하세요. 모든
(,[,{와 따옴표에는 짝이 있어야 해요. 대부분의 에디터는 커서가 괄호 옆에 있으면 짝이 되는 괄호를 강조해 줘요. - 언어가 요구하는 구두점을 확인하세요. Python은 콜론과 들여쓰기, C, Java, JavaScript는 세미콜론과 중괄호예요.
- 첫 번째 오류만 고치고 다시 실행하세요. 뒤의 메시지는 첫 번째 오류 때문에 생기는 경우가 많아요.
- 구문 강조 색을 보세요. 따옴표가 닫히지 않으면 보통 파일의 나머지 부분이 문자열 색으로 바뀌어서 어디서 시작됐는지 알 수 있어요.
다행히 구문 오류는 가장 고치기 쉬운 종류예요. 도구가 무언가 잘못됐다는 것과 대략 어디인지를 알려 주니까요. 더 어려운 오류는 코드가 실행될 때 나타나요.
다음 단계
파서를 통과한 프로그램도 실행 도중에 멈출 수 있는데, 이것이 런타임 오류예요. 끝까지 실행되지만 틀린 답을 출력하는 프로그램에는 논리 오류가 있으며, 그 페이지에서 세 가지 오류를 표 하나로 비교해요. 문법 규칙 자체는 Python 문법이나 C 문법에서 읽고, Python 강좌에서 연습해 보세요.
자주 묻는 질문
구문 오류의 예로는 어떤 것이 있나요?
print("Hello"처럼 닫는 괄호를 빠뜨리면 구문 오류이고, Python에서 콜론 없이 if x > 3이라고 쓴 if 줄도 구문 오류예요. C와 Java에서는 문장 끝의 세미콜론을 빠뜨리는 경우가 가장 흔해요. 어느 경우든 코드가 문법을 따르지 않으므로 실행될 수 없어요.구문 오류와 의미 오류(semantic error)는 어떻게 다른가요?
int에 문자열을 대입하는 것처럼 컴파일러가 거부하는 타입 오류를 이 이름으로 부르고, 어떤 책은 논리 오류의 다른 이름으로 써요.C언어에서 구문 오류란 무엇인가요?
gcc와 clang은 main.c:4:18: error: expected ';' at end of declaration처럼 파일, 줄, 열을 출력하고, 모든 오류를 고칠 때까지 실행 파일을 만들지 않아요.Python은 왜 구문 오류를 자동으로 고쳐 주지 않나요?
Did you mean print(...)?처럼 가능성 높은 수정을 제안하지만 결정은 여러분에게 맡겨요.계산기에 뜨는 syntax error는 무슨 뜻인가요?
ERR:SYNTAX를 표시해요.