Taking baby-developer steps

2022.02.06. ft_printf 시작 본문

Logs/학습 log

2022.02.06. ft_printf 시작

Surin Lee 2022. 2. 6. 16:12

오늘 목표

  • ft_printf()과제 시작하기
    • printf() 원형함수 조사 (in libc)
    • 공부할 내용 계획 세우기

오늘 한 일

이번 ft_printf 과제는 C 표준 라이브러리에서 제공하는 printf()함수를 따라서(mimic) 구현하는 과제이다.

  • printf()원형함수 조사 -> [오늘 printf() 원형함수 조사를 완전히 다 했다고는 못하겠다! 이렇게 방대한 함수일줄은..!]

  터미널에서 "man 3 printf" 명령어로 본 manual중에서, 이번 printf()함수와 관련된 부분만 캡처해서 노션에 붙여놓은건데..! 정말 관련 내용이 많기도 하고, 특히 format관련 옵션들이 많아서 이걸 다 완벽히 공부하고 과제를 시작하려 하면 비효율적일것 같다. 저번 get_next_line 과제 때는 모르는 개념을 모두 공부하고 구현을 시도해서 공부부터 구현까지 만 1개월을 꼬박 넘겼기 때문에..! 그리고 계속 공부만 하다가 방향을 조금이라도 잘못잡으면 너무 삽질을 하게되는것 같아(gnl때는 파일 지시자(file pointer)를 통해 데이터 스트림을 이용해 텍스트 내용을 읽어들여야하는 줄 알고 fopen계열 함수 및 바이너리 텍스트 관련 내용까지 공부했었는데, 공부를 열심히 다 하고 나서 gnl과제에서 사용하는 open함수 및 파일디스크립터는 조금 더 저수준의 개념인 컨널 레벨 수준의 함수라는걸 깨닫는데 시간이 꽤나 들었다), 이번엔 조금 다르게, 구현을 해가면서 printf() 원형함수와의 비교를 하며 조금씩 공부해 봐야겠다.

 오늘 printf()함수에 대해 중요하게 깨달은 점은, printf()는 그냥 단순한 출력함수 인줄만 알았던게 큰 착각이었다는 것이다! (솔직히 프로그래밍 언어를 배울 때 가장 먼저 접하는 printf("Hello World"); 덕인지 이 함수를 아주 만만하게 생각해 오긴했다..!

  1. printf()는 아주 대표적인 가변함수이다.
  2. 받아들인 값을 모두 정해진 format에 맞게 "변환"하는게 핵심 부분이다.

printf()함수의 프로토타입은 다음과 같다.

int	printf(const char *format, ...);

 이와같이 함수 내 마지막 인자(파라미터) 대신 줄임표에 의해 선언되는 함수를 가변함수라고 하는데, 이 가변 함수는 최소 하나의 인자는 가져야하기 때문에 줄임표만 쓸 수는 없다!(다른 인자 없이 줄임표만 쓰는 것은 C언어에서는 허용되지 않지만, C++에선 가능하다고 한다.)

가변함수 관련 헤더는 stdarg.h로, 이번 과제를 해결하기 위해 사용할 수 있는 allowed functions 중  va_start(), va_arg(), va_copy(), va_end() 함수들이 이 헤더 안에 정의되어 있다.

 

  • 이번 과제 공부 계획 세우기

 이번 printf()함수의 첫번째 인자인 format 문자열을 각 옵션 들(%와 type 사이에 오는 모든 것들) 및 type에 맞게 적절히 "변환"해내는게 가장 오래 걸릴것 같다. 각각의 옵션 마다 특정 type을 만나면 아무일도 일어나지 않는 등 무시되는 경우도 있어, 구현해 나가면서 공부해보려 한다.

그리고, 저번 gnl 과제를 해결해 나가며, 특히 디버깅 과정 및 refactoring 과정에서 정말 배운게 많았고 느낀점도 많았지만, 한달이 넘는 시간이 걸렸다는게 조금은 심리적으로 부담이 되었다. 무조건 빠르게 과제를 해결하는 것 보단 이 과제를 통해 내가 배우게끔 의도되는 걸 놓치지 않는게 중요하다고 생각하지만, 그래도 저번 과제는 너무 시간 효율을 챙기지 못한거 같다. 앞으로의 inner circle과정을 1년 안에 돌파 하는 걸 대략적으로 목표해 본다면, 이번 1 circle 과제에서 남아있는 ft_printf 와 born2beroot 과제를 이번 2월 안에 해결하는게 적절하겠다고 판단했다. 따라서 이번 ft_printf 과제는 2주내에 해결해 보겠다는 목표를 잡았다. 

 

  1. ~02.12.(토) ft_printf() 초본 구현
  2. ~02.16(수) 디버깅 & 리팩토링
  3. 02.17(목) 첫 동료평가(3번) 받기
  4. ~02.19(토) 통과하지 못할시, 동료 평가 받으며 받은 피드백을 도움받아 과제 해결하기.

메모

  • printf() 원형 함수를 공부하며 느낀점

 42서울에서 선발 과정부터 printf()를 통한 출력을 금지 시키고, unistd.h에 있는 write()함수만 쓰게 할 땐, 왜 저 편한 printf()를 두고 문자열(char *)만 출력할 수 있는 함수를 쓰게하는 걸까.. 하면서 원망도 많이 했지만, 이번에 printf()함수에 대해 알아보면서 이게 정말 무거운 함수이구나 하는 게 느껴졌다. 출력을 위해 가볍게 사용할 수 있는 write 함수와 친해지는 계기를 만들어준게 아닌가 하는 생각도 들었다. 필요에 따라 변환 과정없이 정해진 바이트만 딱 출력할수 있는 가벼운 함수 사용이 더 맞을 때도 있을테니..!

 

Comments