Search
Duplicate
🌱

get_next_line 무서웠던 과제에 대한 이야기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
42cursus
Scrap
태그
9 more properties
피신도 했고, libft도 성공적 완료! 이제 split도 거뜬하군 ! 나도 나름 머찐 개발자가 될 상이군 했는데…
gnl 을 마주쳤을땐 새로운 장벽에 부딪힌 느낌이였습니다.
오늘 제가 쓸 글은 과제를 풀기 위한 공략집이라기 보단 아무것도 모르던 뉴비가 저 장벽을 넘기 위해 어떻게 접근 했었는지, 그래서 어떻게 풀었는지를 이야기 해보는 글 입니다. 아직도 모르는게 많기 때문에 너그럽게 읽어주시면 감사하겠습니다.

get_next_line…?

여러분도 잘 아시다시피 get_next_line은 열려있는 파일 등으로 부터 한줄(\n이나 EOF까지의 문자열)을 읽어오는 함수 입니다.
그런데 처음에 과제를 열었을 시점에는 이게 와닿지가 않았었어요. 왜냐하면 파일의 입출력에 대해서는 다뤄보지를 않았었고 더 중요한건 이 함수를 도대체 어떻게 써먹을지 모르겠었거든요(아 printf mandatory로 튈까 하는 생각을 제일 먼저 했었어요.)

아 대충 내가 구현 해야하는게 뭔지 파악 해보자.

처음에 과제를 열었을땐 눈 감고 귀 닫고 있었던 것과 비슷한 상태였어요. 아무리 주변에서 어떻게 구현해야할지 힌트를 주고 알려주려고 해도 감이 하나도 안왔어요.
일단 뭘 만들어야하는지, 어떻게 써야하는지 모르겠으니 이걸 한번 해결 하면 낫지 않을까 하는 생각이 들었어요.

비슷한 함수가 있지 않을까?

