๐จ๏ธ ft_printf : ๋ฐ์ดํฐ์ โํํโ์ ์ฑ ์์ง๋ค๋ ๊ฒ์ ์๋ฏธ
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ์ ์
๋ฌธํ๋ฉฐ ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ฐ๋ ์ฃผ๋ฌธ์ ์๋ง printf("Hello, World!");์ผ ๊ฒ์ด๋ค.
๋๋ฌด๋ ๋น์ฐํ๊ฒ, ๋ง์น ๊ณต๊ธฐ์ฒ๋ผ ์ฌ์ฉํด์๋ ์ด ํจ์๋ ์ปดํจํฐ ๋ด๋ถ์ ์ถ์์ ์ธ ๋ฐ์ดํฐ(์ซ์, ์ฃผ์)๋ฅผ ์ธ๊ฐ์ด ์ธ์งํ ์ ์๋ โ๋ฌธ์โ์ ํํ๋ก ๋ฒ์ญํด์ฃผ๋ ๋ง๋ฒ๊ณผ๋ ๊ฐ๋ค.
์ฒ์, ๋๋ฒ๊ทธ ํด์ ๋ฐฐ์ฐ๊ธฐ ์ ์ ๊ฐ์ฅ ์ฝ๊ฒ, ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๋๋ฒ๊น ํด๋ ๋ณดํต print ๊ณ์ด์ด๋ฆฌ๋ผ.
born2beroot๊ฐ ์์คํ
์ด๋ผ๋ ๋
์ ์ดํดํ๋ ๊ณผ์ ์ด์๋ค๋ฉด, ft_printf๋ ๊ทธ ๋
์์์ ์ค๊ฐ๋ ๋ฐ์ดํฐ์ โํํโ์ ์ง์ ์ค๊ณํ๊ณ ์ฑ
์์ง๋, ์ธ์ด์ ๋ฒ์ญ๊ฐ๊ฐ ๋์ด๋ณด๋ ๊ณผ์ ์๋ค.
์ด ๊ณผ์ ์ ํต์ฌ์ โ์ ํด์ง์ง ์์โ์ ๋ค๋ฃจ๋ ๋ฐ ์๋ค. ์ปดํ์ผ ์์ ์๋ ๋ช ๊ฐ์ ์ธ์๊ฐ, ์ด๋ค ํ์ ์ผ๋ก ๋ค์ด์ฌ์ง ์ ํ ์ ์ ์๋ ์ํฉ.
C์ธ์ด์ ์๊ฒฉํ ํ์ ์์คํ ์ ์ด์ง ์ด๋ฆฐ ๋ท๋ฌธ์ ํตํด, ํจ์์ ํธ์ถ ๊ท์ฝ(Calling Convention)๊ณผ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐฉ์์ ์ด๋ ดํ์ด๋๋ง ์ฟ๋ณด๋ฉฐ, ์ ์ฐํจ์ ๋๊ฐ๊ฐ ์ผ๋ง๋ ํฐ ์ฑ ์๊ฐ์ ์๊ตฌํ๋์ง(โฆ) ์๊ฒ ๋๋ ๊ณผ์ ์ด์๋ค.
์ฌ์ค ์ด ๊ณผ์ ๋ฅผ ๋จผ์ ํด์ผ ํ๋ ๊ฒ์ด์์์๋, born2beroot ๋ฅผ ๋จผ์ ํ๊ฒ ๋ ์ด์ ๋, ์ค์ง, ์ด ํ๋ก์ ํธ๊ฐ ๊ฐ์ง๋ ๋ฐฉ๋ํจ, ๊ณ ๋ คํด์ผํ๋ ์ฐ์ ์์ ๋ฑ ๊ธฐ์กด์ ๊ณผ์ ๋ค๊ณผ ๊ฒฉ์ด ๋ค๋ฅธ ์์ค์ ๊ฒ์ด์์์ด ๊ฐ์ฅ ํฐ ๋ฌธ์ ์๋ค.
๐ฉ ๊ฐ๋ณ ์ธ์์ ์ดํด: ์ฝ์๊ณผ ์ ๋ขฐ์ ๋ฉ์ปค๋์ฆ
ft_printf์ ๊ตฌํ์ <stdarg.h> ํค๋์ ์ ์๋ ๋งคํฌ๋ก๋ค์ ์ดํดํ๋ ๊ฒ์์ ์์๋๋ค. ์ด๋ ๋จ์ํ ๊ธฐ๋ฅ ์ต๋์ด ์๋๋ผ, ํจ์๋ฅผ ํธ์ถํ๋ ์ชฝ๊ณผ ํธ์ถ๋๋ ์ชฝ ์ฌ์ด์ ๋ณด์ด์ง ์๋ โ์ฝ์โ์ ์ดํดํ๋ ๊ณผ์ ์ด์๋ค.
va_list,va_start,va_arg,va_end: ์ด ๋ค ๊ฐ์ง ๋๊ตฌ๋ ์ปดํ์ผ๋ฌ๊ฐ ์คํ์ ์ฐจ๋ก๋๋ก ์์๋ ์ธ์๋ค์, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ๊ณตํ โ์์ ๋ฌธ์์ดโ์ด๋ผ๋ ์ง๋๋ฅผ ๋ณด๊ณ ์ฌ๋ฐ๋ฅธ ํฌ๊ธฐ(ํ์ )๋งํผ์ฉ ์์๋๋ก ์ฝ์ด ๋๊ฐ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
printf ํจ์๋ ์์ ์ง์ ์ %d๋ฅผ ๋ณด๊ณ โ๋ค์์ ์ฌ ์ธ์๋ int ํฌ๊ธฐ๋งํผ ์ฝ์ด์ผ๊ฒ ๊ตฐโ์ด๋ผ๊ณ ์ ๋ขฐํ๊ณ va_arg๋ฅผ ์คํํ๋ค. ๋ง์ฝ ์ด ์ ๋ขฐ๊ฐ ๊นจ์ง๋ฉด(์: %d์ char*๋ฅผ ์ ๋ฌ), ํ๋ก๊ทธ๋จ์ ๊ณง๋ฐ๋ก ์ ์๋์ง ์์ ๋์(Undefined Behavior)์ ๋๋ฝ์ผ๋ก ๋จ์ด์ง๋ค.
๐งฉ ์์ ์ง์ ์ ํ์ฑ: ์์ ์ธ์ด์ ํด์๊ธฐ(Interpreter) ๋ง๋ค๊ธฐ
์ฒ์ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋์ ๊ตฌ์กฐ๋ ft_printf์ ๋ณธ์ง์ ์์ ๋ฌธ์์ด(format string)์ด๋ผ๋ ์์ ์ธ์ด๋ฅผ ํด์ํ๊ณ , ๊ทธ์ ๋ง๋ ๋์์ ์ํํ๋ ์์ ํด์๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์๋ค.
- ๋ฌธ์์ด ์ํ ๋ฐ ๋ถ๊ธฐ: ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋ฐ์ ์์ ๋ฌธ์์ด์ ๋ฃจํ๋ฅผ ํตํด ํ ๊ธ์์ฉ ์ฝ๋ค๊ฐ, ์ ์ด ๋ฌธ์์ธ
%๋ฅผ ๋ง๋๋ฉด ํด์๊ธฐ ๋ชจ๋๋ก ์ ํ๋๋ค. ์ดํ ๋ฐ๋ผ์ค๋ ๋ฌธ์์ ๋ฐ๋ผ ์ด๋ค ์ข ๋ฅ์ โ๋ฒ์ญโ์ ์ํํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค. - ๋ฐ์ดํฐ ํ์
๋ณ ๋ฒ์ญ:
c,s,%: ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฒ์ญ. ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ํํํ๊ฑฐ๋(c,s), ์ ์ด ๋ฌธ์๋ฅผ ์ผ๋ฐ ๋ฌธ์๋ก ํ์ถ(%%)์ํค๋ ์ญํ ์ ๋ด๋นํ๋ค. ํนํs์ฒ๋ฆฌ ์NULLํฌ์ธํฐ๊ฐ ๋ค์ด์ค๋ ์์ธ ์ํฉ์ ์ด๋ป๊ฒ ๋ค๋ฃฐ์ง๋ โ์์ ์ฑโ์ ๋ํ ์ฒซ ๋ฒ์งธ ์ํ๋์๋ค.d,i,u: 2์ง์๋ก ์ ์ฅ๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ 10์ง์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํต์ฌ์ ์ธ ๋ฒ์ญ ๊ณผ์ .libft์์ ๋ง๋ft_itoa๋ฅผ ํ์ฉํ๊ณ , ๋ถํธ ์๋ ์ ์(unsigned int)๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ์ปดํจํฐ์ ์ซ์ ํํ ๋ฒ์๋ฅผ ๋ค์ ํ๋ฒ ์๊ธฐํ๊ฒ ๋์๋ค.x,X: 10์ง๋ฒ์ ์ต์ํ ์ธ๊ฐ์ ์๊ฐ์ 16์ง๋ฒ์ผ๋ก ๋ฐ๊พธ๋ ๋ฒ์ญ. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋นํธ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ๋ ์ 16์ง๋ฒ์ด ์ ์ฉํ์ง์ ๋ํ ์ค์ฉ์ ์ธ ์ดํด๋ก ์ด์ด์ก๋ค.p: ๊ฐ์ฅ ์ถ์์ ์ธ ๊ฐ๋ ์ธ โ๋ฉ๋ชจ๋ฆฌ ์ฃผ์โ๋ฅผ ๋์ ๋ณด์ด๋ 16์ง์ ๋ฌธ์์ด๋ก ์๊ฐํํ๋ ๋ฒ์ญ. ์ด๋ ํฌ์ธํฐ๋ผ๋ ๊ฐ๋ ์ ๋จ์ํ ๋ณ์๊ฐ ์๋, ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์์ ํ ์ ์ ๊ฐ๋ฆฌํค๋ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ผ๋ก ์ธ์งํ๊ฒ ๋ง๋ค์๋ค.
๐๏ธ ์ฝ๋ ๊ตฌ์กฐํ์ ์ฌ์ : ๊ธฐ๋ฅ์์ ์ค๊ณ๋ก
์ด๊ธฐ ๋ฒ์ ์ ๊ฑฐ๋ํ if-else ํน์ switch ๋ฌธ ์์ ๋ชจ๋ ๋ณํ ๋ก์ง์ ๋ด์ผ๋ ค๋ ์๋๋ฅผ ํ๋ค. ํ์ง๋ง ์ด๋ ๊ณง ์ ์ง๋ณด์์ ์ฌ์์ผ๋ก ์ด์ด์ง๋ค๋ ๊ฒ์ ๋น ๋ฅด๊ฒ ๊นจ๋ฌ์๋ค.
โ์ฒ๋ฆฌโ์ ๋จ์๋ฅผ ์ฒ์์๋ ์ด์ฐจํผ ๋น์ทํ ๊ธฐ๋ฅ๋ค์ ๋์ด์ด๊ณ , ๊ทธ๋ฌ๋ ์ ์ฒด๋ฅผ ๋ชจ๋ ๋ก์ง์์ ์ฒ๋ฆฌํ๊ฒ ํ๋ ๊ตฌ์กฐ๋, ์ด์ฉ๋ฉด ์ฌ๋์ ์ธ์์์๋ ๋น์ฐํ ๊ฒ์ด๋ค. ๋ ธ์ ์ ๋ก์ง์ ์ค๊ณํ๋ ๋น์, ์ผ๋ง๋ ๊ด์ฐฎ๋ค๊ณ ๋๊ผ๋์ง- ์๊ฐ๋ณด๋ค ์์ ๊ฐ์๊ฒ ๊ทธ ์ค๊ณ๋ฅผ ๊ด์ฐฎ๋ค๊ณ ๋๋ฃ๋ค์๊ฒ๋ ์๋ํ๋ ๊ธฐ์ต์ด ๋๋ค.
ํ์ง๋ง ์์์ ๋งํ ๋ฏ ์ฌ์์ด ๋ ์ ์๋ค๋ ์ฌ์ค์ ๋ช ํํ๋ค. ๋ฉ์๋๋ก ๊ตฌ๋ถ๋์ง ๋ชปํ๊ณ , if-else, switch ์ ์ฌ์ฉ์ ๊ฒฐ๊ตญ ํ ๋จ์ด, ํ ๊ธ์๋ง๋ค ์กฐ๊ฑด๋ฌธ์ ๋๋ ๊ฒ์ด์๊ณ , ์ ๋ง์ ์์ธ ์ผ์ด์ค๋ค์ ๋ง๋๋ ์๊ฐ ์ด๋์ ์ด๋ค ์๋ฌ๊ฐ ๋๋์ง๋ฅผ ์๊ธฐ๊ฐ ๋งค์ฐ ๊น๋ค๋ก์ ๋ค.
์ฌ์ง์ด ๊ฐ์ ๋ก์ง์ด๋ผ๊ณ ์๊ฐํ๋ ์กฐ๊ฑด๋ค๋, ๊ฒฐ๊ตญ ๊ฒน์น๊ณ ์ฝํ๋ค๋ณด๋ฉด ๋
ผ๋ฆฌ์ ์ผ๋ก ๋นํ์ด ์๊ธฐ๋ ๊ฒฝ์ฐ๋ ์์๊ณ , ์ด๋ฌํ ์ฌ์ค์ ๋ฉ์๋ ๋ก ๊ตฌ๋ถ์ ํ๊ณ , ๋ก์ง์ ๋ชจ๋ํ ํ๋ ๊ฒ์ด ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋
ผ๋ฆฌ์ ๋จ์๋ฅผ ์ผ๋ง๋ ์๊ฒ ํด์ผ ํ๋์ง ์์ฃผ ์ค์ํ ๋ถ๋ถ์ ๋ฐฐ์ธ ์ ์๋ ๊ธฐํ์๋ค๊ณ ์๊ฐํ๋ค.
๋ํ ์ ์ฅ ๋ฐ ์ถ๋ ฅ์ ํ ๋ ์์ ์ง์ ์๋ฅผ ๋ง๋ ๋๋ง๋ค write ์์คํ
์ฝ์ ์ง์ ํธ์ถํ๋ ๋ฐฉ์๊ณผ, ์ถ๋ ฅํ ๋ฌธ์์ด ์กฐ๊ฐ๋ค์ ์๋ฃ๊ตฌ์กฐ(์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฑ)์ ๋ด์๋์๋ค๊ฐ ๋ง์ง๋ง์ ํ ๋ฒ์ ์ถ๋ ฅํ๋ ๋ฐฉ์ ์ฌ์ด์์ ๊ณ ๋ฏผํ๋ค๊ฐ ์ฑ๋ฅ์ ์ฐจ์ด๋ฅผ ๋๊ปด ์ง์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก์ ๊ฐ์ ๋๋ ๊ณผ์ ๋ฑโฆ
๋จ์ํ โ๊ธฐ๋ฅ ๊ตฌํโ์ ๋์ด โํจ์จ์ ์ธ ์ค๊ณโ์ ๋ํ ์์ฃผ ํฐ ๊ณ ๋ฏผ๋ค์ ์ฒซ ๋ฌธํฑ์ด ์๋์๋ ์ถ๋ค. ์ด ํ๋ก์ ํธ๊น์ง ์์์ผ ๋น๋ก์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋์ด ์ ๋ณตํ๋ ์ํํธ์จ์ด ๊ณตํ์ ๊ธฐ๋ณธ ์์น์ ์ฒด๋ํ ์ ์์๋ค.
โจ ์ฑ์ฐฐ ๋ฐ ๋ฐฐ์ด ์
ft_printf๋ ๋งค์ผ ์ฌ์ฉํ๋ ๋๊ตฌ์ ๋ด๋ถ๋ฅผ ๋ถํดํ๊ณ ์ฌ์กฐ๋ฆฝํด๋ณด๋ ์์คํ ๊ฒฝํ์ด์๋ค.
- ์ถ์ํ์ ์ด๋ฉด:
printf๋ผ๋ ํธ๋ฆฌํ ์ถ์ํ ๊ณ์ธต ๋๋ถ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ โํํโ๋๋์ง์ ๋ํ ๊ณ ๋ฏผ ์์ด ๊ฐ๋ฐํ ์ ์์๋ค. ๊ทธ ์ด๋ฉด์๋ ๊ฐ๋ณ ์ธ์ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ํ์ ๋ณํ, ์์ธ ์ฒ๋ฆฌ ๋ฑ ์๋ง์ ๋ณต์กํ ๊ณผ์ ์ด ์จ์ด์์์ ์ ์ ์์๋ค. - ์ ๋ขฐ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ: C์ธ์ด์ ๊ฐ๋ณ ์ธ์ ๊ธฐ๋ฅ์ ํ์ ์ฒดํฌ๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์๋ ํ๋ก๊ทธ๋๋จธ์ ์ฑ ์์ผ๋ก ๋๋ฆฐ๋ค. ์ด๋ ์ ์ฐํจ์ ์ ๊ณตํ๋ ๋์ , ์ฌ์ํ ์ค์๊ฐ ํ๋ก๊ทธ๋จ ์ ์ฒด๋ฅผ ๋ฌด๋๋จ๋ฆด ์ ์๋ ์ํ์ฑ์ ๋ดํฌํ๊ณ ์์์, ์ฆ C์ธ์ด๊ฐ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ผ๋ง๋ ์ ๋ขฐํ๋(ํน์ ๋ฐฉ์ํ๋) ์ธ์ด์ธ์ง ๋ชธ์ ์ฒดํํ๊ณ , ๊ทธ๋ ๊ธฐ์ ์ด๋ป๊ฒ ๋์ํด๋๋ ๊ฒ, ์๋ฌ ํธ๋ค๋ง์ ์ด๋ค ์์ผ๋ก ํ๋ ๊ฒ์ผ๋ก ์์คํ ์ ์ฒด์ ์์ ์ฑ์ ์ ์งํ ์ ์๋์ง๋ฅผ ๋ฐฐ์ฐ๋ ๊ธฐํ๊ฐ ๋์๋ค.
- ๋ฌธ์ ๋ถํ ์ ์ค์์ฑ: ํ๋์ ๊ฑฐ๋ํ ๋ฌธ์ ๋ฅผ โํ์ฑโ, โ์ ์ ๋ณํโ, โ16์ง์ ๋ณํโ ๋ฑ ์๊ณ ๋ช ํํ ๋จ์์ ํจ์๋ก ๋๋๋ ๊ณผ์ ์, ์ดํ ๋ ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ๋ง์ฃผํ์ ๋ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ๋์ง์ ๋ํ ํ๋ฅญํ ํ๋ จ์ด ๋์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ft_printf๋ ๋จ์ํ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ํจ์๋ฅผ ๋ง๋๋ ๊ณผ์ ๊ฐ ์๋์๋ค. ์ปดํจํฐ ๋ด๋ถ์ ๋นํธ(bit) ๋ฉ์ด๋ฆฌ๋ฅผ ์ธ๊ฐ์ด ์ดํดํ ์ ์๋ ์๋ฏธ ์๋ ์ ๋ณด๋ก โ๋ฒ์ญโํ๊ณ โํํโํ๋ ์ฑ
์์ด ์ ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ์๊ฒ ์์์ ๊นจ๋ซ๊ฒ ํ, ๊ฐ๋ฐ์๋ก์์ ์ฑ
์๊ฐ๊ณผ ์์ผ๋ฅผ ํ ๋จ๊ณ ๋ํ์ค ํ๋ก์ ํธ์๋ค.
