이번 주에는 C 언어와 필수 자료구조를 다루는 주차였기 때문에, 가장 우선적으로 잡은 목표는 C 언어의 포인터 개념에 익숙해지는 것과 SQL 처리기에서 전체 파싱 흐름을 이해하는 것이었다.
저번 주에는 문제를 풀기 전 설계, 변수명, 시간복잡도 같은 요소들을 더 신경 써보려는 목표가 있었지만, 이번 주는 방향이 조금 달랐다. 이번에는 C 언어 자체가 익숙하지 않았기 때문에, 설계나 코드 품질을 세밀하게 챙기기보다는 강의를 듣고 짧은 연습문제를 직접 풀어보면서 언어 자체에 익숙해지는 것에 더 집중했다.
또한 수요 코딩회의 SQL 처리기 구현에서도 완성도 높은 확장 구현보다는, 최소 기능을 먼저 만들고 AI가 생성한 코드를 분석하면서 흐름을 이해하는 것에 더 비중을 두었다. 이번 주는 결과적으로 “잘 설계하는 연습”보다는, C 언어와 포인터, 그리고 SQL 처리기의 구조를 이해하는 주간이었다고 정리할 수 있다.
시도한 접근 방식
이번 주에는 처음부터 C 언어를 완벽히 이해하려 하기보다는, 먼저 강의를 중심으로 개념을 익히고, 이후에 간단한 연습문제를 풀면서 익숙해지려고 했다. 특히 AI에게 짧은 문제를 만들어 달라고 해서 직접 풀어보는 방식으로 반복 연습을 했다.
돌아보면, 이번 주에는 코드를 눈으로만 따라간 경우가 많았는데, 그 과정에서 메모리 그림을 함께 그리면서 공부했으면 더 좋았겠다는 생각이 들었다. 포인터나 자료구조는 코드만 보는 것보다, 실제 메모리에서 어떤 값이 저장되고 어떤 주소를 가리키는지를 그림으로 그려야 훨씬 잘 이해된다는 점을 느꼈다. 그래서 이번 주의 방식은 강의와 간단한 문제 풀이 중심이었다면, 다음에는 여기에 메모리 그림까지 반드시 함께 가져가야겠다고 생각했다.
자료구조를 이해할 때는 특히 그림을 통해 연결 구조를 따라가려고 노력했다. Linked List를 볼 때도 단순히 코드 줄을 읽기보다, 어떤 노드가 어디를 가리키고 있고, 어디서 연결이 끊기고 다시 이어지는지를 그려보면서 이해하려고 했다. 이 과정에서 포인터를 따라가며 구조를 보는 감각이 조금씩 생겼다.
SQL 처리기 프로젝트에서는 INSERT와 SELECT 기능을 최소 단위로 먼저 구현한 뒤, 그 코드를 따라가면서 전체 흐름을 이해하려고 했다. 단순히 “기능이 동작한다”에서 끝내지 않고, SQL 구문 → 파싱 → execute → storage로 이어지는 흐름을 하나의 처리 과정으로 이해하려고 노력했다. 이번 주에는 구현 자체보다도, 각 단계가 어떤 역할을 맡는지를 따라가며 보는 접근이 더 컸다.
AI는 주로 C 문법 설명과 포인터의 메모리 구조 설명을 받는 데 사용했다. 특히 이해가 안 되는 코드 줄이 있을 때는 전체 코드를 다시 달라고 하기보다, “이 줄이 왜 필요한지”, “이 포인터가 지금 무엇을 가리키는지”처럼 좁혀서 질문하려고 했다.
문제와 해결 과정
이번 주에 가장 오래 붙잡고 있었던 것은 포인터 표현식 이해, 그중에서도 *p++ 같은 표현이었다. 겉으로 보기에는 짧은 코드인데, 실제로는 연산자 우선순위와 포인터 이동, 역참조가 한 번에 섞여 있어서 쉽게 이해되지 않았다.
특히 헷갈렸던 점은 문자열 배열과 포인터의 관계, 그리고 경우에 따라 왜 이중 포인터가 필요한지헷갈였다. 예를 들어 char 배열이 문자열을 담고 있을 때, 그것이 단순한 배열인지, 포인터처럼 동작하는지, 또 어떤 상황에서 char *와 char **가 구분되는지 완전히 명확하게 잡히지 않았다. 지금도 완전히 이해했다고 말하기는 어렵지만, 적어도 어디가 헷갈리는지는 조금 더 분명하게 알게 되었다.
이 문제를 해결하려고 할 때 가장 많이 사용한 방법은 AI에게 특정 줄의 역할을 좁혀서 질문하는 방식이었다. “이 줄이 왜 필요한지”, “여기서 p가 가리키는 대상이 뭔지”, “증가되는 건 주소인지 값인지” 같은 방식으로 하나씩 확인하려고 했다. 아직은 코드 전체를 한 번에 이해하기보다, 한 줄씩 잘라서 해석하는 방식이 더 잘 맞는다고 느꼈다.
SQL 처리기에서는 세부 구현 하나하나보다도, SQL 구문이 들어와서 파싱되고, 실행을 거쳐 저장 단계로 가는 전체 흐름을 이해하려고 했다. 즉, 입력된 SQL 문장이 단순한 문자열이 아니라, 파싱을 통해 구조화되고, 그 결과가 실행 단계에서 실제 동작으로 이어지며, 마지막에는 storage에서 파일에 반영된다는 흐름을 파악한 것이 가장 큰 수확이었다.
새롭게 배운 점
이번 주를 통해 가장 크게 느낀 점은, C 언어는 메모리를 직접 의식하면서 공부해야 하는 언어라는 점이었다. 파이썬처럼 결과만 보고 넘어갈 수 있는 부분이 적고, 포인터와 주소, 값의 관계를 정확히 이해해야 코드의 동작 원리가 보인다는 것을 느꼈다. 그래서 단순히 문법을 외우는 것보다, 메모리를 직접 그려보며 문제를 푸는 방식이 훨씬 중요하겠다는 생각이 들었다.
자료구조를 공부하면서도 비슷한 점을 느꼈다. 특히 Linked List처럼 연결 관계가 중요한 구조는, 코드만 보고 이해하려고 하면 금방 헷갈리기 쉽다. 반대로 그림으로 노드와 포인터의 연결 상태를 그려 보면, 어디서 연결이 끊기고 어디에 다시 붙는지가 훨씬 잘 보인다. 그래서 이번 주에는 “그림 없이 코딩하면 헷갈리기 쉽다”는 점을 분명히 배웠다.
SQL 처리기 프로젝트를 하면서는, 작은 DB 처리 흐름이 어떻게 구성되는지 감을 잡을 수 있었다. 입력 → 파싱 → 실행 → 저장이라는 흐름은 단순히 이번 과제만의 구조가 아니라, 데이터를 처리하는 프로그램 전반에 공통적으로 적용될 수 있는 사고방식이라는 점에서 의미가 있었다.
또 발표를 들으면서 AST 구조를 사용한 팀이 있었는데, 그 부분이 인상 깊었다. 같은 SQL 처리기라도 단순 문자열 분기 수준을 넘어서 더 구조화된 방식으로 접근할 수 있다는 점이 흥미로웠고, 나중에 AST가 어떤 식으로 파싱 결과를 표현하는지 더 알아보고 싶다는 생각이 들었다.
다음 주 계획
다음 주에는 이번 주에 느꼈던 부족한 점을 바탕으로, C 언어 문법 복습, 테스트 습관 만들기, 그리고 메모리 구조를 그려가며 문제를 푸는 방식을 가장 우선적인 목표로 잡고 싶다.
이번 주에는 이해 중심으로 접근한 덕분에 큰 흐름은 볼 수 있었지만, 반대로 테스트를 꼼꼼히 붙이거나 코드를 검증하는 습관은 부족했다. 그래서 다음 주에는 단순히 “동작하는 코드”를 넘어서, 작은 기능이라도 직접 테스트하면서 확인하는 습관을 들이고 싶다.
또 포인터와 자료구조는 머릿속으로만 생각하면 자주 헷갈리기 때문에, 다음부터는 코드를 치기 전에 먼저 메모리 그림을 그리고 시작하는 방식을 습관으로 만들고 싶다. 특히 포인터 이동, 연결 리스트 구조, 함수에 포인터를 넘길 때 값이 어떻게 바뀌는지를 그림으로 먼저 정리하고 나서 코드를 작성해보려고 한다.
정리하면 다음 주 목표는 아래처럼 잡고 싶다.
1. C 언어 문법과 포인터 개념을 다시 복습하면서, 헷갈리는 표현식을 메모리 그림으로 설명할 수 있을 정도로 정리하기
2. 자료구조 문제를 풀 때 코드를 바로 쓰기보다, 먼저 연결 구조와 메모리 상태를 그림으로 그리고 시작하기