๐Ÿš€ Libft: C ์–ธ์–ด์™€์˜ ์ฒซ ๋งŒ๋‚จ, ๋‚˜๋งŒ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

๊ฐœ๋ฐœ์— ๋‹ต์€ ์—†๋‹ค. ์™œ๋ƒ๋ฉด ๊ฐœ๋ฐœ์ด๋ž€ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋„๊ตฌ๋“ค์€ ๋‹ค์–‘ํ•˜๊ณ , ๊ทธ ๋„๊ตฌ๋“ค์˜ ์–ด๋–ค ์—ฐ๊ฒฐ์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•˜๊ณ , ์ตœ์ ํ™”๋˜๋ฉฐ, ๊ทธ๊ฑธ ํ†ตํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ผ๋„ ๋†€๋ผ์šด ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๋Š”๊ฐ€. ํŠนํžˆ๋‚˜ ๋‹จ ํ•œ ์‚ฌ๋žŒ์˜ ์ด์•ผ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ ํ˜‘์—…์ด ๋˜๋ฉด ๊ทธ ๋•Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์€ ๋‹จ์ˆœํžˆ โ€˜๋งŒ๋“ ๋‹คโ€™์˜ ์˜์—ญ์—์„œ โ€˜์˜ˆ์ˆ โ€™๊นŒ์ง€๋„ ๋„˜๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฝค๋‚˜ ๊ทธ๋Ÿด ์‹ธํ•œ ์ž‘ํ’ˆ์ด ๋œ๋‹ค.

42 ํ”„๋ž‘์Šค๋ฅผ ๊ฑฐ์ณ, 42 ์„œ์šธ์€ ๊ทธ๋Ÿฐ ์ฒ ํ•™์„ ์ธ์ •ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋‹ต์€ ์—†๊ณ , ๊ทธ์ € ๋ชจ๋‘์—๊ฒŒ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์€ ๋‹จ ํ•˜๋‚˜์˜ ๋ช…์ œ์˜€๋‹ค. ๋ฌธ์ œ๋Š” ์ค„๊ฒŒ, ๋‹ต์€ ๋„ˆ๊ฐ€ ์ฐพ์•„๋ด. ๊ทธ๋ฆฌ๊ณ  ๋™๋ฃŒ๋“ค๊ณผ ๊ทธ ๊ณผ์ •์„ ์น˜๋ฐ€ํ•˜๊ฒŒ, ์€๋ฐ€ํ•˜๊ฒŒ, ๊ทธ๋ฆฌ๊ณ  ์น˜์—ดํ•˜๊ฒŒ ๊ณ ๋ฏผํ•ด๋ด.

๋‹ค์‹œ ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ์ง€๊ธˆ ์ด์ˆœ๊ฐ„์—๋„ 42์„œ์šธ์˜ ๊ทธ ๊ฐ€์น˜๋Š”, ๊ทธ ๊ณผ์ •์€ ๊ฐœ๋ฐœ์ด ์™œ ๋งค๋ ฅ์ ์ด๊ณ , ์ด์ œ๋Š” ์™œ โ€˜๋‚˜์—๊ฒŒ ๋งž๋Š” ์ผ์ด๋‹คโ€™ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋А๋ผ๊ฒŒ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ft(forty two)๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” ์œ ๋‚œํžˆ ์ต์ˆ™ํ•˜์ง€๋งŒ, ๋™์‹œ์— โ€˜๋ญ”์ง€ ๋ชจ๋ฅผ ๋А๋‚Œโ€™์„ ์ฃผ๋Š” ํ‚ค์›Œ๋“œ์ด๋ฉฐ, ๊ทธ๋Ÿฐ ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋Š” libft๋ผ๋Š” ๊ณผ์ œ๋Š” 42 ์„œ์šธ์—์„œ์˜ ๋‚ด ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์ด์ž, C์–ธ์–ด์˜ ๊นŠ์€ ๋ฌผ์— ์ฒ˜์Œ์œผ๋กœ ๋ฐœ์„ ๋‹ด๊ฐ”๋˜ ์ˆœ๊ฐ„์œผ๋กœ ๊ธฐ์–ตํ•œ๋‹ค.

