"파싱(Parsing)"
프로그래밍에서 매우 중요한 개념으로, 특히 텍스트 데이터를 처리할 때 자주 사용됨.
쉽게 말하면, 특정 형식(규칙)을 가진 문자열을 의미 있는 단위(토큰)로 분해하고, 그 구조를 분석하는 과정.
좀 더 풀어서 설명하면:
문자열:
파싱의 대상은 보통 텍스트, 즉 문자열을 말한다.
이 문자열은 특정 형식(format)이나 규칙(rule)을 따르고 있다.
예를 들어, CSV 파일, HTML, XML, JSON, 프로그래밍 언어 소스 코드 등이 모두 특정한 형식을 가지고 있다.
의미 있는 단위 (토큰):
형식에 따라 문자열을 더 작은 조각으로 나눈다.
이 조각들을 "토큰(token)"이라고 하는데, 예를 들어, CSV 파일에서는 쉼표(,)로 구분된 각각의 값들이 토큰이 되고, HTML에서는 <p>, <div>, </p>와 같은 태그들이 토큰이 될 수 있다.
구조 분석:
토큰들 사이의 관계를 파악하여 전체적인 구조를 이해한다.
예를 들어, HTML에서 <p>This is a paragraph.</p>라는 문자열이 있다면, <p>는 단락의 시작, </p>는 단락의 끝, "This is a paragraph."는 단락의 내용이라는 것을 파악하는 것.
프로그래밍 언어에서는 문법 규칙에 따라 코드가 올바르게 작성되었는지 확인하고,
어떤 의미를 가지는지 분석한다.
결과:
파싱의 결과는 보통 추상 구문 트리(AST, Abstract Syntax Tree) 와 같은 자료 구조로 표현된다.
AST는 파싱된 텍스트의 구조를 트리 형태로 나타낸 것으로, 프로그램을 분석하고 실행하는 데 사용된다.
간단한 경우에는 구조체나 클래스의 객체 형태로 바로 변환될 수도 있다
(예: CSV 파일의 한 줄을 Item 구조체로 변환).
예시:
CSV 파일 파싱:
1,Apple,개 2,Banana,개
이 CSV 문자열을 파싱하면 다음과 같은 토큰으로 분리된다:
1
Apple
개
2
Banana
개
그리고 이 토큰들을 묶어서 다음과 같은 구조로 만들 수 있다:
[
{ number: 1, name: "Apple", unit: "개" },
{ number: 2, name: "Banana", unit: "개" }
]
HTML 파싱:
HTML
<h1>Hello, world!</h1>
<p>This is a paragraph.</p>
이 HTML 문자열을 파싱하면 다음과 같은 구조를 파악할 수 있다:
<h1> 태그: 제목 (heading) 레벨 1
내용: "Hello, world!"
<p> 태그: 단락 (paragraph)
내용: "This is a paragraph."
프로그래밍 언어 파싱 (C++):
C++
int x = 10 + 5;
이 C++ 코드를 파싱하면 다음과 같은 구조를 파악할 수 있다:
int: 변수 타입 (정수)
x: 변수 이름
=: 할당 연산자
10: 숫자 리터럴
+: 덧셈 연산자
5: 숫자 리터럴
;: 문장의 끝
현재 코드에서의 파싱:
loadItemListFromCSV 함수에서 CSV 파일을 파싱하고 있다.
while (getline(file, line)) { // 파일에서 한 줄씩 읽기
stringstream ss(line); // 읽은 줄을 문자열 스트림으로 만들기
string segment;
vector<string> row_data;
while (getline(ss, segment, ',')) { // 쉼표(,)를 기준으로 문자열 분리
row_data.push_back(segment); // 분리된 데이터를 row_data 벡터에 추가
}
// ... row_data를 사용하여 Item 객체 생성 ...
}
- getline(file, line): 파일에서 한 줄을 읽어 line 변수에 저장.
- stringstream ss(line): 읽은 줄(line)을 stringstream 객체 ss로 만들기. stringstream은 문자열을 마치 파일처럼 다룰 수 있게 해준다.
- while (getline(ss, segment, ',')): ss에서 쉼표(,)를 기준으로 문자열을 분리하여 segment 변수에 저장. 이 과정을 반복하여 한 줄의 모든 데이터를 분리.
- row_data.push_back(segment): 분리된 각 데이터(segment)를 row_data 벡터에 추가.
- row_data에 있는 값들을 stoi등의 함수를 이용하여 알맞은 type으로 변환한 다음 Item 객체를 생성.
이 과정이 바로 CSV 파일의 한 줄을 파싱하여 의미 있는 데이터(Item 객체)로 만드는 과정.
파싱이 필요한 이유:
데이터 추출: 텍스트 형식의 데이터에서 필요한 정보를 추출한다.
데이터 변환: 텍스트 데이터를 프로그램에서 사용하기 쉬운 형태(객체, 자료구조 등)로 변환한다.
데이터 검증: 입력 데이터가 올바른 형식인지 확인한다.
코드 실행: 프로그래밍 언어의 경우, 파싱을 통해 소스 코드를 컴퓨터가 이해할 수 있는 형태로 변환하여 실행한다. (컴파일러, 인터프리터)
간단히 말해, 파싱은 텍스트를 의미 있는 정보로 바꾸는 핵심적인 과정을 말한다.
'C++' 카테고리의 다른 글
| 비트 변환하기 (bitset) (0) | 2025.09.13 |
|---|---|
| c++로 조합 구현하기 (0) | 2025.06.19 |
| 커스텀 변수 연산자 오버로딩 (0) | 2025.06.17 |
| 정렬용 비교 함수 객체 (0) | 2025.06.17 |
| 포인터 (나중에 다시 또 공부하기;) (1) | 2025.06.17 |