정처기 감자정처기 감자
공통 기초프로그래밍 기초

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

컴파일과 런타임의 차이

코딩C언어JavaPython
읽는데 17분 소요
처음 쓰인 날: 2026-02-03
마지막 수정일: 2026-03-27
조회수: —

요약

컴파일 시점과 런타임 시점의 차이를 알아봅니다. C, Java, Python 공통 개념으로, 메모리 구조와 동적 메모리 할당을 이해하기 위한 필수 배경 지식입니다.

핵심 정리

구분컴파일 시점런타임 시점
시점소스 코드 → 실행 파일 변환 시프로그램 실행 중
결정되는 것배열 크기, 지역 변수 크기, 타입malloc 크기, 사용자 입력
오류문법 오류, 타입 오류0으로 나누기, 널 포인터 접근

핵심 정리

구분컴파일 시점런타임 시점
시점소스 코드 → 바이트코드 변환 시프로그램 실행 중
결정되는 것변수 타입, 오버로딩(컴파일타임 바인딩), 제네릭 타입 소거사용자 입력, 오버라이딩
오류문법 오류, 타입 오류NullPointerException, ArrayIndexOutOfBounds

핵심 정리

구분컴파일 시점런타임 시점
시점소스 코드 → 바이트코드 변환 시프로그램 실행 중
결정되는 것문법 검사타입, 변수, 리스트 크기 등 거의 모든 것
오류SyntaxErrorTypeError, IndexError, NameError 등

컴파일이란?

컴파일(Compile) 은 사람이 작성한 소스 코드를 컴퓨터가 이해할 수 있는 형태로 변환하는 과정입니다.

text
코드 하이라이팅 중…
c
코드 하이라이팅 중…

위 코드를 컴파일하면 실행 가능한 파일이 생성됩니다.

bash
코드 하이라이팅 중…

Java는 소스 코드를 바이트코드로 컴파일하고, JVM(Java Virtual Machine)이 실행합니다.

text
코드 하이라이팅 중…
java
코드 하이라이팅 중…
bash
코드 하이라이팅 중…

컴파일 과정에서 Java의 제네릭 타입 소거도 발생합니다. <T>로 선언한 타입 정보가 .class 파일에서는 Object로 바뀝니다. 같은 단계에서 컴파일타임 바인딩도 일어납니다. 오버로드된 메서드 중 어느 것을 호출할지가 선언 타입을 기준으로 .class 파일 안에 고정됩니다.

Python은 인터프리터 언어로 불리지만, 실행 전에 내부적으로 바이트코드(.pyc)로 변환하는 과정을 거칩니다.

text
코드 하이라이팅 중…
python
코드 하이라이팅 중…
bash
코드 하이라이팅 중…

C나 Java와 달리 별도의 컴파일 명령이 필요 없습니다. 하지만 실행 전에 문법 검사(SyntaxError) 가 이루어지므로, 이 단계를 Python의 컴파일이라고 볼 수 있습니다.


런타임이란?

런타임(Runtime) 은 프로그램이 실제로 실행되는 시점을 의미합니다.

단계설명
1. 작성소스 코드 작성 (.c 파일)
2. 컴파일소스 코드 → 실행 파일 변환
3. 런타임실행 파일을 실행하는 시점

런타임에는 사용자 입력을 받거나, 파일을 읽거나, 네트워크 통신을 하는 등 실행 중에만 알 수 있는 일들이 발생합니다.

c
코드 하이라이팅 중…
단계설명
1. 작성소스 코드 작성 (.java 파일)
2. 컴파일소스 코드 → 바이트코드 변환 (.class)
3. 런타임JVM이 .class 파일을 실행하는 시점

런타임에는 사용자 입력을 받거나, 파일을 읽거나, 네트워크 통신을 하는 등 실행 중에만 알 수 있는 일들이 발생합니다.

