목차
- 구조체
- 구조체 자료형 정의 및 변수 선언 방법
- typedef: 자료형 별명 만들기
- typeof와 구조체 자료형
- 구조체 변수의 초기화
- 구조체의 메모리 구조
- 배열에 대한 Assignment 연산
1. 구조체 : 여러 자료형의 연속된 변수들로 구성된 집합체
✓ 구조체는 왜 쓰는가?
→ 여러 자료를 개별적으로 다루기 보다 한 곳에 모아서 관리하면 편하니깐!
✓ C의 구조체 구조
- 하나 이상의 멤버(Member)/필드(Field) 변수 들로 구성
- 각 멤버/필드 변수들은 서로 다른 자료형을 가질 수 있다
※ 구조체는 일종의 자료형(Type)이다.
- 구조체 선언은 새로운 자료형을 정의하는 것으로 변호 선언과는 다르다
- 새로운 자료형의 이름은 "struct name" 이다
2. 구조체 자료형 정의 및 변수 선언 방법
방법 ①
※ 구조체 변수의 선언
- 자료형의 이름: struct student
- 구조체 이름 앞에 struct 덧붙임
구조체 변수의 사용 : 구조체 변수에 포함된 멤버 변수에 접근하기 위해서는 점 연산자를 사용!
구문 형식 : 구조체변수.멤버명
방법 ②
다음 A, B, C개의 코드는 결과적으로 동일하다
A: 구조체 자료형의 정의 및 선언과 해당 구조체 변수 선언을 분리한 것이다.
B: 구조체 자료형의 정의 및 선언과 해당 구조체 변수 선언을 동시에 한 것이다. (A에 비해 간결하다)
C: 구조체의 이름을 제거한 것이다. (잘 쓰이지 않는다)
3. typedef: 자료형 별명 만들기
typedef: declare an identifier as a type alias, to be used to replace a possibly complex type name
✓ 복잡한 type 이름을 간단히 표시하기 위해 주로 사용한다
- line 3은 unsigned int 라는 type에 unit32라는 새로운 별명을 부여
- 포인터에도 적용 가능: line 4 는 int* 에 pint32는 별명을 부여
- 배열에 대해서도 적용 가능
- 배열 요소 수가 3개인 정수 배열에 aint3이라는 별명을 부여
4. typedef와 구조체 자료형
구조체 자료형 변수 선언은 구조체 이름 앞에 struct 덧붙여 변수를 선언하므로 번거롭고 코드도 복잡해보인다.
✓ typedef로 구조체 자료형에 간단한 이름을 부여
- struct student라는 복잡한 자료형을 STUD라는 간단한 이름으로 표현
- 구조체 자료형 변수/매개 변수가 자주 쓰일 경우 널리 쓰이는 방법이다.
- line 14, line 15의 s1과 s2는 같은 자료형이다
- 선언 시 사용한 자료형의 이름만 다른 것이다
5. 구조체 변수의 초기화
- 배열의 초기화와 유사하다.
- 멤버/필드 변수의 자료형과 초기화하는 값의 자료형은 일치하여야 한다
6. 구조체의 메모리 구조
구조체의 메모리 구조
- 구조체의 멤버들이 선언된 순서대로 연속하여 메모리 공간을 차지한다
- 각 멤버들은 자신의 자료형에 해당하는 메모리 공간을 차지
동일한 멤버 변수라도 순서가 다르다면 메모리 크기가 다르다.
이러한 차이의 원인은?
- Word Alingment: 특정 자료형의 저장 위치 정렬
- double 형 (멤버) 변수의 경우 0x00000?에서 ?이 0이나 8인 주소에서만 저장될 수 있다
- int 형은 0, 4, 8, C인 주소에만 저장 가능
8. 배열에 대한 Assignment 연산
- 배열(이름)은 대입(Assignment) 연산의 좌측에 올 수 없다
- c언어는 배열 자료형에 대한 대입 연산을 지원하지 않는다
- 문자열도 문자형 배열이며 따라서 대입을 통한문자열 복제가 되지 않는다.
- vs Python
M1 = "HELLO"
M2 = M1
print(M2)
✓ 구조체 변수에 대한 Assignment을 할 수 있을까?
원래 C언어는 안되는데 현재는 가능하다. 실제 값들이 모두 복사된다고 한다.
- 메모리의 내용이 그대로 복사
- 허용되기는 하지만 남용하지 않아야 하며 일반적인 경우 비추천
요약
'Language Study > C' 카테고리의 다른 글
[C/C++] 09 - 03 구조체 배열과 포인터 (0) | 2022.12.03 |
---|---|
[C/C++] 09 - 02 구조체 변수와 함수, 포인터 (0) | 2022.11.24 |
[C/C++] 08 - 02 배열, 문자열과 포인터 (0) | 2022.11.21 |
[C/C++] 08 - 01 POINTER 기초 (0) | 2022.11.09 |
[C/C++] 07 - 03 함수와 Modular Programming (0) | 2022.11.02 |