์˜คํ”ˆ ์†Œ์Šค๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” ๋งŒ๋“œ๋Š” ํ–‰์œ„์˜ ํ‰๋“ฑํ•จ์„ ์ถ”๊ตฌํ–ˆ๊ณ , ๊ทธ ์™€์ค‘์— ์ƒ๊ฒจ๋‚œ ๋ฆฌ๋ˆ…์Šค๋ผ๋Š” ์‹œ์Šคํ…œ๊ณผ ๊ทธ ์ฒ ํ•™์€ ์ปค์ ธ๊ฐ€๋ฉด์„œ ํ˜„๋Œ€ ์ปดํ“จํŒ…์˜ ์ •์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ๋ฆฌ๋ˆ…์Šค์˜ ํ‘œ์ค€, ๊ธฐ๋ฐ˜๋“ค์€ ์ฒ˜์Œ์— ๋ณด๊ธฐ์—” ์ƒ์†Œํ–ˆ๋‹ค. ์™œ ๊ตณ์ด ์ด๋Ÿฐ๊ฑธ? ์ด๋ผ๊ณ  ๊ทธ๋•Œ ๋‹น์‹œ์—๋Š” ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ฒฐ๊ตญ ์ง€๊ธˆ, ์–‘์ž ์ปดํ“จํŒ…์—, AI ๋“ฑ ์˜จ๊ฐ– ํ‚ค์›Œ๋“œ์˜ ์‹œ๋ฐœ์ ์ด ๋‹จ์–ด ํ•˜๋‚˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ์ž‘์—…์—์„œ ๋น„๋กฏ๋˜์—ˆ์Œ์„ ๊นจ๋‹ฌ์•˜๋‹ค๋Š” ์ ์—์„œ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ปดํ“จํ„ฐ์˜ ์ดํ•ด๋Š” ์–ด๋””์„œ ์˜ค๋Š”๊ฐ€? ํ•œ๋‹ค๋ฉด ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋ผ๊ณ  ์ž์‹ ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์ง์ ‘ ๋‚ด ์†์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋˜ ์ด ๊ณผ์ œ๋Š”, ๋งˆ์น˜ C์–ธ์–ด์˜ ์‹ฌ์žฅ๋ถ€๋ฅผ ํ•ด๋ถ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค. ์ˆ˜๋งŽ์€ ๋ฐค์„ man ํŽ˜์ด์ง€์™€ ํ•จ๊ป˜ ์ง€์ƒˆ์šฐ๋ฉฐ, ํฌ์ธํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€ ์”จ๋ฆ„, printf ๋ฅผ ๋กœ์ง์˜ ์œ„์น˜ ์œ„์น˜๋งˆ๋‹ค ์ฐ์–ด๋ณด๋˜ ๊ทธ ๊ณผ์ •โ€ฆ ์ง€๊ธˆ ์ƒ๊ฐํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ๊ณ ํ†ต์Šค๋Ÿฌ์› ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜๋ฅผ ๋ฒ ๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ ์ž‘๋™ ์›๋ฆฌ, ์ปดํ“จํ„ฐ์˜ ์†Œํ†ต ๋ฐฉ์‹์„ ๊ทผ๋ณธ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ๋‚˜๋งŒ์˜ ์ฝ”๋“œ๋กœ ์žฌ์ฐฝ์กฐํ•˜๋Š” ๊ณผ์ •์ด์—ˆ๋‹ค.

๐Ÿ“š ์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ (Key Learnings)

libft ํ”„๋กœ์ ํŠธ๋Š” ํฌ๊ฒŒ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Part 1,

์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ์œ ์šฉํ•œ ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“œ๋Š” Part 2,

๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)๋ฅผ ๋‹ค๋ฃจ๋Š” Bonus ํŒŒํŠธ

1. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ ์žฌ๊ตฌํ˜„ (Re-implementing Standard Library Functions)

