Post

[C] ๊ตฌ์กฐ์ฒด

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

๋ฐฐ์—ด์€ ๊ฐ™์€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ฌถ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ โ€œํ•™์ƒ ํ•œ ๋ช…โ€์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ํ•™๋ฒˆ(๋ฌธ์ž์—ด), ๋‚˜์ด(์ •์ˆ˜), ํ‚ค(์‹ค์ˆ˜)์ฒ˜๋Ÿผ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค. ์ด๊ฑธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ตฌ์กฐ์ฒด(struct)๋‹ค.

๊ตฌ์กฐ์ฒด(struct)๋ž€? ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ(๋ฉค๋ฒ„)๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋ฃŒํ˜•. ํ•œ ๊ตฌ์กฐ์ฒด์— ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๋ฌถ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.

๋ฉค๋ฒ„ํƒ€์ž…
ํ•™๋ฒˆchar[]
์ด๋ฆ„char[]
๋‚˜์ดunsigned char (0~255)
ํ•™๋…„unsigned char
์„ฑ๋ณ„char (โ€˜Mโ€™/โ€™Fโ€™)
ํ‚คfloat (173.4)

1. ๊ตฌ์กฐ์ฒด ์ •์˜์™€ ์‚ฌ์šฉ

point๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž. ์œ„์น˜๋Š” main() ํ•จ์ˆ˜ ๋ฐ–, ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋‘”๋‹ค.

1
2
3
4
struct point {
    int x;   // ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(member variable)
    int y;
};

Desktop View

x, y์ฒ˜๋Ÿผ ๊ตฌ์กฐ์ฒด ์•ˆ์˜ ๋ณ€์ˆ˜๋“ค์„ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ์ด์ œ main()์—์„œ ์‚ฌ์šฉํ•ด ๋ณด์ž.

1
2
3
4
struct point p1;   // point ๊ตฌ์กฐ์ฒด ํƒ€์ž…์˜ ๋ณ€์ˆ˜ p1
p1.x = 100;        // ๋ฉค๋ฒ„ ์—ฐ์‚ฐ์ž(.)๋กœ ๋ฉค๋ฒ„์— ์ ‘๊ทผ
p1.y = 200;
printf("(%d, %d)\n", p1.x, p1.y);

Desktop View

p1์˜ ํƒ€์ž…์€ point ๊ตฌ์กฐ์ฒด๋‹ค. ๋ฉค๋ฒ„์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ๋•Œ๋Š” ๋ฉค๋ฒ„ ์—ฐ์‚ฐ์ž(.)๋ฅผ ์“ด๋‹ค. p1.x = 100;์€ โ€œp1์˜ ๋ฉค๋ฒ„ x์— 100์„ ๋Œ€์ž…โ€์ด๋ผ๋Š” ๋œป์ด๋‹ค.

Desktop View

์—ฌ๋Ÿฌ ํƒ€์ž…์„ ์„ž์€ person ๊ตฌ์กฐ์ฒด๋„ ๋งŒ๋“ค์–ด ๋ณด์ž.

Desktop View

Desktop View

๐Ÿ’ก ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์— ๋ฌธ์ž์—ด์„ ๋„ฃ์„ ๋•Œ๋Š” strcpy๋ฅผ ์“ด๋‹ค. ์ด๋•Œ ์†Œ์Šค ํŒŒ์ผ ๋งจ ์œ„์— #include <string.h>๋ฅผ ์žŠ์ง€ ๋ง์ž.

Desktop View

์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋‹ค.

Desktop View

์„ ์–ธ๊ณผ ๋™์‹œ์— ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

Desktop View

{0}์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋ชจ๋“  ๋ฉค๋ฒ„๊ฐ€ 0์ด ๋œ๋‹ค. char ๋ฉค๋ฒ„๋Š” ๋„('\0') ๋ฌธ์ž๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์ถœ๋ ฅ ์‹œ ์•„๋ฌด๊ฒƒ๋„ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. (๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•œ ๋ถ€๋ถ„์ด๋‹ค.)


2. typedef โ€” ํƒ€์ž…์— ๋ณ„๋ช… ๋ถ™์ด๊ธฐ

main() ์œ„์—์„œ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณธ๋ฌธ์—์„œ ์“ฐ๋ ค๋ฉด ๋งค๋ฒˆ struct person p1;์ฒ˜๋Ÿผ struct๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค. ๊ธธ์–ด์ง€๋ฉด ๋ฒˆ๊ฑฐ๋กญ๋‹ค. typedef๋Š” ์›ํ•˜๋Š” ํƒ€์ž…๋ช…์œผ๋กœ ๋ณ„๋ช…์„ ๋ถ™์—ฌ์ค€๋‹ค.

1
2
3
typedef struct person PS;   // ์ด์ œ struct person ๋Œ€์‹  PS๋กœ

PS p1;   // struct person p1; ๊ณผ ๋™์ผ

Desktop View

Desktop View

๊ตฌ์กฐ์ฒด ์ •์˜์™€ ๋™์‹œ์— typedef๋ฅผ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

1
2
3
typedef struct _person {
    ...
} Person;   // ์•ž์œผ๋กœ struct _person ์„ Person ์œผ๋กœ

Desktop View


3. ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ (size)

