구조체란
구조체(structure)란, 각각 다른 type의 요소들로 구성될 수 있는 데이터이다. 배열과 달리 각 원소들은 이름을 갖고 이름을 통해 접근할 수 있다..
굳이 따지자면 파이썬의 dictionary
와 비슷하다고 할 수 있다. (실제로 C언어의 struct를 dictionary로 변환하는 파이썬 모듈이 있다고 한다…)
그래서 구조체가 뭔데?
결국 struct <구조체 이름>
은 하나의 데이터 타입이고, int
란 키워드가 데이터타입으로써 여러 곳에 쓰이듯이 struct 키워드도 다양하게 쓰인다. (구조체의 이름을 tag라고 부르는데, 그냥 이름이라고 부르겠다)
struct Car {
char brand[50];
char model[50];
int year;
};
struct Point {
int x;
int y;
} p1 = {3, 4}, p2 = {1, 8}, p3 = {0, 20};
struct Point p4 = {100, 200};
p4 = p1; // legal
struct Car c1;
c1 = p1; // error!
위의 Car은 struct를 정의만 한 반면, 밑의 Point는 데이터 타입으로써 정의된 동시에 변수 선언까지 했다. struct Point { ... }
를 통째로 하나의 데이터 타입으로 보면 확 와닿는다.
위의 p1, p2, p3, p4는 서로 compatible
하다. 서로 값을 할당받을 수 있다는 뜻. 다르게 정의된 구조체끼리는 호환이 안 된다는 말이다.
멤버 접근
.
을 통한 접근과 ->
을 통한 접근. 멤버 접근 연산자들은 모든 연산자들중에서 연산자 우선순위
가 가장 높다.
printf("%i", p1.x); // 3 출력
struct Point * pp = &p1; // 구조체 p1을 가리키는 pointer
printf("%i", pp->x); // 3 출력
함수에서 쓰기
당연히 함수의 parameter로 쓸 수 있고, 함수의 반환 타입이 될 수 있다. 눈이 아프고 복잡하긴 하지만, struct <구조체명>
를 하나의 데이터 타입이라고 생각하면 편하다.
struct Point add_point(struct Point pt1, struct Point pt2) {
struct Point pt = {pt1.x + pt2.x , pt1.y + pt2.y};
return pt;
}
int add(int a, int b){
int result = a + b;
return result;
}
call by value
, call by reference
도 다른 변수들과 똑같이 적용된다.
array of structure.
// c언어의 각 키워드를 나타내는 구조체
struct key {
char *word;
int count;
} keytab[] = {{"auto", 0},
{"break", 0},
{"case", 0},
{"char", 0},
{"const", 0},
// ....
{"unsigned", 0},
{"while", 0}};
nested structure
struct는 struct를 원소로 가질 수 있다.
/* nested structure */
struct Rectangle {
struct Point pt1;
struct Point pt2;
};
typedef
typedef
와 같이 쓸 수 있다. 난 구조체를 만들때, 매번 struct를 치기 귀찮고 가독성도 떨어지는 것 같아서 typedef
까지 한번에 하는 편이다.
typedef struct Point {
int x;
int y;
} PointType; // 타입 정의
PointType p6 = { 1,3 } // 변수 선언
자기 참조 구조체 (self-reference structure)
필드중에 자기 자신(타입)을 가리키는 포인터가 한 개 이상 존재하는 구조체를 말한다.
자료구조(특히 linked list, tree)를 배우다 보면 숫하게 나온다.
typedef int element;
typedef struct Node { // 자기 참조 구조체
element data;
struct Node *link; // 자기 자신을 참조하는 포인터.
} ListNode;
참고 : C언어로 쉽게 풀어 쓴 자료구조
'language' 카테고리의 다른 글
제어자 (modifier) (0) | 2023.03.24 |
---|---|
OOP (0) | 2023.03.24 |
c언어. 포인터와 주솟값 (0) | 2022.12.20 |
JS 스코프와 scope chain (0) | 2022.12.03 |
JS 실행 컨텍스트와 콜 스택 (0) | 2022.12.03 |