---
title: "추상 구문 트리: 코드의 표기에서 구조와 의미로"
author: "Lee"
published_at: "2026-10-15T04:11:02.314Z"
updated_at: "2026-09-30T10:08:12.021Z"
tags: ["컴퓨터공학","프로그래밍언어"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%EC%B6%94%EC%83%81-%EA%B5%AC%EB%AC%B8-%ED%8A%B8%EB%A6%AC-%EC%BD%94%EB%93%9C%EC%9D%98-%ED%91%9C%EA%B8%B0%EC%97%90%EC%84%9C-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%9D%98%EB%AF%B8%EB%A1%9C"
ai_assisted: false
---

# 추상 구문 트리: 코드의 표기에서 구조와 의미로

[원문](https://ariser.io/@writer_a1cd615ab19e/%EC%B6%94%EC%83%81-%EA%B5%AC%EB%AC%B8-%ED%8A%B8%EB%A6%AC-%EC%BD%94%EB%93%9C%EC%9D%98-%ED%91%9C%EA%B8%B0%EC%97%90%EC%84%9C-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%9D%98%EB%AF%B8%EB%A1%9C)

컴파일러가 코드의 일부를 바꾸거나 타입을 검사하려면 문자를 다시 하나씩 읽는 방식은 불편하다. 추상 구문 트리, AST는 프로그램의 구조를 노드와 연결 관계로 표현하는 자료구조다. 숫자 리터럴, 변수 참조, 함수 호출, 조건문 같은 단위를 직접 담아, 이후 도구가 언어의 의미 있는 구성 요소를 대상으로 작업하게 한다.

![total = price * quantity를 대입과 곱셈, 변수 참조 노드로 나타낸 추상 구문 트리](/api/v1/media/57e67d24-20e9-452d-8c34-c64c0e05a4d9)

*AST는 이후 분석과 변환이 다룰 수 있도록 코드의 구조를 표현한다.*

## 무엇을 남기고 무엇을 줄일까

구체적인 구문 트리는 문법 규칙이 전개된 모습을 자세히 보여 준다. 괄호나 세미콜론, 중간 문법 기호도 나타날 수 있다. AST는 대체로 이런 표기의 세부사항을 줄이고 연산과 문장 사이의 관계를 드러낸다. 예를 들어 `a + (b * c)`를 덧셈 노드와 곱셈 노드, 변수 참조 세 개로 표현할 수 있다. 괄호의 역할은 트리의 중첩 구조에 이미 반영된다.

다만 AST가 반드시 모든 괄호를 버린다고 단정할 수는 없다. 도구의 목적에 따라 원래 표기나 암시적인 형 변환, 소스 위치를 보존하기도 한다. [Clang의 AST 소개](https://clang.llvm.org/docs/IntroductionToTheClangAST.html)는 원래 작성된 코드와 가까운 표현을 유지하며 괄호 표현식 노드도 남기는 설계를 설명한다. 추상화 수준은 한 가지 고정된 형식이 아니라 설계 선택이다.

## 트리를 따라 코드를 이해한다

`total = price * quantity`의 AST에서는 대입 노드가 왼쪽의 변수와 오른쪽의 곱셈을 연결한다. 곱셈 노드는 다시 두 변수 참조를 연결한다. 타입 검사기는 자식 표현식의 타입을 확인하고 부모 연산의 규칙을 적용할 수 있다. 변수 참조를 실제 선언에 연결하는 이름 해석 정보가 붙으면, 같은 철자의 이름도 다른 범위의 변수로 구분할 수 있다.

노드를 차례로 방문하는 순회 방식은 컴파일러의 여러 작업에서 쓰인다. 상수 표현식 `2 * 3`을 숫자 6으로 바꾸는 상수 접기, 사용하지 않는 문장의 진단, 함수 호출 위치 수집 등이 예다. 방문자 패턴처럼 노드 종류에 따라 작업을 나누는 설계도 있다. 하지만 소스 위치 정보 없이 결과만 바꾸면 원래 코드에 대한 오류 표시와 디버깅 경험이 나빠질 수 있다.

## 구조가 같아도 바꿀 수 없는 경우

모양만 보고 `x * 0`을 항상 0으로 바꾸면 위험하다. 일부 부동소수점 값에는 같은 등식이 그대로 성립하지 않고, `x`가 함수 호출이라면 그 호출의 부수 효과를 없애 버릴 수 있다. `f() + g()`의 좌우를 바꾸는 일도 언어의 평가 순서와 효과를 고려해야 한다. AST 변환은 문자열 편집보다 구조적이지만 의미 보존까지 자동으로 보장하지는 않는다.

AST는 기계어 명령의 배열과도 다르다. 같은 조건문 노드가 여러 분기 명령으로 내려갈 수 있고, 최적화 과정에서 원래 표현식의 형태가 사라질 수도 있다. 컴파일러는 AST 이후에 제어 흐름 그래프나 다른 중간 표현을 사용해 기계와 가까운 분석을 수행한다. 따라서 AST의 노드 수와 CPU가 실행할 명령 수를 일대일로 대응시키면 부정확하다.

리팩터링, 코드 검사, 보안 분석 도구가 AST를 쓰는 이유는 이름과 연산, 범위를 구조적으로 이해할 수 있기 때문이다. 다만 주석과 공백까지 보존하며 파일을 다시 출력하려면 별도 표기 정보나 구체 구문 트리가 더 적합할 수 있다. 어떤 노드를 남길지 결정할 때는 컴파일, 분석, 자동 수정 가운데 도구가 해결하려는 문제를 먼저 살펴야 한다.

### 참고 자료

- [Clang — Introduction to the Clang AST](https://clang.llvm.org/docs/IntroductionToTheClangAST.html)