Person(char 20 + int + double)์˜ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ์ผ๊นŒ? ๋‹จ์ˆœ ํ•ฉ์‚ฐ์ด๋ฉด 20 + 4 + 8 = 32byte๋‹ค.

1
printf("sizeof(Person) = %d\n", sizeof(Person));

Desktop View

์ผ๋‹จ 32byte๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿ’ก ์‹ค์ œ๋กœ๋Š” CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฝ๋„๋ก ๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ(padding) ๋•Œ๋ฌธ์— ๋‹จ์ˆœ ํ•ฉ๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ ์ •๋ฆฌ.


4. ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ

๊ตฌ์กฐ์ฒด์—๋„ ํฌ์ธํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1
Person *ptr = &p3;   // p3์˜ ์ฃผ์†Œ๋ฅผ ptr์— ์ €์žฅ

Desktop View

์ž์ฃผ ์“ธ ์„œ์‹ ๋ฌธ์ž์—ด์„ ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด๋‘๋ฉด ํŽธํ•˜๋‹ค.

1
char *fmt = "์ด๋ฆ„:%s, ๋‚˜์ด:%d, ๋ชธ๋ฌด๊ฒŒ:%.1lf\n";

Desktop View

ํฌ์ธํ„ฐ๋กœ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ•˜์ž.

ํ‘œ๊ธฐ์˜๋ฏธ
(*ptr).name๋ฉค๋ฒ„ ์—ฐ์‚ฐ์ž(.)๊ฐ€ ์ฐธ์กฐ ์—ฐ์‚ฐ์ž(*)๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„ ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”
ptr->name์œ„์™€ ์™„์ „ํžˆ ๋™์ผ. C๊ฐ€ ๋งŒ๋“  ๊ฐ„ํŽธ ํ‘œ๊ธฐ(ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž)

์ฆ‰ (*ptr).name์„ ๋” ๊ฐ„๋‹จํžˆ ์“ด ๊ฒƒ์ด ptr->name์ด๋‹ค. ์ž‘๋™์€ ๋˜‘๊ฐ™๋‹ค.

Desktop View

์ด๋ฅผ ์ด์šฉํ•ด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
void printPerson(Person *ptr) { ... }

printPerson(ptr);    // Person *ptr = &p3; ์ธ ๊ฒฝ์šฐ
printPerson(&p3);    // ์ง์ ‘ ์ฃผ์†Œ๋ฅผ ๋„˜๊ฒจ๋„ ๋จ

Desktop View


5. ๊ตฌ์กฐ์ฒด์™€ ๋ฐฐ์—ด

๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

1
Person people[3];   // Person ๊ตฌ์กฐ์ฒด 3๊ฐœ์งœ๋ฆฌ ๋ฐฐ์—ด

Desktop View

๋‹จ์ˆœ ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅธ ์ ์€, ๊ฐ ๋ฐฐ์—ด ์›์†Œ ์•ˆ์— ๋˜ ์—ฌ๋Ÿฌ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (people[0].name, people[0].age โ€ฆ)

Desktop View

Desktop View


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
7
๊ตฌ์กฐ์ฒด(struct)
โ”œโ”€ ์ •์˜     struct ์ด๋ฆ„ { ๋ฉค๋ฒ„๋“ค; };   ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ํ•˜๋‚˜๋กœ
โ”œโ”€ ์ ‘๊ทผ     ๋ณ€์ˆ˜.๋ฉค๋ฒ„  (๋ฉค๋ฒ„ ์—ฐ์‚ฐ์ž .)
โ”œโ”€ typedef  struct ์ด๋ฆ„์— ๋ณ„๋ช… ๋ถ€์—ฌ โ†’ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ ์–ธ
โ”œโ”€ size     ๋ฉค๋ฒ„ ํ•ฉ (+ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ padding)
โ”œโ”€ ํฌ์ธํ„ฐ   (*ptr).name  โ‰ก  ptr->name  (ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž)
โ””โ”€ ๋ฐฐ์—ด     Person people[N] โ†’ ์›์†Œ๋งˆ๋‹ค ๋ฉค๋ฒ„๋“ค ๋ณด์œ 
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
๊ตฌ์กฐ์ฒด์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋ฌถ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋ฃŒํ˜•
๋ฉค๋ฒ„ ์—ฐ์‚ฐ์ž .๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผ
typedefํƒ€์ž…์— ๋ณ„๋ช…์„ ๋ถ™์—ฌ ์„ ์–ธ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ
ํ™”์‚ดํ‘œ ->ํฌ์ธํ„ฐ๋กœ ๋ฉค๋ฒ„ ์ ‘๊ทผ, (*ptr).x์˜ ์ถ•์•ฝ

๊ตฌ์กฐ์ฒด๋Š” โ€œ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ์˜๋ฏธ ๋‹จ์œ„๋กœ ๋ฌถ๋Š”โ€ ๋„๊ตฌ๋‹ค. ํŠนํžˆ ptr->name(=(*ptr).name) ํ‘œ๊ธฐ๋Š” ์•ž์œผ๋กœ ์ •๋ง ์ž์ฃผ ๋งŒ๋‚˜๊ฒŒ ๋˜๋‹ˆ ํ™•์‹คํžˆ ์ตํ˜€๋‘์ž. ๊ธด C ์—ฌ์ •์ด์—ˆ๋Š”๋ฐ ๋ณด๋žŒ์ด ์žˆ์—ˆ๋‹ค!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.