์—ฌ๊ธฐ์„œ๋Š” C ์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์˜ ํŠน์ง•, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์–ธ์–ด๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์‚ฌ๋žŒ์˜ ๋ช…๋ น์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ๋ ์ง€, OS ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•˜๋Š”์ง€๋ฅผ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

  1. ๋ฉ”๋ชจ๋ฆฌ ๋‹ค๋ฃจ๊ธฐ (<string.h> ๋“ฑ): memset, memcpy, memmove ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค๋ฉด์„œ ํฌ์ธํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๊นŠ์–ด์กŒ๋‹ค. ํŠนํžˆ memcpy์™€ memmove์˜ ์ฐจ์ด์ , C ์–ธ์–ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ, ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„๋žฉ(overlap) ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€๋ฅผ ๋ฐฐ์› ๋‹ค. โ€œ์•„๋‹ˆ, ๊ทธ๋ƒฅ ๋ณต์‚ฌํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋ƒ?โ€ ์‹ถ์€๋ฐ, ์ฃผ์†Œ ๊ฐ’์ด ๊ฒน์น  ๋•Œ์˜ ๊ทธ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ , C ์–ธ์–ด๋ผ๋Š” ๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€, ์–ธ์–ด์˜ ์ •ํ•ด์ง„ ํŠน์„ฑ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค ํ•œ๊ณ„๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ์ฒ˜์Œ ์ดํ•ดํ–ˆ๋˜ ์ˆœ๊ฐ„์ด์—ˆ๋‹ค.
  2. ๋ฌธ์ž์—ด ๊ฐ–๊ณ  ๋†€๊ธฐ (<string.h> ๋“ฑ): strlen, strlcpy, strlcat, strchr, strncmp ๋“ฑ๋“ฑโ€ฆ C์–ธ์–ด์—์„œ ๋ฌธ์ž์—ด์ด ์‚ฌ์‹ค์ƒ char ๋ฐฐ์—ด์ด๋ฉฐ, ์ž๋ฃŒ ํƒ€์ž…๋“ค์€ ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ์—ด์˜ ์—ฐ์†์ž„์„ ๋ฐฐ์› ๋‹ค. ํŠนํžˆ ๋ฌธ์ž์—ด์˜ ํŽธ์ง‘ ๊ณผ์ •์—์„œ, ๋ฐ์ดํ„ฐ์˜ โ€˜๋‹จ์œ„โ€™๋ฅผ ์œ„ํ•œ NULL ๋ฌธ์ž์˜ ์ค‘์š”์„ฑ๊ณผ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(buffer overflow)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ strlcpy์˜ ์†Œ์ค‘ํ•จ ๋“ฑ์„ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค.
  3. ๋ฌธ์ž ํŒ๋ณ„๊ณผ ๋ณ€ํ™˜ (<ctype.h> ๋“ฑ): isalpha, isdigit, isalnum ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์€ ๋น„๊ต์  ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ, ์ปดํ“จํ„ฐ๊ฐ€ ์‚ฌ๋žŒ์˜ ์–ธ์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์•„์Šคํ‚ค ๋ฌธ์ž ๋“ฑ์— ๋Œ€ํ•ด ์™„๋ฒฝํ•œ ์ดํ•ด๊ฐ€ ํ•„์š” ํ–ˆ๋‹ค.
  4. ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ (<stdlib.h> ๋“ฑ): ๊ฐ€์žฅ ๋‚œ์ด๋„ ์žˆ๋Š” ์˜์—ญ์ด์—ˆ๋Š”๋ฐ, atoi๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์˜จ๊ฐ– ์˜ˆ์™ธ ์ผ€์ด์Šค(๊ณต๋ฐฑ, ๋ถ€ํ˜ธ, ์ˆซ์ž ์•„๋‹Œ ๋ฌธ์ž ๋“ฑ)๊ฐ€ ์™œ ์ƒ๊ธฐ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํŠนํžˆ๋‚˜ ๋™๋ฃŒ ํ•™์Šต์„ ํ†ตํ•ด ์ด๋Ÿฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€๋ฅผ(โ€ฆ) ๋ผˆ์ €๋ฆฌ๊ฒŒ ๊นจ๋‹ฌ์•˜๋˜ ๊ธฐ์–ต์ด๋‚œ๋‹ค.

2. ๋‚˜๋งŒ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ๊ตฌํ˜„ (Implementing Additional Utility Functions)

