Menu
Coddy logo textTech

런타임 오류란 무엇인가요?

런타임 오류(runtime error)는 프로그램이 실행되는 도중에, 0으로 나누기나 리스트 끝을 넘어서 읽기처럼 가진 값으로는 연산을 수행할 수 없을 때 발생하는 오류입니다. 오류를 처리하지 않으면 프로그램은 그 줄에서 멈춥니다.

글쓴이: Kevin Spektor, 공동 창업자, CTO

업데이트: 2026년 9월 24일

런타임 오류는 프로그램이 이미 실행되고 있을 때까지 기다렸다가 나타나요. 코드는 시작 전의 검사를 모두 통과하고, 한동안 올바르게 실행되다가, 그 순간 가진 값으로는 수행할 수 없는 연산에 도달해요. 이 함수는 어떤 리스트에서는 동작하고 다른 리스트에서는 실패해요.

85.0
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(average([]))
          ^^^^^^^^^^^
  File "main.py", line 2, in average
    return sum(scores) / len(scores)
           ~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero

첫 번째 호출은 85.0을 출력해요. 두 번째 호출은 빈 리스트를 넘기므로 len(scores)가 0이 되고 나눗셈을 할 수 없어요. 문법에는 문제가 없으니 구문 오류가 아니에요. 문제는 특정 데이터에서만 존재하고, 그래서 런타임 오류는 프로그램이 백 번 잘 동작한 뒤에도 나타날 수 있어요.

런타임 오류가 발생하면 일어나는 일

  1. 프로그램이 연산에 도달해요. 여기서는 sum(scores) / len(scores)예요.
  2. 런타임이 연산을 수행하기 전에 검사해요. CPython은 나누기 전에 제수를 확인하고, JVM은 모든 배열 인덱스를 확인하며, Python은 딕셔너리 값을 돌려주기 전에 키가 있는지 확인해요.
  3. 검사에 실패하면 런타임이 오류 객체를 만들어요. Python과 Java에서는 이 객체가 예외이며, 오류의 종류, 메시지, 발생 위치를 기록해요.
  4. 런타임은 그 종류의 오류를 처리하는 코드를 찾아요. 먼저 현재 함수에서, 다음에는 그 함수를 호출한 함수에서, 이렇게 바깥쪽으로 찾아 나가요.
  5. 처리하는 코드가 없으면 프로그램이 멈춰요. Python은 트레이스백을 출력하고 종료 상태 1로 끝나요. Java는 Exception in thread "main"으로 시작하는 스택 트레이스를 출력해요.

이런 검사가 없는 언어는 다르게 동작해요. C는 배열 인덱스나 포인터를 검사하지 않기 때문에, 잘못된 메모리 접근은 데이터를 조용히 망가뜨리거나 운영체제가 세그멘테이션 오류로 프로그램을 끝내게 만들어요.

실패한 줄 이전에 프로그램이 한 일은 모두 이미 일어난 뒤예요. 이 반복문은 네 번째에서 실패하기 전에 색 세 개를 출력해요.

red
green
blue
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    print(colors[i])
          ~~~~~~^^^
IndexError: list index out of range

트레이스백 읽는 법

Python 트레이스백은 아래에서 위로 읽어요. 마지막 줄에 오류 종류와 메시지가 있어요. ZeroDivisionError: division by zero처럼요. 그 위의 줄들은 호출의 연쇄를 오래된 것부터 최근 것 순서로 나열해요. 첫 번째 예제에서는 5번 줄이 average를 호출했고, average 안의 2번 줄에서 나눗셈이 실패했어요.

오류가 발생한 줄이 항상 고쳐야 할 줄은 아니에요. average의 2번 줄은 올발라요. 진짜 질문은 빈 리스트가 어떻게 거기까지 왔느냐이므로, 잘못된 값이 어디서 왔는지 거슬러 올라가 그곳을 고치세요. 트레이스백이 직접 작성하지 않은 라이브러리 파일을 지나간다면, 여러분의 파일을 가리키는 마지막 줄을 찾으세요.

흔한 런타임 오류

아래 메시지는 모두 Python 3.12에서 그대로 옮겼어요.

오류예시메시지
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorNone에 .upper() 호출'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("missing.txt")[Errno 2] No such file or directory: 'missing.txt'
RecursionError자기 자신을 끝없이 호출하는 함수maximum recursion depth exceeded

Java에도 ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException, NullPointerException처럼 직접 대응하는 예외가 있어요. 아무도 잡지 않는 정수 0 나누기는 Java에서 이렇게 출력돼요.

Exception in thread "main" java.lang.ArithmeticException: / by zero

JavaScript는 숫자에 더 관대해서 10 / 0은 오류가 아니라 Infinity예요. 대신 없는 값을 사용할 때 실패해요. user가 undefined일 때 user.name에 대해 Node.js는 이렇게 출력해요.

TypeError: Cannot read properties of undefined (reading 'name')

