๐ŸŽ“ ํ•™๊ต์—์„œ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” C์–ธ์–ด ๅฎŒ

gomjellieยท2020๋…„ 5์›” 26์ผ
43
post-thumbnail

์‹œ๋ฆฌ์ฆˆ์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ๋“ค

'C์–ธ์–ด๋กœ ์ด๋Ÿฐ๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€?' ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€ํ•™ ๊ต์œก๊ณผ์ •์—์„œ ๋ฐฐ์šฐ์ง€ ์•Š์€ ๋ถ€๋ถ„๋“ค์„ ํ•™๊ต์—์„œ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” C์–ธ์–ด ์‹œ๋ฆฌ์ฆˆ์—์„œ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•œ๋‹ค.

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

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

๋”ฐ๋ผ์„œ ์•ž์œผ๋กœ ๊ตฌ์„ฑ๋  ๋ชฉ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

๐Ÿ‘จ๐Ÿปโ€๐Ÿซ C์–ธ์–ด ๋ฆฌ๋งˆ์ธ๋“œ

๐Ÿงธ ๊ฐ์ฒด์ง€ํ–ฅ C์–ธ์–ด (A์‚ฌ์˜ Objective-C๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค)

๐Ÿงช TDD C

  • ceedling ์†Œ๊ฐœ

๊ทธ์ค‘์—์„œ๋„ C์–ธ์–ด ๋ฆฌ๋งˆ์ธ๋“œํŽธ์€ ๋‹ค๋ฃฐ ๋‚ด์šฉ์ด ๋งŽ์ง€ ์•Š์œผ๋‹ˆ ๋ณธ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃจ๊ฒ ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿซ C์–ธ์–ด Remind

๊ตฌ์กฐ์ฒด

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด๋–ค ์ž๋ฃŒํ˜•์„ ์›ํ• ์ง€ ์ „๋ถ€ ์•Œ์•„์„œ ์ œ๊ณตํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ์˜ ์›์‹œ์ž๋ฃŒํ˜•๋งŒ ์ œ๊ณตํ•ด์ฃผ๊ณ  ๋ณ„๋„๋กœ ์›ํ•˜๋Š” ์ž๋ฃŒํ˜•์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์ˆ˜์žˆ๊ฒŒ ์ง€์›์„ ํ•ด์ค€๋‹ค. C์–ธ์–ด์—์„œ๋Š” ์ด๋ฅผ ๊ตฌ์กฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•œ๋‹ค. ์•„๋‹ˆ ์•„๋ฌด๋ฆฌ๊ทธ๋ž˜๋„ ์Šคํƒ๋„ ์ œ๊ณต ์•ˆํ•˜๋Š”๊ฑด ๋„ˆ๋ฌดํ•œ๊ฑฐ ์•„๋‹ˆ๋ƒ๊ณ 

์˜ˆ๋ฅผ๋“ค์–ด์„œ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ž๋ฃŒํ˜•์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜์ž.

struct student {
    char *name;      // ํ•™์ƒ ์ด๋ฆ„
    char *major;     // ์ „๊ณต
    float gpa;       // A.K.A ํ•™์ 
};

name๊ณผ major๊ฐ€ 1์›Œ๋“œ, gpa๊ฐ€ 4๋ฐ”์ดํŠธ(float ํฌ๊ธฐ)์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค.