Part 1์ด โ€˜๋ชจ๋ฐฉโ€™์˜ ๋‹จ๊ณ„์˜€๋‹ค๋ฉด, Part 2๋Š” โ€˜์ฐฝ์กฐโ€™์˜ ๋‹จ๊ณ„์˜€๋‹ค. ์ฃผ์–ด์ง„ ๋ช…์„ธ์— ๋”ฐ๋ผ Part 1์—์„œ ๋งŒ๋“  ์•„์ฃผ ๊ธฐ์ดˆ ๋‹จ์œ„์˜, ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋“ฑ์˜ ๊ธฐ์ˆ ์„ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด๊ฒƒ๋“ค์„ ๋ž˜ํ•‘(wrapping) ํ•ด๋ณด๋Š” ๊ฒƒ์„ ์š”๊ตฌํ–ˆ๋‹ค.

  • ft_split: ์ด ๋…€์„์ด ์•„๋งˆ ์ตœ์ข… ๋ณด์Šค ์˜€์„ ๊ฒƒ์ด๋‹ค. ๐Ÿ˜‚ ๋ฌธ์ž์—ด์„ ํŠน์ • ๊ตฌ๋ถ„์ž(delimiter) ๊ธฐ์ค€์œผ๋กœ ์ชผ๊ฐœ์„œ 2์ฐจ์› ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น๊ณผ ๋‹น์‹œ ๋ฐฐ์—ด์˜ ๊ด€์ , ํŠนํžˆ ์ฐจ์›์„ ๊ฐ€์ง€๊ณ  ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋จธ๋ฆฟ์†์— ๊ตฌ์กฐํ™”๊ฐ€ ์ „ํ˜€ ๋˜์ง€ ์•Š์•„(โ€ฆ) ์ •๋ง ์–ด๋ ค์› ๋‹ค. ํ• ๋‹นํ•ด์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ™•ํžˆ ๊ณ„์‚ฐํ•˜๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„ ๋•Œ ์ด๋ฏธ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋‘ ํ•ด์ œ(free)ํ•ด์ฃผ๋Š” ๋ˆ„์ˆ˜(leak) ๋ฐฉ์ง€ ์ฒ˜๋ฆฌ๊นŒ์ง€โ€ฆ ์ปดํ“จํ„ฐ๊ฐ€ ๊นจ๋—ํ•˜๊ฒŒ ์ผ์„ ์‹œ์ž‘ํ•ด, ๋งˆ๋ฌด๋ฆฌ ์ง“๊ธฐ๊นŒ์ง€ ์ •๋ง ๋งŽ์€ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋˜ ํ•จ์ˆ˜์˜€๋‹ค.
  • ft_itoa: ์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ์ด ํ•จ์ˆ˜๋Š” INT_MIN ๊ฐ™์€ ๊ทน๋‹จ์ ์ธ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด์—ˆ๋‹ค. ์‚ฌ์‹ค split ์„ ์–ด๋ ค์›Œํ•˜์—ฌ ๋จผ์ € ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ ๊ฐ ์ž๋ฃŒํƒ€์ž…์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž์˜ ์–‘, ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ผ€์ด์Šค๋“ค ์กฐ์‚ฌ๋ฅผ ํ•˜๋ฉด์„œ ์ •๋ง ๋งŽ์ด ํ‹€๋ ธ์—ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.
  • ft_substr, ft_strjoin, ft_strtrim: ๋ฌธ์ž์—ด์„ ์ž๋ฅด๊ณ , ํ•ฉ์น˜๊ณ , ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ, ์ „์—๋Š” ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๊ฐ€ ํ•˜๋‚˜์˜ ์ „์ฒด ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๊ตฌ๋ถ„ํ•˜๊ณ , ๋‹จ๊ณ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฐ์Šต์„ ์ด ๋ฉ”์„œ๋“œ๋“ค ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜์Œ ํ•ด๋ดค๋˜ ๊ธฐ์–ต์ด๋‚œ๋‹ค.

3. ๋ณด๋„ˆ์Šค: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋‹ค๋ฃจ๊ธฐ (Handling Linked Lists)

๋ฐฐ์—ด๊นŒ์ง€๋Š” ์ ‘๊ทผํ–ˆ์œผ๋‚˜, ๋‹ค์Œ์„ ์‚ด์ง ๋ง›๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ํ•ด๋‹น ๋ณด๋„ˆ์Šค ๋‚ด์šฉ์ด์—ˆ๋‹ค.

typedef struct s_list
{
	void			*content;
	struct s_list	*next;
}					t_list;

์ถ”์ƒํ™”๋œ ๊ฐœ๋…, โ€˜๋…ธ๋“œโ€™๋Š” ๊ฝค๋‚˜ ์‹ ์„ ํ–ˆ๋‹ค. ๋จธ๋ฆฟ์†์—์„œ, ํ˜น์€ ์ˆ˜ํ•™์ด๋‚˜ ๊ณผํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์˜ ์บก์А์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์บก์А์„ ํ™œ์šฉํ•œ ์ถ”์ƒ์ ์ธ ํ‘œํ˜„์„ ์˜คํžˆ๋ ค ๊ตฌ์กฐ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •. ๊ทธ๋ ‡๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, ๋‹จ์ˆœํ•œ ์ˆ˜์‹์œผ๋กœ ํ’€์–ด ๋‚ด๋ ค๋ฉด ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ข€๋” ๊ฐ€์‹œ์ ์œผ๋กœ ์ธ์ง€ํ•˜๊ธฐ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฐœ๋…์€, ์ˆ˜ํฌ์ž์˜€๋˜ ๋‚˜์—๊ฒŒ๋Š” ๋Œ€๋‹จํžˆ ์‹ ์„ ํ•œ ์ถฉ๊ฒฉ์ด์—ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ์ฒด๋กœ ๋…ธ๋“œ(node)๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋…ธ๋“œ๋“ค์„ ์—ฎ์–ด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ (lstnew, lstadd_front, lstadd_back), ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๊ณ (lstiter), ์‚ญ์ œํ•˜๋Š”(lstdelone, lstclear) ๋“ฑโ€ฆ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ํŠนํžˆ t_list **lst์ฒ˜๋Ÿผ ์ด์ค‘ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ์ฃผ์†Œ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ๋˜ ft_lstadd_front ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋Œ์–ด์˜ฌ๋ ค์ค€ ๊ธฐ์–ต์ด์—ˆ๋‹ค.

