17.1 구조체
학습목표
변수가 많이 필요하면 주로 배열을 쓰지만 변수들의 자료형이 다르면 배열을 만들 수 없다. 그럴 때 구조체를 사용한다.
- 구조체 변수는 .(점)연산자(멤버접근 연산자)로 원하는 멤버의 이름을 직접 사용한다.
- 구조체는 배열, 포인터, 다른 구조체 등도 멤버로 넣어 확장할 수 있다.
- 자료형이 같은 구조체 변수는 대입 연산이 가능하며 함수의 매개변수에 쓸 수 있다.
- 구조체는 멤버의 크기를 비트 단위로 설정할 수 있다.
구조체는 다양한 자료형을 하나로 묶을 수 있는 복합 자료형이다.
구분 | 기능 | 사용 예시 |
구조체 기본 | 형 선언 | struct student { int num; double grade; } |
변수 선언 | struct student s1; | |
멤버 접근 | s1.num = 315; | |
다양한 멤버 | 배열 | strcpy(yuni.name, "서하윤"); |
포인터 | yuni.intro = "안녕하세요"; | |
다른 구조체 | yuni.pf.age = 17; | |
구조체 대입 함수에 사용 |
구조체 대입 | struct student s1, s2; s2 = s1; |
매개변수 | void func (struct student s1); | |
반환형 | struct student func (void); | |
비트 필드 구조체 | 선언 방법 | struct children { unsigned int s : 2, d : 2, p : 3; }; |
패딩 멤버 | unsigned int : 2; unsigned int : 0; |
17.1.1 구조체 선언과 멤버 사용
구조체의 형태를 컴파일러에게 미리 알려주는 형 선언을 해야 한다.
구조체 선언이 끝나면 새로운 자료형이 만들어지며 그 이후부터는 구조체의 변수를 사용할 수 있다.
struct 예약어를 사용하여 구조체의 형태를 만든다.
(예약어) (구조체 이름) { (구조체 멤버) }; 와 같은 형태로 구조체를 선언을 한다.
구조체 이름은 사용자가 적절하게 입력하여 사용하면 된다. 구조체 선언은 구조체를 구성하는 구성요소의 자료형 종류와 이름을 컴파일러에게 알려주는 역할을 하며 실제 저장 공간이 할당되는 변수 선언과는 다르다.
구조체 선언은 함수 안에도 할 수 있다. 여기서는 구조체 선언이 main 함수 위에 있으므로 프로그램 전체에서 사용할 수 있으나, 함수 안에 선언하면 그 함수 안에서만 쓸 수 있다. →함수 밖 선언이 거의 대부분 !!
새로 만든 구조체의 변수 선언은 struct student s1; 과 같이 한다.
→ 이때 비로소 저장 공간에 할당된다.
※ 각 멤버들의 공간이 메모리에 연속으로 할당되며 모든 멤버를 더한 전체 공간이 하나의 구조체 변수가 되므로 변수의 크기는 각 멤버의 크기를 더한 값이 됩니다.
선언된 구조체의 멤버 변수에 접근하기 위해서는 별도의 연산자가 필요하다 → 점(.) 연산자 사용
이렇게 하면, 멤버를 독립된 변수로 사용이 가능하다. 즉, s1 은 구조체 변수이지만, s1.num은 int형 변수가 된다.
구조체 변수의 메모리 할당 크기
구조체 변수의 크기는 바이트 얼라인먼트로 인해 시스템 마다 다를 수 있다.
바이트 얼라인 먼트 ?
- 모든 시스템을 데이터를 처리할 때 일정한 크기 단위로 메모리에 접근을 합니다. 구조체의 멤버는 다양한 자료형을 사용할 수 있기 때문에 크기가 들쑥날쑥한다. 일정한 크기 단위로 메모리에 접근하기 위해서 시스템에서 패딩 바이트(padding byte)를 넣어 멤버들을 정렬한다. 이를 바이트 얼라인먼트라고 한다.
→ 멤버의 순서에 따라 구조체의 크기가 달라질 수 있다. 그러므로 이를 고려하려 멤버를 배치하면 메모리 사용량을 줄일 수 있다.
# pragma pack(1); // 바이트 얼라인먼트를 1로 설정하면 패딩 바이트가 필요 없어진다.
- 위와 같은 방법을 사용하면 메모리를 줄일 수 있지만 데이터를 읽고 쓰는 데 시간이 더 걸릴 수 있다.
17.1.2 다양한 구조체 멤버
배열, 포인터는 물론이고 이미 선언된 다른 구조체도 멤버로 쓸 수 있다.
'C언어 공부 > 개념 공부' 카테고리의 다른 글
2024.01.18 C언어 <메모리 동적할당 학원필기> (0) | 2024.01.19 |
---|---|
2024.01.18 C언어 <메모리 동적할당 (4) 응용문제 풀이> (0) | 2024.01.19 |
2024.01.18 C언어 <메모리 동적할당 (3)> (0) | 2024.01.18 |
2024.01.18 C언어 <메모리 동적할당(2) 문제 풀이> (0) | 2024.01.18 |
2024.01.18 C언어 <메모리 동적할당(1)> (0) | 2024.01.18 |