본문 바로가기

C Langauage

Chapter 11. 구조체(Struct)

Chapter 11. 구조체(Struct)
1. 구조체
 - 구조체
  ‧ 서로 다른 데이터형의 변수들을 하나로 묶어서 새로운 데이터형을 정의하는 것
  ‧ 배열과 다른 점은 배열은 연속된 같은 데이터형의 변수를 하나로 묶어서 사용하는 데이터형인 반면, 구조체는 서로 다른 데이터형의 변수를 하나로 묶어서 사용하는 데이터형이다.
  ‧ 기본 데이터형을 사용해 새로 만드는 데이터형이므로 사용자 정의 데이터형이라고 한다.
  ‧ 구조체도 중첩사용이 가능하다.
  ‧ 구조체 정의

 struct tagname{
         char string[10];
         int num;
 };

  ◦ 구조체는 main 함수 이전에 정의를 하며 함수 정의와 같이 세미콜론(;)을 끝에 붙인다.
  ◦ 멤버변수는 초기값이 할당 불가능하다.
  ◦ 멤버변수들은 구조체 변수가 선언될 때 메모리가 할당된다.
  ‧ 구조체 선언

 struct tagname s1;
 

 

 

 struct tagname{
         char string[10];
         int num;
 }s1, s2;

  ◦ 구조체 변수를 선언하는 방법은 일반 변수를 선언하는 방법과 같다.
  ◦ 구조체를 정의하면서 구조체 변수를 선언하는 것도 가능하다.
  ◦ 요소 하나하나에는 점(.) 연산자를 사용해 접근한다.
  ◦ typedef

     ▹  데이터형을 새로운 이름으로 정의하는 명령어

 struct tagname{
         char string[10];
         int num;
 };

 typedef struct tagname TAG;

 typedef struct tagname{
         char string[10];
         int num;
 }TAG;

   ▹ typedef를 이용하면 원래 데이터형 이름과 새롭게 정의한 데이터형을 모두 사용할 수 있다.
   ▹ 주로 데이터형의 이름이 너무 길어 사용이 불편할 때 사용한다.
  ‧ 구조체 멤버 접근

 s1.string = “c언어”;
 s1.num = 10;

  ◦ 멤버 변수에 접근하기 위해서는 점(.) 연산자를 사용해 접근하는데 구조체명에 점(.) 연산자를 쓰고 멤버변수 이름을 쓰면 접근할 수 있다.
  ◦ (.) 연산자를 사용해 접근해 초기화를 하는 것도 가능하다.
  ‧ 구조체 변수의 초기화

 TAG s1 = {c언어, 10}; 

 s1.string = “c언어”;
 s1.num = 10;

  ◦ 구조체 변수도 선언 시 초기화하지 않으면 쓰레기 값을 갖는다.
  ◦ 멤버변수 초기화 방법은 배열과 같이 중괄호({})나 멤버변수 하나하나에 접근하는 방법이 있다.
  ◦ 같은 구조체형의 변수끼리는 서로 초기화나 대입이 가능하다.

 

2. 구조체 활용
 - 구조체 배열

 TAG str[3];
 str[0].string = c언어;

 ……

  ‧ 구조체로도 배열을 선언해 사용할 수 있다.
  ‧ 구조체 배열의 초기화 시 다차원 배열처럼 각각의 초기화 값을 중괄호를 중첩시켜 묶어서 표현한다.
  ‧ 멤버 변수에 접근할 때는 대괄호([])를 이용해 인덱스 번호를 지정한 후 점(.) 연산자로 멤버로 접근한다.
  ‧ 구조체 배열의 메모리 구조

  

 - 구조체 포인터

 TAG s1 = {c언어, 10};
 TAG * ps1 = &s1;

 (*ps1).num = 20;
 ps1->num = 20;

  ‧ 구조체의 주소를 저장하는 포인터
  ‧ 구조체 포인터로 구조체 멤버 변수를 접근할 때는 포인터(*) 연산자와 점(.)연산자 또는 간접 멤버 접근 연산자(->)를 사용한다.
  ‧ 간접 멤버 접근 연산자(->)
  ◦ 구조체 포인터로 구조체의 멤버 변수를 접근할 때 사용하는 연산자
  ◦ 구조체 포인터에서만 사용된다.
 - 비트필드

 struct bitfield{
         int num1 : 6;
         int num2 : 5;
         int num3 : 4;
 };

메모리 할당

  ‧ 2바이트나 4바이트 크기의 데이터형(short, int 등)을 비트 단위로 나누어 사용할 수 있게 하는데 이때 비트 수를 정해 사용할 수 있게 된다.
  ‧ 비트 필드를 정의할 때는 멤버 이름 다음에 콜론(:)을 쓰고 비트 수를 기입하면 된다.
  ‧ 비트 필드를 이용하면 데이터의 크기를 최소화 할 수 있다.
  ‧ 첫 번째 멤버를 최하위 비트(least significant bit ; lsb)에서부터 할당해 최상위 비트(most significant bit ; msb)이내에 할당된다.
  ‧ 비트 필드 멤버는 정해진 비트로 값을 표현하므로 표현 가능한 범위를 넘어서는 값을 저장하면 오버플로우가 발생한다.
    ※ 오버플로우(Over flow) : 변수의 데이터형의 크기에 따라 유효 범위가 있는데 이 유효범위를 넘어가 처음부터 다시 수를 시작하는 논리 오류
 - 구조체 연산
  ‧ 구조체 변수도 멤버 대 멤버의 복사로 대입 연산이 가능하다.
  ‧ 사칙연산은 허용되지 않지만 필요하다면 함수를 정의해서 사용한다.
  ‧ 구조체 변수도 Call-by-Value 방식을 이용한 함수와 Call-by-Reference 방식을 이용한 포인터 함수를 이용해 값을 전달한다.

 

3. 공용

 union data{
         unsigned int num;
         unsigned char ch[4];
 }

 - 멤버 변수들이 모두 같은 주소에 할당되어 메모리를 공유하는 데이터형
 - 구조체와 같은 사용자 정의 데이터형이다.
 - 정의, 선언, 각 멤버 변수의 접근 방법은 구조체와 같다.
 - 공용체 변수를 메모리에 할당하면 공용체의 멤버들이 모두 같은 주소에 할당된다.
 - 공용체의 크기는 공용체 멤버중 가장 큰 멤버의 크기와 같다.
 - 현재는 잘 사용되지 않는다.

 

4. 열거체

 enum sequence{num1, num2, num3}

 - 정수형의 일종으로 변수가 가질 수 있는 값을 열거 상수로 나열하는 데이터형
 - 구조체와 같은 사용자 정의 데이터형이다.
 - 열거형이라고도 하고, 정수형의 일종이기도 하다.
 - {}안에 나열하는 이름을 열거상수라고 하는데 정수형 상수로 처리된다.
 - 변수이름만 문자이고 실체로는 0부터 시작해 1씩 증가하는 정수형 상수로 정의된다.


'C Langauage' 카테고리의 다른 글

Chapter 13. 파일 입출력  (0) 2015.08.05
Chapter 12. 포인터 고급  (0) 2015.08.05
Chapter 10. 전처리기(Preprocessor)  (0) 2015.08.05
Chapter 9. 문자열(String)  (0) 2015.08.05
Chapter 8. 포인터(Pointer)  (0) 2015.08.05