런타임 오류 해결 방법

  1. 재현하세요. 같은 입력으로 프로그램을 다시 실행해 같은 오류가 나는지 확인해요.
  2. 트레이스백의 마지막 줄을 읽고, 여러분 코드에서 해당하는 줄을 찾으세요.
  3. 관련된 값을 살펴보세요. 실패하는 줄 바로 앞에서 값을 출력하거나 디버거 중단점으로 거기서 멈춰요.
  4. 원인을 고치세요. 인덱스를 바로잡거나, 특별한 경우를 막거나, 입력을 사용하기 전에 검증해요.

average 함수의 해결책은 점수가 하나도 없을 때 평균을 얼마로 할지 정하고 그것을 코드에 적는 거예요.

85.0
0

어떤 실패는 여러분이 통제할 수 없어요. 삭제된 파일, 시간 초과된 네트워크, 숫자 자리에 글자를 입력한 사용자 같은 것들이죠. 코드를 고쳐서 막을 수 없으니 예외 처리로 잡고 프로그램이 다음에 무엇을 할지 정해요. 하지 말아야 할 것은 버그를 try로 감싸 숨기는 거예요. 한 단계 더 세는 반복문에서 나온 IndexError는 잡을 오류가 아니라 고칠 실수예요.

Windows와 Excel의 런타임 오류 메시지

이 용어는 여러분의 코드 밖에서도 보예요. 제목이 Microsoft Visual C++ Runtime Library이고 Runtime Error!라고 적힌 Windows 대화 상자는 C++로 작성된 프로그램에 치명적인 오류가 발생해 C++ 런타임이 그 프로그램을 끝냈다는 뜻이에요. 사용자는 그 코드를 바꿀 수 없으므로, 보통의 해결책은 프로그램 업데이트, Microsoft Visual C++ 재배포 가능 패키지 복구 또는 재설치, 게임이라면 그래픽 드라이버 업데이트예요.

VBA로 작성된 Excel 매크로는 번호가 붙은 런타임 오류를 보고해요. Run-time error '9': Subscript out of range는 매크로가 존재하지 않는 워크시트나 배열 원소를 요청했다는 뜻이고, Run-time error '1004'는 통합 문서, 시트, 범위에 대한 작업이 실패할 때 나는 일반 오류예요. 개념은 Python과 같아요. 올바른 코드가 처리할 수 없는 값을 만난 거예요.

다음 단계

런타임 오류에는 형제가 둘 있어요. 프로그램이 시작되기 전에 발견되는 구문 오류와, 메시지를 전혀 내지 않는 논리 오류예요. 비정상 종료 대신 런타임 오류에서 회복하려면 예외 처리를 읽고, 이어서 Python의 예외와 오류 디버깅 가이드를 읽으세요. Python 강좌에서는 매 레슨마다 이런 코드를 작성하고 고쳐 봐요.

자주 묻는 질문

런타임 오류와 구문 오류는 어떻게 다른가요?
구문 오류는 코드가 언어의 문법을 어겨서 프로그램이 시작되기 전에 발견되므로 한 줄도 실행되지 않아요. 런타임 오류는 그보다 나중, 프로그램이 실행되는 도중에 올바른 줄이 처리할 수 없는 값을 만났을 때 일어나요. 그 앞의 줄은 모두 이미 실행되었고 출력을 남겼을 수도 있어요.
런타임 오류가 자꾸 나는 이유는 무엇인가요?
보통 코드가 데이터에 대해 항상 참은 아닌 가정을 하기 때문이에요. 리스트는 절대 비어 있지 않다, 파일은 존재한다, 사용자는 숫자를 입력한다 같은 가정이죠. 각 가정은 테스트한 입력에서는 맞고, 테스트하지 않은 입력에서 깨져요. 빈 값, 0, 누락된 값, 아주 큰 입력으로 테스트하고, 이런 경우를 명시적으로 검사하거나 처리하세요.
LeetCode에서 Runtime Error는 무슨 뜻인가요?
풀이가 컴파일은 됐지만 적어도 하나의 테스트 케이스에서 비정상 종료됐다는 뜻이에요. 흔한 원인은 범위를 벗어난 인덱스, 0으로 나누기, null이나 None 값 사용, 스택이 넘칠 만큼 깊은 재귀예요. 결과 페이지에 나온 실패 입력을 직접 실행해 보고, 빈 배열, 원소 하나, 허용되는 최대 크기 같은 경계 사례를 확인하세요.
런타임 오류와 예외(exception)는 같은 것인가요?
완전히 같지는 않아요. Python과 Java에서는 대부분의 런타임 오류가 예외로 보고되고, 그래서 프로그램이 이를 잡을 수 있어요. 하지만 C 같은 언어에는 런타임 오류는 있어도 예외는 아예 없어요. Java에서 RuntimeException은 NullPointerException 같은 비검사 예외라는 특정한 예외 계열의 이름이기도 해요.
컴파일러가 런타임 오류를 미리 잡을 수 있나요?
일부만 가능해요. 컴파일러나 mypy 같은 타입 검사기는 숫자에 문자열을 더하는 것처럼 특정 실수가 일어날 수 없음을 증명할 수 있어요. 하지만 사용자가 입력한 숫자가 알고 보니 0인 것처럼, 프로그램이 실행되는 동안 들어오는 값은 알 수 없어요. 이런 오류는 코드를 실행해 봐야 발견되거나 입력을 검사해서 처리할 수밖에 없어요.
Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기