1์›Œ๋“œ๋Š” ๋ช‡๋น„ํŠธ ์šด์˜์ฒด์ œ๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค. 64๋น„ํŠธ ์šด์˜์ฒด์ œ์—์„œ๋Š” 1์›Œ๋“œ๊ฐ€ 64๋น„ํŠธ๊ณ  32๋น„ํŠธ ์šด์˜์ฒด์ œ์—์„œ๋Š” 32๋น„ํŠธ์ด๋‹ค. ํƒ€์ž…์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ํฌ์ธํ„ฐ๋Š” 1์›Œ๋“œ์˜ ๊ณ ์ •๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋‹ค์‹œ๋งํ•ด void* ์™€ int*, char* ๋Š” ๋ชจ๋‘ ๊ฐ™์€ 1์›Œ๋“œ์˜ ๊ณต๊ฐ„์„ ๊ฐ–๋Š”๋‹ค.
๋ณธ ํฌ์ŠคํŠธ์—์„œ๋Š” ํŽธ์˜์ƒ 1์›Œ๋“œ๋ฅผ 64๋น„ํŠธ(8๋ฐ”์ดํŠธ)๋กœ ๊ฐ€์ •ํ•œ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™€๏ธ FYI: ๊ตฌ์กฐ์ฒด์•ˆ์˜ ๋ณ€์ˆ˜๋“ค์€ ์—ฐ์†๋œ ๊ณต๊ฐ„์„ ๊ฐ–๊ฒŒ๋˜๋Š”๋ฐ ๊ฐ€๋” ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์ƒ์˜ ๋ฌธ์ œ๋กœ padding์ด ๋ณ€์ˆ˜๋“ค ์‚ฌ์ด ํ˜น์€ ์•ž๋’ค์— ๋“ค์–ด๊ฐ€๊ธฐ๋„ ํ•œ๋‹ค.
struct student๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” 8๋ฐ”์ดํŠธ + 8๋ฐ”์ดํŠธ + 4๋ฐ”์ดํŠธ๋กœ 20๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ์ผ๊ฒƒ๊ฐ™์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” 64๋น„ํŠธ ์šด์˜์ฒด์ œ์—์„œ ๋น ๋ฅด๊ฒŒ ๋Œ์•„๊ฐ€๋„๋ก padding์„ 4๋ฐ”์ดํŠธ ๋ถ™์—ฌ์„œ 24๋ฐ”์ดํŠธ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. (๊ด€๋ จ ๊ณผ๋ชฉ: ์ปดํ“จํ„ฐ ๊ตฌ์กฐ, ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

struct student { ... };๋กœ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด๋Š” struct student ๋ณ€์ˆ˜๋ช…; ์œผ๋กœ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

struct student t = {       // student's t-distribution
    "William Sealy Gosset",
    "statistics",
    4.5,
};

์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด { } ์•ˆ์—์žˆ๋Š” ๋‚ด์šฉ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ name, major, gpa ์— ํ•˜๋‚˜์”ฉ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๋” ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ .์œผ๋กœ ๊ฐ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

struct student t = {
    .major = "statistics",
    .name = "William Sealy Gosset",
    .gpa = 4.5,
};

.์œผ๋กœ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”์„œ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.
๋ชจ๋˜ํ•ด๋ณด์ด๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜๋œ C์–ธ์–ด ๋ฌธ๋ฒ•์ด๋‹ค. c9x (199x๋…„) ๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” ๋ฌธ๋ฒ•.

๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ TMI: .ํ‘œ๊ธฐ๋ฒ•์˜ ์ •์‹ ๋ช…์นญ์€ designated initializer์ด๋‹ค

.ํ‘œ๊ธฐ๋ฒ•์˜ ์กด์žฌ์ž์ฒด๋ฅผ ๋ฐฐ์šฐ์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”์‹œ์—๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ๊ฒƒ ๊นŒ์ง€๋งŒ ๋ฐฐ์šด์‚ฌ๋žŒ์ด ๋งŽ์„ํ…๋ฐ ์ •๋ง ๋†€๋ž๊ฒŒ๋„ ์ต๋ช… ๊ตฌ์กฐ์ฒด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ฌ์ง€์–ด c11 (2011๋…„)๋ฟ ์•„๋‹ˆ๋ผ c99 (1999๋…„)์—์„œ๋„ ๋œ๋‹ค.

void print_student(struct student t) {
    puts(t.name);
    puts(t.major);
    printf("%d\n", t.gpa);
}
print_student((struct student){
    .major = "cse",
    .name = "gomjellie",
    .gpa = 3.6,
});

๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ TMI: ์ต๋ช… ๊ตฌ์กฐ์ฒด๋Š” compound literal์ด๋ผ๊ณ  ํ•œ๋‹ค. c99(1999๋…„)๋ถ€ํ„ฐ ์ง€์›๋œ๋‹ค.

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋Š” void *์™€ ๋”๋ถˆ์–ด C์–ธ์–ด์˜ ์œ ์—ฐ์„ฑ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” C์–ธ์–ด์˜ ๊ฝƒ๊ฐ™์€ ์กด์žฌ์ด๋‹ค.

์„ ์–ธ๋ฐฉ์‹์ด ์ข€ ํŠน์ดํ•œ๋ฐ ๋ฐ˜ํ™˜ํ˜• (*ํ•จ์ˆ˜ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ช…) (์ธ์ž) ์ˆœ์„œ๋กœ ์“ด๋‹ค.

๋ฐ˜ํ™˜ํ˜•์ด ์—†๊ณ  ์ธ์ž๋กœ int* ๋ฅผ ๋‘๊ฐœ ๊ฐ–๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ *fp์˜ ์„ ์–ธ ์˜ˆ์‹œ

void (*fp) (int*, int*); // *fp: function pointer

1ํ•™๋…„๋•Œ ์ˆ˜์—…์„ ๋Œ์ด์ผœ๋ณด๋ฉด ํ•จ์ˆ˜ํฌ์ธํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ๋Œ€์ž…ํ•˜๊ณ  ๋„˜๊ฒจ์ฃผ๋Š”์ง€๋Š” ์•Œ๋ ค์ฃผ๋Š”๋ฐ ์™œ ํ•„์š”ํ•œ๊ฑด์ง€๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

ํ•จ์ˆ˜ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์€ ๊ณ ์ „ ๋ช…์ž‘ ์–ด๋ฆฐ์™•์ž์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

C์–ธ์–ด ํ–‰์„ฑ ๊ทผ์ฒ˜๋ฅผ ์—ฌํ–‰ํ•˜๋˜ ๋‚˜๋Š” ์–ด๋Š ๋‚  ์‚ฌ๋ง‰์—์„œ ๋ฌธ๋“ ๋น„ํ–‰๊ธฐ ๊ณ ์žฅ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋น„ํ–‰๊ธฐ ์—”์ง„์˜ ์–ด๋”˜๊ฐ€๊ฐ€ ํŒŒ์†๋œ ๊ฒƒ์ด๋‹ค. ์ •๋น„์‚ฌ๋„ ์Šน๊ฐ๋„ ์—†์ด ํ˜ผ์ž์˜€์œผ๋ฏ€๋กœ ๋‚˜๋Š” ๊ทธ ์–ด๋ ค์šด ์ˆ˜๋ฆฌ๋ฅผ ์†์ˆ˜ ํ•ด๋ณด๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน์—ˆ๋‹ค.

๋‚ด๊ฒŒ ์žˆ์–ด์„œ ๊ทธ๊ฒƒ์€ ์ฃฝ๋Š๋ƒ ์‚ฌ๋Š๋ƒ์˜ ๋ฌธ์ œ์˜€๋‹ค. ๋งˆ์‹ค ๋ฌผ์ด ์ผ์ฃผ์ผ๋ถ„๋ฐ–์— ๋‚จ์•„ ์žˆ์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

์ฒซ๋‚  ๋ฐค, ๋‚˜๋Š” ์‚ฌ๋žŒ์ด ์‚ฌ๋Š” ๊ณณ์—์„œ ์ˆ˜๋งŒ ๋ฆฌ ๋–จ์–ด์ง„ ์‚ฌ๋ง‰์—์„œ ์ž ์ด ๋“ค์—ˆ๋‹ค. ๋“œ๋„“์€ ๋ฐ”๋‹ค ํ•œ๊ฐ€์šด๋ฐ์—์„œ ๋—๋ชฉ์„ ํƒ€๊ณ  ํ‘œ๋ฅ˜ํ•˜๋Š” ๋‚œํŒŒ์ž๋ณด๋‹ค๋„ ํ›จ์”ฌ ๋” ๊ณ ๋ฆฝ๋œ ์‹ ์„ธ์˜€๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ํ•ด๊ฐ€ ๋œฐ ๋ฌด๋ ต, ์–ด๋–ค ๊ธฐ์ดํ•œ ๋ชฉ์†Œ๋ฆฌ์— ์ž ์ด ๊นฌ ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋†€๋ž์„์ง€ ์—ฌ๋Ÿฌ๋ถ„์€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ ๋ชฉ์†Œ๋ฆฌ๋Š” ๋งํ–ˆ๋‹ค.

๐Ÿ’๐Ÿฝ : ์ €๊ธฐ.... ์†ŒํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์งœ์ค˜

๐Ÿ˜ง : ์‘?

๐Ÿ’๐Ÿฝ : ๋‚˜, ์†ŒํŠธ ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์งœ์ค˜

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

#define SWAP(x, y) do { typeof(x) SWAP = x; x = y; y = SWAP; } while (0)

void sort(int arr[], size_t len) {
    for (size_t i = 0; i < len; i++) {
        for (size_t j = i + 1; j < len; j++) {
            if (arr[i] > arr[j])
                SWAP(arr[i], arr[j]);
        }
    }
}

๐Ÿคฆ๐Ÿฝ: ์•„๋ƒ, ์•„๋ƒ! ์ด sortํ•จ์ˆ˜๋Š” ์ •์ˆ˜ํ˜• ํƒ€์ž…๋ฐ–์— ๋ชป์“ฐ์ž–์•„. intํ˜•์€ ๋„ˆ๋ฌด ๊ฑฐ์ถ”์žฅ์Šค๋Ÿฌ์›Œ. ๋‚˜๋Š” doubleํ˜• ํƒ€์ž… ๋ฐฐ์—ด์„ ์ •๋ ฌํ• ๊บผ์•ผ. ๋‚˜, sort ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ์งœ์ค˜.

ใ……ใ…‚ใ„นใ…? ์ง„์ž‘๋งํ•˜๋˜๊ฐ€

๊ท€์ฐฎ์ง€๋งŒ ํ•จ์ˆ˜๋ฅผ ๋ณต๋ถ™ํ•ด์„œ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด sort_double() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ณด์—ฌ์ค€๋‹ค.

void sort_double(double arr[], size_t len) {
    for (size_t i = 0; i < len; i++) {
        for (size_t j = i + 1; j < len; j++) {
            if (arr[i] > arr[j])
                SWAP(arr[i], arr[j]);
        }
    }
}

๐Ÿ™…๐Ÿฝ: ์•ˆ ๋ผ! float ํ˜•์€ ์ง€์›์ด ์•ˆ๋˜๋Š”๊ฑธ? ๋‹ค๋ฅธ sortํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋˜๋‹ค์‹œ sort_float()ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ณด์—ฌ์คฌ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ž์˜ ๊ฒƒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ‡ด์งœ๋ฅผ ๋งž์•˜๋‹ค.

์—”์ง„์„ ๋ถ„ํ•ดํ•˜๋Š” ์ผ์ด ๊ธ‰ํ•˜๊ธฐ์— ๋‚˜๋Š” ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ผ์ ๊ฑฐ๋ ค๋†“๊ณ ๋Š” ๊ทธ์—๊ฒŒ ํ•œ๋งˆ๋””๋ฅผ ํˆญ ๋˜์ ธ๋ณด์•˜๋‹ค.

#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

void sort(void *arr, size_t len, size_t ts, bool (*cmp) (void *a, void *b)) { // ts: type_size
    void *tmp = malloc(ts);
    for (size_t i = 0; i < len; i++) {
        for (size_t j = i + 1; j < len; j++) {
            if (!cmp((char *)arr + i * ts, (char *)arr + j * ts)) continue;
            memcpy(tmp, (char *)arr + j * ts, ts);
            memcpy((char *)arr + j * ts, (char *)arr + i * ts, ts);
            memcpy((char *)arr + i * ts, tmp, ts);
        }
    }
    free(tmp);
}

๐Ÿ˜ง ์ด๊ฑด genericํ•œ sort์•ผ ๋„ค๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ž… ์ง€์›์€ ํ•จ์ˆ˜ํฌ์ธํ„ฐ *cmp์•ˆ์— ์žˆ์–ด.

๐Ÿ™†๐Ÿฝ ๋‚ด๊ฐ€ ์›ํ•˜๋˜๊ฒŒ ๋ฐ”๋กœ ์ด๊ฑฐ์•ผ!

์ด๋ ‡๊ฒŒ ๋‚˜๋Š” ์ด ์–ด๋ฆฐ์™•์ž๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋งŒ์•ฝ ํ•จ์ˆ˜ํฌ์ธํ„ฐ ๊ฐœ๋…์„ ์ˆ™์ง€ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์–ด๋ฆฐ์™•์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๊ณ  ๋“ ๋“ ํ•œ ์„์œ ์žฌ๋ฒŒ ์ธ๋งฅ์„ ์–ป์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

๋™์ ํ• ๋‹น๊ณผ runtime storage

malloc์€ ๋ง๋ก์ด ์•„๋‹ˆ๋ผ m-alloc์œผ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.

malloc() ํ•จ์ˆ˜๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

๋ฐฐ์—ด์˜ ์„ ์–ธ์€ ๊ณ ์ •๋œ ์‚ฌ์ด์ฆˆ๋กœ๋งŒ ๊ฐ€๋Šฅํ•ด์„œ

int len;
scanf("%d", &len);
int dynamic_array[len];

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— dynamic_array๋ฅผ ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ malloc() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๊ณต๊ฐ„์„ ๋งŒ๋“ ๋‹ค๊ณ  ๋ฐฐ์šด ์‚ฌ๋žŒ์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

int *dynamic_array = malloc(sizeof(int) * len);

๋ฐ˜์€ ๋งž๊ณ  ๋ฐ˜์€ ํ‹€๋ฆฐ ์ด์œ ๋‹ค.

c์–ธ์–ด๋Š” VLA(variable length array)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ€๋ณ€๊ธธ์ด ๋ฐฐ์—ด์„ ์ง€์›ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ dynamic_array[len]์€ ์ž˜ ๋™์ž‘ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŽ๋‹ค. (๋น„์ฃผ์–ผ์ŠคํŠœ๋””์˜ค ๊บผ๋ผ)

๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ TMI: VLA๋Š” C99์—์„œ ํ•„์ˆ˜๊ตฌํ˜„, C11์—์„  ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด malloc()์ด ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

malloc()์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” lifetime์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์„ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

ํ•™๊ต ์ˆ˜์—…์„ ์—ด์‹ฌํžˆ ๋“ค์€ ์‚ฌ๋žŒ์ด๋ผ๋ฉด malloc์œผ๋กœ ํ• ๋‹น๋œ ๊ณต๊ฐ„๊ณผ ํ•จ์ˆ˜๋‚ด๋ถ€์˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋œ ๊ณต๊ฐ„์ด heap๊ณผ stack์œผ๋กœ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋Œ€ํ‘œ์ ์ด C์–ธ์–ด ์ŠคํŽ™์— ๋Œ€ํ•œ ์˜ค๊ฐœ๋…์ด๋‹ค.

์ •๋ง ๋†€๋ž๊ฒŒ๋„ C์–ธ์–ด ์ž์ฒด์—๋Š” ์Šคํƒ๊ณผ ํž™ ๊ฐœ๋…์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. C11์˜ Final Draft์ธ n1570์—๋Š” stack๊ณผ heap๋ผ๋Š” ๋‹จ์–ด ์ž์ฒด๊ฐ€ ์•„์˜ˆ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. ๋‹น์—ฐํžˆ, ์ง€์—ญ๋ณ€์ˆ˜๋Š” stack์—, malloc์˜ ๊ฒฐ๊ณผ๊ฐ’์€ heap์— ์œ„์น˜ํ•œ๋‹ค๋ผ๋Š” ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๊ทœ์น™ ๋˜ํ•œ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

C์–ธ์–ด๋Š” ์‹ฌ์ง€์–ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ฐ˜๋“œ์‹œ stack์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์Šคํƒ๊ณผ ํž™์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” C์–ธ์–ด์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ CPU์™€ OS์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊บผ๋ฌด์œ„ํ‚ค ์ฐธ์กฐ

๋‹ค์Œํฌ์ŠคํŠธ C์˜ ๊ฐ์ฒด๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

references

profile
ํœดํ•™์ค‘๋…์ž ์˜ค์ธ๊ทœ

25๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 5์›” 26์ผ

์œ ์ตํ•œ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ^_^

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 26์ผ

๋„ˆ๋ฌด ๋ฉ‹์žˆ์–ด์š” ใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 26์ผ

๋ ˆํผ๋Ÿฐ์Šค์—์„œ ์‹ ๋ขฐ๊ฐ€ ๊ฐ€๋„ค์š”^^

2๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 26์ผ

Awesome. I can't wait to see!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 28์ผ

๐Ÿ˜€๐Ÿ˜€๐Ÿ˜€

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 28์ผ

์žฌ๋ฐŒ๋‹คใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 5์›” 29์ผ

๊ธ€ ์žฌ๋ฐŒ๊ฒŒ ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ( 0 v 0) b ๋‘๋‘ฅ!
์ €๋„ ์š”์ฆ˜ C๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ๊ด€๊ณ„๋กœ ๊ฐ™์€ ์ฃผ์ œ์˜ ๊ธ€์„ ๋ณด๋‹ˆ ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค.

๊ธ€์„ ๋ณด๊ณ  ๋งŒํ™”๊ฐ€์˜ ์ทจ๋ฏธ์ƒํ™œ ์‚ฌ์ „ ๋’ค์ง€๊ธฐ๋ฅผ ํ•ด๋ณด๋‹ˆ ์žฌ๋ฐŒ๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
C99 ํ‘œ์ค€์—๋Š” ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋Š” ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ• ๋‹น๋˜๋Š” ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๊ฐ™์€ ์•„ํ‚คํ…์ณ์—์„œ๋Š” ์ตœ๋Œ€ํ•œ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋™์ผ์‹œํ•˜๋Š”๊ฒŒ ๊ณ„์‚ฐ์ƒ ํŽธํ•˜๊ธด ํ•˜์ง€๋งŒ, C99 ํ‘œ์ค€์ด ์ž‘์„ฑ๋˜๋˜ ๊ทธ ์‹œ๊ธฐ์—๋Š” ๊ทนํ•œ์˜ ์ตœ์ ํ™”๋ฅผ ์ด๋ฃจ๊ธฐ ์œ„ํ•œ ์˜ˆ์™ธ๋“ค์ด ์กด์žฌํ•จ์— ๋”ฐ๋ผ ๊ฐ™์€ ์•„ํ‚คํ…์ณ์—์„œ๋„ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•˜๋„๋ก ์ŠคํŽ™์ด ์ž‘์„ฑ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ƒ ํ˜„๋Œ€์— ์™€์„œ๋Š” ์ด๋Ÿฐ ์˜ˆ์™ธ๋ฅผ ์ ์šฉํ• ๋งŒํผ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ž˜ ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ C ์ŠคํŽ™์ƒ์œผ๋กœ๋Š” ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ๋Š” ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•˜๋„ค์š”. ์‹ ๊ธฐ๋ฐฉ๊ธฐ!

์ฐธ๊ณ ์ž๋ฃŒ) C99 ํ‘œ์ค€, ์„น์…˜ 6.3.2.3 ๋ณดํ†ต 59ํŽ˜์ด์ง€์— ์œ„์น˜.

2๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 6์›” 1์ผ

์ถ”์–ต์ด ์ƒˆ๋ก์ƒˆ๋ก ใ…‹ใ…‹ใ…‹ใ…‹

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 6์›” 5์ผ

์š”์ฆ˜ ํ•™๊ต ๊ณผ์ œ๋•œ์— ๊ฑฐ์˜ ๋งจ๋‚  C ์ฝ”๋“œ๋งŒ ๋“ค์—ฌ๋‹ค๋ณด๋˜ ์ฐจ๋ผ ๋„ˆ๋ฌด๋‚˜ ์žฌ๋ฐŒ๊ฒŒ ์ฝ์—ˆ๋„ค์š”ใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2020๋…„ 6์›” 23์ผ

์žฌ๋ฐŒ๊ณ  ์œ ์ตํ•˜๋‹ค๋Š” ๋ง์ด ์ด๋ ‡๊ฒŒ ๋งž์„ ์ˆ˜๊ฐ€ ์žˆ์„๊นŒ์š”? ์ •๋ง ์ข‹๋„ค์š”.

1๊ฐœ์˜ ๋‹ต๊ธ€