java
코드 하이라이팅 중…
단계설명
1. 작성소스 코드 작성 (.py 파일)
2. 컴파일문법 검사 + 바이트코드 변환 (.pyc)
3. 런타임바이트코드를 실행하는 시점

Python에서는 컴파일과 런타임이 거의 동시에 일어나지만, 개념적으로는 구분됩니다. 런타임에는 사용자 입력을 받거나, 파일을 읽거나, 네트워크 통신을 하는 등 실행 중에만 알 수 있는 일들이 발생합니다.

python
코드 하이라이팅 중…

컴파일 시점에 결정되는 것

컴파일러가 코드를 분석할 때 미리 알 수 있는 것들입니다.

배열 크기

c
코드 하이라이팅 중…

배열 크기는 컴파일 시점에 상수로 지정해야 합니다.

c
코드 하이라이팅 중…
배열 크기에는 변수를 쓸 수 없습니다
int arr[n]처럼 변수로 배열 크기를 지정하면 컴파일 오류가 발생합니다. 크기를 실행 중에 정하려면 동적 메모리 할당(malloc)을 사용해야 합니다.

지역 변수 크기

c
코드 하이라이팅 중…

함수 호출 시 스택에 얼마만큼의 공간이 필요한지 컴파일러가 미리 계산합니다.

자료형 크기

c
코드 하이라이팅 중…

sizeof 연산자의 결과값은 컴파일 시점에 확정됩니다. 자료형마다 크기가 정해져 있기 때문입니다.

변수 타입

Java는 정적 타입 언어입니다. 변수의 타입은 컴파일 시점에 결정됩니다.

java
코드 하이라이팅 중…
java
코드 하이라이팅 중…

오버로딩 메서드 선택

오버로딩된 메서드 중 어떤 것을 호출할지는 컴파일 시점에 매개변수 타입으로 결정됩니다.

java
코드 하이라이팅 중…

상속과 업캐스팅이 함께 등장하면 호출 메서드가 변수의 선언 타입 기준으로 고정되는 패턴이 됩니다. 자세한 동작은 컴파일타임 바인딩 페이지에서 다룹니다.

제네릭 타입 소거

제네릭의 타입 파라미터 T는 컴파일 후 Object로 바뀝니다.

java
코드 하이라이팅 중…

제네릭 클래스 안에서 이 value를 오버로딩 메서드에 넘기면 예상과 다른 결과가 나옵니다. 다만 소거 자체가 메서드 선택의 기준은 아니고, 호출 위치에 따라 선택되는 메서드가 달라집니다. 자세한 내용은 제네릭과 타입 소거를 참고하세요.

왜 이런 것들을 컴파일 시점에 결정할까?

오버로딩, 제네릭 타입 소거, 컴파일타임 바인딩 — 셋 다 컴파일 시점에 결정됩니다. 이유는 세 가지입니다.

  1. 속도: 어느 메서드를 호출할지, 어느 타입으로 처리할지를 매번 런타임에 다시 따지면 느립니다. 컴파일러가 미리 정해 .class 파일에 적어두면, JVM은 그 결정을 그대로 따라가기만 하면 되어 실행이 빠릅니다.
  2. 오류를 미리 잡기: 잘못된 타입 대입이나 존재하지 않는 메서드 호출은 코드를 쓰는 단계에서 잡아야 수정 비용이 적습니다. 실행 중에 발견하면 이미 사용자가 보고 있는 화면에서 크래시가 납니다.
  3. JVM의 역할 분리: javac만 .java 소스 코드를 읽습니다. JVM은 .class 바이트코드를 받아 그대로 실행만 합니다. 메서드 선택이나 타입 검사처럼 "소스를 봐야 하는 일"은 JVM이 할 수 없으므로 모두 컴파일 시점에 처리해야 합니다.

