Programming/C C++

[c/c++] 구조체, 공용체 struct, union

whitele 2021. 5. 2. 14:33
반응형

구조체 Struct

구조체는 여러 개의 변수 및 자료형을 묶어 정의하는 새로운 자료형이다. 자주 쓰면서 연관되는 자료형을 묶으려고 할 때 구조체를 사용하면 매우 유용하다 마치 우리가 사용하던 char, int 형을 쓰듯이 비슷한 것이다. 배열 역시 사용 가능하다.

 

struct person{
    char name[30];
    char birthday[8];
    int age;
}

위의 예제와 같이 구조체 정의는 위와 같고 구조체 선언은 다음과 같다.

struct [구조체 이름] [구조체 변수 이름];
struct person p1;

그런데 이대로면 구조체에 있는 멤버를 접근할 방법이 없다. 구조체 멤버에 접근하기 위해서 '.' 연산자를 사용한다.

person.name;

구조체 포인터

 구조체 포인터는 조금 다른 것이 있다. 크기는 32(64) 비트 운영체제 기준 4(8) byte이며 멤버에 접근할 때 '->' 연산자를 사용한다. 

구조체 정의의 다른 형태

typedef struct person{
    char name[30];
    char birthday[8];
    int age;
}Person;

Person p1;

 위처럼 사용하면 일반적인 자료형처럼 사용할 수 있다.

그러나 struct person p1; 형태로 선언은 할 수 없다.

메모리 구조

 구조체의 메모리 주소는 구조체 첫 멤버의 주소와 동일하다. 그리고 그 뒤로 쌓인다. 구조체 선언하면서 빈 공간은 비어 있을 수 있다. 즉 (32비트 운영체제 기준) char 자료형 하나와 int 자료형 하나를 선언했을 경우 구조체의 크기는 8byte가 할당된다. 즉 컴퓨터 word 비트 수에 맞게 할당이 된다. 이는 컴퓨터에 맞게 처리하기 위해 이런 식의 크기가 할당이 된다. 다만 통신 관련 응용 프로그램일 경우 이 공간을 없애야 한다. 

공용체 Union

공용체 역시 구조체와 마찬가지로 여러 멤버를 추가하여 사용할 수 있다. 구조체와 동일하게 typedef 선언이 가능하다. 공용체가 구조체와 유사하다고 생각할 수 있으나 메모리를 운용하는 부분에 있어서 차이점이 있다. 구조체의 메모리 할당을 보면 멤버마다 메모리를 할당받지만 공용체는 가장 큰 메모리 자료형 크기만 할당받고 공유한다.

ex

 union ex{
    longlong a1;
    long a2;
    int a3;
};

공용체의 메모리 공유

다음과 같이 메모리를 공용으로 사용하게 된다. 사실 크게 사용한 적은 없다고 느낀다. 대표적으로 두 가지 예를 들어보려 한다.

1. 메모리를 부분적으로 접근할 경우

char m[4]; 로 선언한 뒤 1byte만큼 m을 조정하여 구간 비트를 볼 수 있다. 

2. 모드를 나눌 경우

char m1;

int m2;

m1을 쓰는 경우와 m2로 쓰는 경우로 나뉘는 경우 공용체를 사용한다.

 

공용체를 2가지 멤버 모두 값으로 사용할 경우 데이터의 침범이 발생할 수 있어 공용체의 사용을 조심해야 한다. 공용체의 사용은 메모리의 절약 효과도 있으나 사실 현재에는 미미하다. c언어 초기에는 유용했을 것이나 근래의 컴퓨터에서 메모리는 사실상 넉넉하기에 구조체를 쓰는 편이 훨씬 좋다고 생각한다.

728x90
반응형