๐Ÿ› ๏ธ Makefile์˜ ๋งˆ๋ฒ• (The Magic of Makefile)

ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ฝ”๋”ฉ๋งŒ ํ•˜๋‹ค๋ณด๋ฉด ์žŠ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๊ณ , ํŠนํžˆ ์š”์ฆ˜์€ ์ธํ„ฐํ”„๋ฆฌํŒ… ์–ธ์–ด๋ฅผ ๋งŽ์ด ์“ฐ๊ฒŒ ๋˜๋‹ค๋ณด๋‹ˆ ์žŠ๊ณ  ์‚ด์•˜์ง€๋งŒ. ๋ณธ ๊ณผ์ œ์—์„œ๋Š” C ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Makefile ์ž‘์„ฑ๋ฒ•์„ ์ œ๋Œ€๋กœ ๋ฐฐ์šด ์ฒซ ๊ฒฝํ—˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๋‹จ์ˆœํžˆ gcc ๋ช…๋ น์–ด๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , %.o: %.c ๊ฐ™์€ ๊ทœ์น™์„ ๋งŒ๋“ค๊ณ , all, clean, fclean, re, bonus ๊ฐ™์€ ๋ชฉํ‘œ(target)๋ฅผ ์„ค์ •ํ•˜๋ฉด์„œ ๋นŒ๋“œ ์ž๋™ํ™”๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ์  ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ libft.a๋ผ๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(static library)๋Š” ๊ทธ ๋’ค๋กœ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์–ด ์ฃผ์—ˆ๋‹ค.

๐Ÿค” ์„ฑ์ฐฐ ๋ฐ ๋ฐฐ์šด ์  (Reflection & Lessons Learned)