요약하면 "컴파일러가 미리 알 수 있는 것은 미리 정해두자" 가 컴파일타임 결정의 원리입니다. 변수의 선언 타입, 매개변수 타입, 제네릭 타입은 모두 소스 코드에 적혀 있어 컴파일러가 알 수 있으므로 컴파일 시점에 처리합니다. 반면 실제 객체의 타입이나 사용자 입력은 실행 중에야 알 수 있으므로 런타임에 결정됩니다.

Python의 컴파일 시점에는 문법 검사만 이루어집니다. 타입, 변수 존재 여부 등은 런타임에 확인됩니다.

문법 검사

python
코드 하이라이팅 중…
python
코드 하이라이팅 중…
Python은 문법만 컴파일 시점에 검사합니다
C나 Java와 달리, 존재하지 않는 변수나 잘못된 타입 연산은 실행해봐야 알 수 있습니다. 이것이 Python이 동적 타입 언어인 이유입니다.

런타임에 결정되는 것

프로그램 실행 중에만 알 수 있는 것들입니다.

malloc 크기

c
코드 하이라이팅 중…

위 코드에서 malloc은 프로그램 실행 중에 메모리를 빌려오는 함수입니다. 사용자가 n에 어떤 값을 입력하느냐에 따라 빌려오는 메모리 크기가 달라지므로, 컴파일 시점에는 크기를 알 수 없습니다. 자세한 내용은 동적 메모리 할당에서 다룹니다.

사용자 입력

c
코드 하이라이팅 중…

조건문 결과

c
코드 하이라이팅 중…

조건문의 결과는 실행 중에 변수의 값이 정해져야 알 수 있습니다.

파일 내용

c
코드 하이라이팅 중…

사용자 입력

java
코드 하이라이팅 중…

오버라이딩 메서드 선택

오버라이딩된 메서드는 런타임에 실제 객체의 타입을 보고 결정됩니다.

java
코드 하이라이팅 중…
오버로딩은 컴파일 타임, 오버라이딩은 런타임
같은 이름의 메서드라도 오버로딩(매개변수 타입 다름)은 컴파일 시 결정되고, 오버라이딩(상속 후 재정의)은 런타임에 결정됩니다. 이 차이가 시험에 자주 출제됩니다.

조건문 결과

java
코드 하이라이팅 중…

ArrayList 크기

java
코드 하이라이팅 중…

Python에서는 거의 모든 것이 런타임에 결정됩니다.

변수 타입

python
코드 하이라이팅 중…

Python은 변수를 선언할 때 타입을 지정하지 않습니다. 값을 대입하는 순간 타입이 결정되고, 다른 타입의 값을 다시 대입할 수도 있습니다.

리스트 크기

python
코드 하이라이팅 중…

변수 존재 여부

python
코드 하이라이팅 중…

사용자 입력

python
코드 하이라이팅 중…

컴파일 에러 vs 런타임 에러

컴파일 에러

컴파일 에러는 컴파일 과정에서 발견되는 오류입니다. 프로그램이 아예 실행 파일로 만들어지지 않습니다.

c
코드 하이라이팅 중…
컴파일 에러 종류예시
문법 오류세미콜론 누락, 괄호 불일치
타입 불일치int에 char* 대입
선언되지 않은 변수prinft (오타)
잘못된 연산10 + "hello"

런타임 에러

런타임 에러는 프로그램 실행 중에 발생하는 오류입니다. 컴파일은 성공했지만 실행 중에 문제가 생깁니다.

c
코드 하이라이팅 중…
런타임 에러 종류예시
0으로 나누기a / 0
널 포인터 역참조 1*NULL
배열 범위 초과arr[1000] (크기가 10인 배열)
스택 오버플로우무한 재귀 호출
메모리 부족컴퓨터의 남은 메모리보다 큰 크기를 malloc으로 요청

컴파일 에러

컴파일 에러는 컴파일 과정에서 발견되는 오류입니다. .class 파일이 생성되지 않습니다.

