코드를 읽는 순서 (C vs Java vs Python)

코딩C언어JavaPython
읽는데 9분 소요
처음 쓰여진 날: 2026-03-28
마지막 수정일: 2026-03-28
조회수: 4
선수학습(1개)

요약

C, Java, Python이 코드를 읽고 실행하는 순서가 다릅니다. 컴파일러와 인터프리터의 차이, 함수 배치가 달라지는 이유를 알아봅니다.

핵심 정리

언어읽는 방식함수 선언 순서핵심 특징
C위에서 아래로 (1-pass1)호출보다 위에 정의 필요프로토타입으로 해결 가능
Java클래스 전체를 먼저 파악 (2-pass2)순서 무관클래스 안에서 자유롭게 배치
Python위에서 아래로 실행호출 시점에 정의되어 있으면 OKdef는 실행될 때 등록됨

표의 "프로토타입"과 "1-pass / 2-pass"가 낯설어도 괜찮습니다. 아래 각 언어 섹션에서 예시와 함께 설명합니다. 단, C의 1-pass는 "번역하면서 한 번 읽기", Python의 1-pass 실행은 "실행하면서 한 번 읽기"로 의미가 다릅니다.


왜 이걸 알아야 할까? 쌩기초

시험 문제에서 코드를 추적할 때, 함수가 어디에 정의되어 있는지에 따라 읽는 방법이 달라집니다.

  • C: 함수 프로토타입이 보이면 "아래에 함수 정의가 있구나"
  • Java: 클래스 안 어디에 메서드가 있든 호출 가능
  • Python: def가 호출보다 위에 있는지 확인

언어마다 코드를 읽는 방식이 다르기 때문에, 함수와 코드의 배치가 달라집니다. 이 차이를 모르면 "왜 이 함수가 아래에 있는데 호출이 되지?"라는 혼란이 생깁니다.


C언어: 위에서 아래로 읽는다 기초

C 컴파일러(코드를 기계어로 번역해주는 프로그램)는 코드를 첫째 줄부터 순서대로 읽습니다. 아직 읽지 않은 함수는 모릅니다.

정상 작동하는 경우

함수 정의가 호출보다 위에 있으면 문제없습니다.

c
코드 하이라이팅 중...

에러가 나는 경우

함수 정의가 호출보다 아래에 있으면 컴파일러가 함수를 모릅니다.

c
코드 하이라이팅 중...
C 컴파일러의 코드 읽기 순서 - 정상 작동 vs 에러 발생
컴파일러는 위에서 아래로 읽으며, 아직 읽지 않은 함수는 모릅니다.

해결: 함수 프로토타입

함수 프로토타입으로 "이런 함수가 아래에 있다"고 미리 알려줍니다.

c
코드 하이라이팅 중...

C언어 코드 배치가 이런 이유

c
코드 하이라이팅 중...

main()이 맨 아래에 오는 이유가 바로 이것입니다. 위에 정의된 함수들을 모두 호출할 수 있도록 마지막에 배치하는 겁니다.



Java: 클래스 전체를 먼저 파악한다 기초

Java 컴파일러는 코드를 읽을 때 클래스 전체 구조를 먼저 파악합니다. 필드(변수), 생성자(객체를 만들 때 실행되는 함수), 메서드(클래스 안의 함수)를 모두 인식한 다음에 실행합니다.

순서가 자유로운 예시

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

C였다면 addmain보다 아래에 있어서 에러가 나겠지만, Java는 클래스 구조를 먼저 파악하므로 정상 작동합니다.

enum도 마찬가지

enum을 아직 모른다면 이 부분은 건너뛰어도 됩니다. Java가 클래스 전체를 먼저 파악한다는 핵심 원리만 기억하세요.

enum에서 생성자가 상수 선언보다 아래에 있어도 호출됩니다.

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

enum 상수가 반드시 맨 위에 와야 하는 건 Java 문법 규칙이고, 생성자가 아래에 있어도 호출할 수 있는 건 클래스 전체를 먼저 파악하기 때문입니다.


Python: 위에서 아래로 실행한다 기초

Python은 인터프리터(코드를 한 줄씩 읽어서 바로 실행하는 프로그램)가 코드를 위에서 아래로 한 줄씩 실행합니다. C와 비슷하게 위에서 아래로 읽지만, 동작 방식에 차이가 있습니다. C는 컴파일(번역) 단계에서 함수 순서를 확인하지만, Python은 실행하면서 순서를 확인합니다.

def는 실행될 때 등록된다

def는 함수를 정의하는 코드입니다. 다만 이 정의가 실행되는 시점이 중요합니다. Python은 def add(...): 줄을 만나야 비로소 "아, add라는 이름의 함수가 있구나"하고 목록에 적어둡니다. def 줄이 실행되기 전까지는 그 함수를 호출할 수 없습니다.

python
코드 하이라이팅 중...

def 전에 호출하면 에러

def가 실행되기 전에 함수를 호출하면 에러가 납니다.

python
코드 하이라이팅 중...

NameError는 "등록되지 않은 이름을 사용했다"는 에러입니다. Python이 add라는 이름을 목록에서 찾지 못했을 때 발생합니다.

함수 안에서 아래 함수를 부르는 건 OK

python
코드 하이라이팅 중...

여기서 중요한 구분이 있습니다. 함수를 정의하는 것함수를 호출하는 것은 다릅니다.

  • def funcA():funcA를 정의(등록)하는 시점. 이 줄이 실행될 때 Python은 "아, funcA가 있구나"하고 기록합니다. 안에 있는 funcB() 코드는 아직 실행되지 않습니다.
  • funcA()funcA를 호출하는 시점. 이 줄이 실행될 때 비로소 funcA 내부의 funcB()가 실행됩니다.

마지막 줄 funcA()가 실행되는 시점에는 이미 def funcA()def funcB() 모두 실행되어 두 함수가 등록되어 있습니다. 그래서 funcA 안의 funcB() 호출도 정상 작동합니다.

Python 함수 정의 시점 vs 호출 시점
def는 함수를 등록만 할 뿐, 내부 코드를 실행하지 않습니다. 호출될 때 비로소 실행됩니다.

세 언어 비교 정리

같은 코드, 다른 결과

아래에 정의된 함수를 위에서 호출하는 구조입니다.

c
코드 하이라이팅 중...

프로토타입 없이는 에러가 납니다.

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

같은 클래스 안이면 순서 상관없이 정상 작동합니다.

python
코드 하이라이팅 중...

def가 실행되기 전에 호출하면 에러가 납니다.

비교 표

상황CJavaPython
함수를 아래에 정의하고 위에서 호출에러 (프로토타입 필요)정상 작동에러 (def가 먼저 실행되어야 함)
main()의 위치보통 맨 아래어디든 가능관례상 맨 아래
해결 방법함수 프로토타입해결할 필요 없음def를 위에 배치
읽는 주체컴파일러 (1-pass)컴파일러 (2-pass)인터프리터 (1-pass 실행)

C에서 main()이 맨 아래에 오는 이유는 위에서 아래로 읽기 때문입니다. main()이 위에 있으면 그 아래의 함수들을 아직 모르는 상태에서 호출하게 됩니다. Python도 같은 이유로 관례상 main()에 해당하는 코드를 맨 아래에 씁니다.


Footnotes

  1. 1-pass: 코드를 처음부터 끝까지 한 번만 읽으면서 처리하는 방식

  2. 2-pass: 코드를 두 번 읽는 방식. 첫 번째에 전체 구조를 파악하고, 두 번째에 실행