그래서 일단 제일 먼저 한 일은 gnl 과 비슷한 기능을 하는 함수들을 찾아보는 것이였어요.
python 의 readlines 랑 같은건가? c에는 fgets 같은 애들이 있구먼? (https://www.tutorialkart.com/c-programming/c-read-text-file/) 하면서 과제 자체에 대한 두려움을 떨쳐 냈어요!
이 과정에서 ㅇㅋㅇㅋ 함수를 호출할때마다 \n이 있는 한줄을 읽어오거나 \n이 없는 경우엔 파일의 끝까지 읽어서 리턴 하면 되는군 하는 생각을 했습니다.

허용 함수는 왜 있지? 어떻게 쓰는거지?

위에서 비슷한 함수를 찾아보면서 허용함수를 살펴 보았는데 read가 있었고, 왜 read가 있는데 gnl을 또 만들어야하지 라는 생각을 아주 잠깐 해봤어요. 아 이친구는 내가 정한 만큼만 읽어오고 잘 읽었는지 확인만 할 수 있는 애구나. 하는 생각을 하면서 그러면 얘는 어떻게 써먹지 하며 예제를 만들어서 풀어보았습니다.

허용 함수 들을 사용해보자.

gnl 이후 모든 과제들에 대해서 활용해보고 있는 방법인데, 과제에 들어가기에 앞서서 직접 허용함수를 사용하는 예제를 만들어서 사용해보고, 이 허용함수가 왜 필요한지, 다른 허용함수들과는 무슨 관계인지 생각을 해보았습니다.
과제와 의미가 있든 없든 틀렸든 맞았든 상관 없이 그냥 무지성으로 이게 이렇게 되는거면 이렇게도 해볼까? 이건 그럼 이렇게 하면 이렇게 나오겠지, 다른 사람들은 어떤 예제를 해봤을까 하면서 그냥 예제들을 만들어보고 지우고 다시 만들고 하면서 가지고 놀아봤습니다.
허용 함수는 아니지만, open_test와 fd 관련 테스트들
일단 read를 하기 위해선 파일을 열어서 읽어봐야하고, 보너스를 하려면 여러 파일을 불러와야하는데, 이부분을 깊게 공부할 순 없고 해서, 대충 필요하다 싶은 것들만 찾아서 예제 코드를 만들어보았습니다.
대충 예제 코드
read
어떻게 호출 해야하는지 부터 시작해서, 출력은 어떻게 되는지, 한칸씩 한칸씩 올라가보면서 예제를 작성 했습니다.
대충 예제 코드

진짜 구현 하기

화이트 보드에 설계 하기

허용함수들을 갖고 놀면서 어느정도 생각을 정리 하고, 감이 잡혔다 싶었을 때 부터는 키보드에서 손을 떼고 어떻게 구현을 해야 좋을지 생각만 계속 했어요. 사실 생각 정리를 하는데만 2일 정도 걸렸던 것 같습니다.
처음에는 위와 같이 제가 생각한 흐름을 마구 그렸고, 그 과정에서 필요 할 것 같은 libft함수들도 생각해봤습니다.
그리고 이 그림을 계속 보면서 다듬어보았고, 다른 사람들에게 계속 설명만 했어요.
이 과정에서 buffersize를 늘려보기도 하고 줄이기도 하고,
제가 생각하는 최악의 경우도 생각 해보기도 했고,
어떤 함수들을 사용 하는 것이 가장 좋은지에 대한 생각도 해보았습니다.
(아 str 시리즈들은 안의 데이터를 보니까 0의 영향을 받으니, mem 시리즈를 사용하는게 낫겠고, dup이나 join은 사용할 필요가 없구나 하는 것들이요)
그렇게 몇 번을 다듬어 보고 나니 아래와 같이 간단한 그림(?)이 나왔습니다.
그리고 이 그림대로 구현을 하기 시작 했어요.

코드 구현 feat. 동료 학습

이제 키보드를 두드려보기로 하자마자 사실 버벅이기 시작했어요. 로직은 맞는것 같은데 이로직을 코드로 옮기는 과정이 두려웠거든요.
이 로직을 코드로 구현하려면 도대체 어떻게 해야하지?
그리고 이부분은 옳은걸까? 돌아가는 걸까?
하지만 위와 같은 문제는 앞의 경우와 다르게 무척이나 빨리 해결이 되었어요.
왜냐하면, 제가 머리를 박고 있을때마다 달려와서 도와주는 동료들이 있었거든요.
어떤 부분을 이렇게 이렇게 하려고 하는데 결과가 이렇게 나온다. 나는 이렇게 생각하는데 이 코드는 이부분을 이렇게 처리 하는 것 같다는 설명을 하면 그 설명을 귀 기울여 듣고 이 부분은 이런거 아닐까? 하고 가르쳐주는 친구 들이 있었고, 그 덕분에 포기 하려고 했던 로직을 살려서 과제를 해결 할 수 있었습니다.

gnl 을 해결 하고 나서 배운 것

피신 과정에서 여러 과제들을 하면서 항상 익숙해질 쯤에 새로운 장벽을 만난다는 느낌을 받았었어요. 본과정에 와서도 매 과제마다 이런 장벽을 느끼곤 하는데, gnl 은 피신때와는 다른 새로운 첫 장벽을 마주한 느낌이였습니다. 왜냐하면 저는 코딩 몬하는 응애 애기니까요 ㅠ.
그런 만큼 gnl을 해결했을땐 새로운 것들을 많이 배웠다는 생각이 들었었어요.
처음으로 내가 만들었던 아주 작은 함수들을 엮어서 더 큰 로직의 함수를 만들어봤고, 그 과정에서 생각을 아주 작은 논리 단위의 부품들로 쪼개서 엮으면 코드로 표현해낼 수 있고 그 것이 작동을 한다는 것을 배웠어요.
그리고 무작정 안되겠다는 생각 대신 동료들과 머리를 맞대고 같이 이야기 한다면 정말 쉽게 문제를 해결 할 수 있다는 것도 배울 수 있었습니다.