Language Study/C

[C/C++] 09 - 01 구조체 기초

지미닝 2022. 11. 23. 00:38

목차

  1. 구조체
  2. 구조체 자료형 정의 및 변수 선언 방법
  3. typedef: 자료형 별명 만들기
  4. typeof와 구조체 자료형
  5. 구조체 변수의 초기화
  6. 구조체의 메모리 구조
  7. 배열에 대한 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언어는 안되는데 현재는 가능하다. 실제 값들이 모두 복사된다고 한다.

  • 메모리의 내용이 그대로 복사
  • 허용되기는 하지만 남용하지 않아야 하며 일반적인 경우 비추천

요약