본문 바로가기
Programming/C C++

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

by whitele 2021. 5. 2.
반응형

구조체 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
반응형

'Programming > C C++' 카테고리의 다른 글

C++ STL Set 컨테이너,멤버 함수 사용  (2) 2021.06.05
C++ STL List 컨테이너  (0) 2021.06.01
C++ STL Deque 컨테이너  (0) 2021.05.27
C++ STL Vector 컨테이너  (0) 2021.05.24
C++ 오버로딩과 연산자 오버로딩  (0) 2021.03.20

댓글