6주차다. 이번주차부터 정말 정글 과정을 하는 것 같은 느낌이다.
그래서 배운 것도, 적을것도 많다.
옛날에 했던 C언어를 다시 학습했다. 정글에서는 여기 사이트를 추천했는데, 2시간 반동안 빠르게 훑어보면서 익혔다.
C만의 특징이라면 다름 아닌 '포인터'다. 당시에 포인터를 배울 때는 컴퓨터는 뭐 이렇게 생각하겠지 하면서 공부했던지라 어색하지는 않았는데, C#, Python만 만지다가 오랜만에 돌아오니 당황스러웠다.
Call by value, Call by reference 전부 아는 개념이라 힘들지는 않았는데 문법에서 좀 헤맸다.

변수선언시에 데이터타입에 붙는 *와, 포인터 변수에 붙는 *은 다르다.
*는 변수를 포인터라는 데이터 타입으로 선언한다는 의미이고.
*는 포인터 변수가 저장하고 있는 주소값에서 저장하는 값을 가져온다는 의미다.
*가 없으면 포인터 변수가 저장하고 있는 주소값을 의미한다.

이걸 이중 포인터로 설명한다면.....
**는 변수를 포인터 변수의 주소를 저장하는 이중 포인터라는 데이터 타입으로 선언한다는 의미이다.
이중 포인터 변수에서 **는 이중포인터가 저장하고 있는 포인터변수의 주소값에서 저장하고 있는 주소값에서 저장하고 있는 값이고
이중 포인터 변수에 붙은 *은 이중포인터가 저장하고 있는 포인터변수의 주소값에서 저장하고 있는 주소값을 의미하고
이중 포인터 변수는 이중포인터가 저장하고 있는 포인터변수의 주소값을 의미한다.
뭔가 설명이 간단하지 않지만 이게 맞다.
그 외에는 컴퓨터의 데이터 구조에 대한 학습과 링크드 리스트, 스택과 큐, 이진트리, 이진 탐색트리 구현을 하였다.
이진 탐색트리를 재귀가 아니라 스택으로 구현해야 하다보니 미치는줄 알았다.
이번주차 수요 코딩회에서는 c언어로 sql처리기를 만드는 과제가 주어졌다.
SQL처리기는 sql 문장,즉 쿼리를 입력으로 받아 의미를 해석하고 그에 맞는 데이터 처리나 결과를 출력하는 기능을 한다.
아마도 sql처리기가 컴파일러와 구조가 매우 유사하다보니 일부러 c언어 첫주차에 주어진 것 같다.
이번 과제를 진행할 때 우리조는 2명씩 2팀으로 나눠서 개발을 진행했다.
우리 팀에서는 개발하기에 앞서 어떻게 만들지부터 구상부터 했다.

다음과 같이 구상했다. 정글에서는 강의실로 들어가기 위해 그때마다 카드키를 찍는데, 그때마다 이 카드키가 출입이 허가되는지 확인하고 출입한 로그를 기록하는 데이터베이스를 구상하였다. 학생 정보를 기록하는 표는 csv로 기록하고, 출입로그는 빠르게, 그리고 자주 기록되므로 시간과 데이터를 아끼기 위해 바이너리 데이터로 저장하도록 구상하였다.
우리는 쿼리를 저장할 sql 파일을 만들고 SQL 처리기가 그 sql 파일을 읽어서 명령을 실행하도록 구상했다.
SQL 처리기의 구조는 다음과 같다.
reader: 먼저 여기서 sql 파일을 읽어서 이걸 c언어의 문자열로 변환한다. 우리는 여러 쿼리를 한 파일에 저장하므로 스플리터를 만들어 각 쿼리마다 문자열로 변환하도록 하였다.
tokenizer(lexer): 쪼갠 문자열을 토큰 단위로 나눈다. Insert, INTO, student.csv, VALUES, (, id, name, class, ), ;, 이런식으로 토큰으로 쪼개고 토큰 배열로 만든다.
parser: 토큰 배열을 읽으면서 SQL패턴인지 확인하고 AST(Apstract Syntax Tree, 일종의 구조체라고 볼수 있음. 실행에 필요한 정보만 남긴 구조) 를 만들어낸다
executor: AST를 읽고 실제로 데이터 파일에 할 동작을 결정한다.
우리가 만든 SQL 처리기에서는 SELECT INSERT를 이용하여 총 5가지의 AST가 구현이 되었고, 그걸 이용하여 DB를 조작하고 정보를 출력하도록 만들었다.
나중에 우리조의 다른 팀과 비교해보니 우리 팀과는 달리 따로 구현할 목표를 설정하지 않아 확장성이 유용하도록 설계를 하였다. 토크나이저에서 파서로 넘어갈 때도 우리 팀에서는 토큰 배열로 묶어서 넘겼는데, 다른 조에서는 토크나이저에서 토큰이 만들어지는대로 파서로 넘기고 ; 토큰이 넘어올때 토큰이 끝나도록 설계를 하였다.
기존 방식과 다른방법으로 프로젝트를 진행했는데, 서로 구현 방향과 방법이 다르게 나오다보니 꽤 흥미로웠다.
이번주는 기본적인 c언어 학습에 수요코딩회도 대학교에서 배운 sql 구현이라서 쉽다고 하기에는 좀 뭐하고 익숙한 주차였다는 생각이 든다.
공부가 어렵다기 보다는 여러가지로 회의감이 많이 느껴지는 주차라고 볼수 있을거 같다.
내가 나를 잘 표현 할수 있는가? 쉬우면서도 어려운 질문이다.
학창시절에는 자기소개에 '친한 친구'항목이 가장 쓰기 어려웠는데, 지금은 내 생각 쓰는게 더 어려운 상황이다. 머리 안이 하얘진다.
ai에게 먹일 프롬프트가 중요해지는 현시대에 글의 힘은 참으로 대단하다.
지금 여기서 cs 배우고 있는게 맞는 건지도 모르겠다. 단순히 돈벌이만 생각한다면 그냥 기술 배워서 일하는게 맞을지도 모른다.
꿈 때문에 왔는데 내 현실을 알아간다는게 어떻게 보면 ....표현이 생각 안난다.
표현을 생각해내려면 많은 글을 읽고 써봐야겠지....
다음주차에는 malloc을 직접 만들어본다.
익숙한 c면서 한창 c를 배울 때 잘 안 배우고 넘어간 부분이다.
잘 할수 있을지는 나도 모른다.
다음주차는 의도한대로 흘러간다면 가장 힘든 주차가 될것이다.