libft ๊ณผ์ œ๋ฅผ ๋™๋ฃŒ๋“ค๊ณผ ์ด์•ผ๊ธฐ ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋‚˜, ์ถ”์ƒ์  ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜, Makefile์— ์•„์Šคํ‚ค ์ดํŽ™ํŠธ๋ฅผ ๋„ฃ๋Š” ๋“ฑ์˜ ์ž‘์—…์€ ์ •๋ง ์žฌ๋ฐŒ๋Š” ์ž‘์—…์ด์ž, ์‹œ๊ฐ„ ๊ฐ€๋Š” ์ค„ ๋ชจ๋ฅด๋Š” ์ž‘์—…์ด์—ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํฌ์ธํ„ฐ: C๊ฐ€ ์™œ ๊ฐ•๋ ฅํ•˜๊ณ , ๋™์‹œ์— ์™œ ์œ„ํ—˜ํ•œ ์–ธ์–ด์ธ์ง€ ๋ชธ์†Œ ์ฒดํ—˜ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•˜๋ฉด์„œ ์™œ ๊ทธ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋˜๊ณ , ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์„ ์“ฐ๊ฒŒ ๋˜๋Š” ์ด์œ ๊ฐ€ ๋ญ”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ: man ํŽ˜์ด์ง€๋ฅผ ์นœ๊ตฌ ์‚ผ์•„, ์ˆ˜๋งŽ์€ ์˜ค๋ฅ˜์™€ ์„ธ๊ทธํด(segmentation fault)์„ ๋””๋ฒ„๊น…ํ•˜๋ฉด์„œ ๋ˆ์งˆ๊ธฐ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํŒŒ๊ณ ๋“ค์—ˆ๋‹ค. ํŠนํžˆ man ํŽ˜์ด์ง€๋Š” ์˜์–ด๋กœ ๋˜์–ด ์žˆ๊ธฐ๋„ ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์˜ ์–ธ์–ด๋กœ ์ ํ˜€ ์žˆ๋‹ค๋ณด๋‹ˆ โ€˜๊ฐ„๊ฒฐโ€™ ํ•˜์ง€๋งŒ ๋™์‹œ์— ์–ด๋А ์˜์—ญ์—์„œ ์–ผ๋งˆ๋‚˜ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์›€์ง์ด๋Š” ๊ฑด๊ฐ€? ์™€ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์„ ๋‹ค ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์—์„œ ์ฒซ ๊ณผ์ œ๋Š” ๋Œ€๋žต 1๋‹ฌ์˜ ์‹œ๊ฐ„์ด ๋“ค์—ˆ๋‹ค.
  • ์ฝ”๋“œ ๊ทœ์•ฝ(Norm): 42์˜ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ทœ์•ฝ(Norminette)์ด๋ž€ ๊ฒƒ๋„ ์ผ์ข…์˜ ๋ถˆ๋งŒ ์ด์—ˆ๋‹ค. ๋ช‡์ž ๋‚ด์— ์ž‘์„ฑ์ด ๋˜์–ด์•ผํ•˜๊ณ , ์–ธ์–ด์˜ ์ปจ๋ฒค์…˜์„ ์ง€์ผœ์•ผ ํ•˜๋Š” ๋“ฑ์˜ ์ผ๋“ค์€ ๋„๋Œ€์ฒด ์™œ ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ํ•„์š”ํ•œ๊ฐ€ ๋ผ๊ณ  ์˜๋ฌธ์„ ํ’ˆ์—ˆ์—ˆ๋Š”๋ฐ, ์ง€๊ธˆ ์ƒ๊ฐํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ โ€˜ํ”„๋กœ์„ธ์Šคโ€™์˜€๋Š”์ง€๋ฅผ ์ƒˆ์‚ผ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค.

๋Œ์ด์ผœ๋ณด๋ฉด libft๋Š” ๋‹จ์ˆœํ•œ ๊ณผ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, C์–ธ์–ด๋ผ๋Š” ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ•˜๊ธฐ ์œ„ํ•œ ๋‚˜๋งŒ์˜ ์ง€๋„์™€ ๋‚˜์นจ๋ฐ˜์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด์—ˆ์–ด. ๋น„๋ก ํž˜๋“ค์—ˆ์ง€๋งŒ, ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์–ป์€ ์ง€์‹๊ณผ ๊ฒฝํ—˜์€ ์•ž์œผ๋กœ ์–ด๋–ค ์–ด๋ ค์›€์ด ๋‹ฅ์ณ๋„ ํ—ค์ณ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹จ๋‹จํ•œ ๊ธฐ์ดˆ๊ฐ€ ๋˜์–ด์ฃผ์—ˆ๋‹ค. ํŠนํžˆ๋‚˜ ์ •๋ง ๋น ๋ฅธ ์นœ๊ตฌ๋“ค์€ ์ˆœ์‹๊ฐ„์— ์™„์„ฑ์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ๊ณผ์ œ๋ฅผ ํ•˜๊ณค ํ–ˆ๋‹ค. ๊ทธ๊ฑธ ๋ฐ”๋ผ๋ณด๋Š” ๋‚ด ์ž…์žฅ์—์„  ์ฐธ ๋‹น์—ฐํžˆ ๋น„๊ต์ ์ธ ์ƒ๊ฐ, ๋‚ด๊ฐ€ ์ •๋ง ์ด ๋ถ„์•ผ์— ์–ด์šธ๋ฆฌ๋Š” ์‚ฌ๋žŒ์ธ๊ฐ€? ํ•˜๋Š” ๋ถˆํ‰, ๋ถˆ๋งŒ๋„ ์ƒ๊ฒผ์ง€๋งŒ ์˜คํžˆ๋ ค ๋๊นŒ์ง€ ๋ถ™์žก๊ณ  ํ•œ๋‹ฌ์— ๊ฑธ์ณ ์™„์„ฑํ–ˆ๋˜ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด, โ€˜ํ•˜๋ฉด ๋œ๋‹คโ€™๋ผ๋Š” ๋ง‰์—ฐํ•˜์ง€๋งŒ ํ™•๊ณ ํ•œ ์‹ ๋ขฐ๊ฐ์ด ์ƒ๊ฒผ๋˜ ์ฒซ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‚˜ ์‹ถ๋‹ค. ๐Ÿ’ช