[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;
};
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);
p1์ ํ์
์ point ๊ตฌ์กฐ์ฒด๋ค. ๋ฉค๋ฒ์ ๊ฐ์ ๋์
ํ ๋๋ ๋ฉค๋ฒ ์ฐ์ฐ์(.)๋ฅผ ์ด๋ค. p1.x = 100;์ โp1์ ๋ฉค๋ฒ x์ 100์ ๋์
โ์ด๋ผ๋ ๋ป์ด๋ค.
์ฌ๋ฌ ํ์
์ ์์ person ๊ตฌ์กฐ์ฒด๋ ๋ง๋ค์ด ๋ณด์.
๐ก ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ๋ฌธ์์ด์ ๋ฃ์ ๋๋
strcpy๋ฅผ ์ด๋ค. ์ด๋ ์์ค ํ์ผ ๋งจ ์์#include <string.h>๋ฅผ ์์ง ๋ง์.
์ด๊ธฐํ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ ๊ฐ์ง๋ค.
์ ์ธ๊ณผ ๋์์ ๋ฐฐ์ด ํํ๋ก ์ด๊ธฐํํ ์ ์๋ค.
{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; ๊ณผ ๋์ผ
๊ตฌ์กฐ์ฒด ์ ์์ ๋์์ typedef๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ๋ ์๋ค.
1
2
3
typedef struct _person {
...
} Person; // ์์ผ๋ก struct _person ์ Person ์ผ๋ก
3. ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ (size)
Person(char 20 + int + double)์ ํฌ๊ธฐ๋ ์ผ๋ง์ผ๊น? ๋จ์ ํฉ์ฐ์ด๋ฉด 20 + 4 + 8 = 32byte๋ค.
1
printf("sizeof(Person) = %d\n", sizeof(Person));
์ผ๋จ 32byte๊ฐ ์ถ๋ ฅ๋๋ค.
๐ก ์ค์ ๋ก๋ CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ(padding) ๋๋ฌธ์ ๋จ์ ํฉ๋ณด๋ค ์ปค์ง ์ ์๋ค. ์์ธํ ๋ด์ฉ์ ์ถํ ์ ๋ฆฌ.
4. ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ
๊ตฌ์กฐ์ฒด์๋ ํฌ์ธํฐ๋ฅผ ์ ์ฉํ ์ ์๋ค.
1
Person *ptr = &p3; // p3์ ์ฃผ์๋ฅผ ptr์ ์ ์ฅ
์์ฃผ ์ธ ์์ ๋ฌธ์์ด์ ์ ์ญ๋ณ์๋ก ๋ง๋ค์ด๋๋ฉด ํธํ๋ค.
1
char *fmt = "์ด๋ฆ:%s, ๋์ด:%d, ๋ชธ๋ฌด๊ฒ:%.1lf\n";
ํฌ์ธํฐ๋ก ๋ฉค๋ฒ์ ์ ๊ทผํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋น๊ตํ์.
| ํ๊ธฐ | ์๋ฏธ |
|---|---|
(*ptr).name | ๋ฉค๋ฒ ์ฐ์ฐ์(.)๊ฐ ์ฐธ์กฐ ์ฐ์ฐ์(*)๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๊ดํธ๊ฐ ํ์ |
ptr->name | ์์ ์์ ํ ๋์ผ. C๊ฐ ๋ง๋ ๊ฐํธ ํ๊ธฐ(ํ์ดํ ์ฐ์ฐ์) |
์ฆ (*ptr).name์ ๋ ๊ฐ๋จํ ์ด ๊ฒ์ด ptr->name์ด๋ค. ์๋์ ๋๊ฐ๋ค.
์ด๋ฅผ ์ด์ฉํด ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์๋ ๋ง๋ค ์ ์๋ค.
1
2
3
4
void printPerson(Person *ptr) { ... }
printPerson(ptr); // Person *ptr = &p3; ์ธ ๊ฒฝ์ฐ
printPerson(&p3); // ์ง์ ์ฃผ์๋ฅผ ๋๊ฒจ๋ ๋จ
5. ๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด
๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐฐ์ด ํํ๋ก๋ ์ธ ์ ์๋ค.
1
Person people[3]; // Person ๊ตฌ์กฐ์ฒด 3๊ฐ์ง๋ฆฌ ๋ฐฐ์ด
๋จ์ ๋ฐฐ์ด๊ณผ ๋ค๋ฅธ ์ ์, ๊ฐ ๋ฐฐ์ด ์์ ์์ ๋ ์ฌ๋ฌ ๋ฉค๋ฒ ๋ณ์๊ฐ ๋ค์ด ์๋ค๋ ๊ฒ์ด๋ค. (people[0].name, people[0].age โฆ)
๐ ์ ๋ฆฌ
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 ์ฌ์ ์ด์๋๋ฐ ๋ณด๋์ด ์์๋ค!



















Comments powered by Disqus.