java
코드 하이라이팅 중…
컴파일 에러 종류예시
문법 오류세미콜론 누락, 괄호 불일치
타입 불일치int에 String 대입
선언되지 않은 변수미선언 변수 사용
접근 제어 위반private 메서드 외부 호출

런타임 에러

런타임 에러는 프로그램 실행 중에 발생하는 오류(예외)입니다. 컴파일은 성공했지만 실행 중에 문제가 생깁니다.

java
코드 하이라이팅 중…
런타임 에러 종류예외 클래스
0으로 나누기ArithmeticException
null 참조NullPointerException
배열 범위 초과ArrayIndexOutOfBoundsException
잘못된 형변환ClassCastException
스택 오버플로우StackOverflowError

컴파일 에러 (SyntaxError)

Python에서 컴파일 시점에 발생하는 오류는 SyntaxError뿐입니다. 코드가 실행되기 전에 잡힙니다.

python
코드 하이라이팅 중…

런타임 에러

Python의 대부분 오류는 런타임에 발생합니다. 문법은 맞지만 실행 중에 문제가 생기는 경우입니다.

python
코드 하이라이팅 중…
런타임 에러 종류예외 클래스
0으로 나누기ZeroDivisionError
존재하지 않는 변수NameError
타입 불일치TypeError
인덱스 범위 초과IndexError
속성 없음AttributeError
Python은 타입 오류도 런타임에 발생합니다
C나 Java에서 컴파일 에러인 타입 불일치가 Python에서는 런타임에 발생합니다. '감자' + 10 같은 코드도 해당 줄이 실행될 때까지 오류를 발견하지 못합니다.
시험에서 컴파일 에러와 런타임 에러를 구별하세요
'이 코드의 실행 결과는?'이라고 물으면, 문법이 틀린 코드는 '컴파일 에러'가 정답입니다. 문법은 맞지만 실행 중에 문제가 생기는 코드는 '런타임 에러'입니다.

정리: 컴파일 vs 런타임

구분컴파일 시점런타임 시점
언제코드 → 실행 파일 변환 시프로그램 실행 중
메모리 할당스택 변수, 배열 크기malloc, 동적 배열
오류 발견문법, 타입 오류논리 오류, 예외 상황
오류 시실행 파일 생성 안 됨프로그램 비정상 종료

이 개념을 이해하면 메모리 구조에서 스택과 힙의 차이, 동적 메모리 할당에서 malloc이 필요한 이유를 더 잘 이해할 수 있습니다.

구분컴파일 시점런타임 시점
언제코드 → 바이트코드 변환 시JVM이 프로그램 실행 중
결정변수 타입, 오버로딩(컴파일타임 바인딩), 타입 소거오버라이딩, 사용자 입력
오류 발견문법, 타입 오류예외 (Exception)
오류 시.class 파일 생성 안 됨예외 발생, 프로그램 종료

오버로딩과 오버라이딩의 결정 시점 차이는 오버로딩에서 자세히 다룹니다.

구분컴파일 시점런타임 시점
언제코드 → 바이트코드 변환 시바이트코드 실행 중
검사문법 검사만타입, 변수, 연산 등 모든 것
오류SyntaxErrorTypeError, NameError, IndexError 등
오류 시프로그램 실행 안 됨해당 줄에서 프로그램 종료

Python은 동적 타입 언어이므로 C나 Java보다 런타임에 결정되는 것이 훨씬 많습니다. 이 때문에 코드를 실행해봐야 오류를 발견할 수 있는 경우가 대부분입니다.


Footnotes

  1. 역참조는 포인터가 가리키는 곳의 값을 읽거나 쓰는 것입니다. NULL은 아무 곳도 가리키지 않으므로 역참조하면 오류가 발생합니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
후수학습(3개)
  • Java 컴파일타임 바인딩
  • Java instanceof와 안전한 형변환
  • Java 메서드 오버로딩
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999