오늘은 구조체에 대해서 알아보겠다.
구조체란?
배열은 같은 형의 데이터들을 묶을 수 있는 명령어라면, 구조체는 서로 다른형의 데이터를 묶을 수 있는 명령어이다.
그림으로 나타내보자면
이러한 형태이다. 그러면 구조체는 어떻게 만들까?
우리는 두가지의 개념을 먼저 알고가야된다. 하나는 ‘구조체 형’을 선언하는 것,
두번째는 ‘구조체 형 변수’를 선언하는것이다.
먼저 구조체 형 선언을 먼저 보면
이렇게 할 수 있다. struct라는 키워드를 써주고 구조체의 이름을 써준다.
그러면 구조체 student라는 형이 선언 된 것이다. 우리가 int a;하면 정수형 변수 a를 선언한것 처럼, student a;를 해주면 구조체 studnet형 변수 a를 선언해준 것이다.
그 후 {}로 묶고 ;으로 마무리 해주면 된다. {} 안에는 멤버라고 하는 다양한 형의 변수들이 있다. 원하는 변수를 한 구조체에 묶어주는 형태이다.
한번 더 짚고 넘어가자면, 구조체를 정의하는 것은 변수 선언은 아니다.
우리가 int를 정수‘형’으로 써주듯이, struct student를 구조체 ‘형’으로 써주는 것이고 구조체 변수를 다시 선언 해줘야 한다.
하나 더 짚자면, 형을 먼저 선언 해줘야지 변수의 선언이 가능하다.
우리의 컴파일러는 코드를 위에서부터 읽기 때문에, 선언해주지 않은 형이 변수 앞에 쓰이면 컴파일러는 당황하고 끝내 오류라는 결과값을 우리에게 반환 할 것이다.
+ 위에 구조체는 메모리를 어떻게 할당 받았을까?
int number; -> 4byte
char name[10]; -> 10byte
double grade; -> 8byte
로 22byte라고 생각할 수 있지만, 메모리 alignment를 고려하면
4byte단위로 변수를 접근하도록 설계되었기 때문에 메모리의 패딩이 일어난다.
즉 char name의 메모리가 4바이트 단위를 맞추기위해 2바이트 패딩되어 총 12바이트가 된다. 그러므로 총 24byte를 할당받는다. 그림으로 보자면
이렇게 된다.
우리는 구조체 형을 선언하고, 구조체 변수를 선언하는 방법을 알아보았다.
그러면 이제 구조체 안에있는 멤버들을 끌어다 쓰는 방법을 알아야한다.
구조체 멤버 참조
구조체 안에있는 멤버는 . 이라는 접근 연산자를 쓴다.
쓰는 방법은 앞에 구조체 변수를 써주고, 멤버 접근 연산자 . 을 써준 후, 그 구조체 변수 안에 있는 멤버를 입력하면 된다. 말로 설명하기 좀 그러니 예제를 보자면
이렇게 멤버에 접근해서 수정도 가능하다. (char name[10]은 문자열이기 때문에 strcpy함수를 써줘야한다.)
이렇게 scanf로 각각 멤버를 입력받을 수도 있다.
만약 구조체의 이름(태그)가 없다면 구조체 형 선언과 동시에 변수선언을 해줘야 한다.
하지만, 이름을 안쓰는 경우는 거의 없다.
구조체를 멤버로 가지는 구조체
int,double,char형을 멤버로 가질 수 있듯이 구조체를 멤버로 가질수도 있다.
이 코드를 보면 구조체 student 안에 struct date dob변수가 들어있다.
구조체 박스 안에 다른 구조체 박스가 있는 형태이다.
만약 이 구조체 안에 구조체의 멤버를 꺼내고싶다면, 큰 상자부터 순서대로 접근하면 된다. 위에서처럼 struct student s1변수 앞에 dob안에 year을 접근하려면
s1.dob.year 로 접근해주면 된다.
구조체 변수의 대입과 비교
같은 구조체 형 변수끼리 대입은 가능하지만 비교는 불가능하다.
하지만 멤버끼리는 비교가 가능하다.
예시를 보자면
이렇게 구조체에 구조체를 대입 할 수 있고, 비교는 구조체의 멤버끼리 비교를 할 수 있다.
다음 글에서는 구조체 배열과 구조체 포인터,구조체 함수등에 대해서 알아볼것이다.
제 공부하는 블로그여서 혹시 틀린부분이 있다면 지적해주시면 감사하겠습니다!
'학과 공부 > C & C++' 카테고리의 다른 글
[C++] fill 함수에 대해 알아보자 (0) | 2024.02.22 |
---|---|
포인터배열과 배열포인터 예제,이중포인터 예제 배열과 포인터[C프로그래밍] (2) | 2023.11.18 |
포인터의 활용(1)[C프로그래밍] (0) | 2023.11.17 |
union,enum,typedef[C프로그래밍] (0) | 2023.11.14 |
구조체(2)[C프로그래밍] (1) | 2023.11.03 |