본문 바로가기

c언어

사용자 정의형 자료형 - 공용체와 열거체

구조체가 끝났고 공용체와 열거체가 남아있다. 별거 없고 특히 공용체는 과거 열악한 메모리 상황에서나 쓰이던 것이라 직접 쓸 일이 거의 없다. 몰라도 무방하다고 생각한다. 그래도 배웠으니 적어는 둔다.

 

빠르게 가보자

 

공용체

 

한 데이터 공간을 공용으로 사용하겠다는 의미이다. 설명하기 힘드니 직접 보여주겠다.

union 공용체명{
	멤버변수1;
    멤버변수2;
    멤버변수들;
    ...
};

혹은

typedef union{
	멤버변수1;
    멤버변수2;
    멤버변수들;
    ...
}공용체명;

위와같이 union으로 공용체를 선언 할 수 있다.

이전 구조체와 마찬가지로 두개중 하나만 사용해야 하며 두개는 같은 의미이다.

 

예를 들어, 만일 어떤 숫자를 받을 예정이지만, 그숫자가 어떤 크기인지, 정수인지 실수인지 모른다고 가정해보자.

union number{
	short sTemp;
    int iSrc;
    float fDest;
    double dobl;
};

 

test라는 이름의 공용체를 만들었고 그 안에 short와 int, float, double이 모두 들어있다.

그런뒤 

number temp;

temp라는 number공용체를 만들었다.

현재 이 temp는 값이 없는 상태이다. 그러니 값을 넣어주겠다.

 

temp.iSrc = 350;

temp의 int형 자료형 iSrc에다가 350을 넣었다.

그 뒤

cout << temp.iSrc << endl;

로 temp의 iSrc의 값을 출력해보았다.

 

정상적으로 350이 나올것이다.

 

이번엔 

temp.fDest = 3.14f;

temp의 float 자료형 fDest에 3.14f를 넣어주었다.

또 그 뒤

cout << temp.fDest << endl;

로 fDest를 출력하면 또 이상없이 3.14가 출력될 것이다.

 

하지만 이상태로 아까 위에서 넣었던 iSrc값을 출력해본다면

cout << temp.iSrc << endl;

아까 넣은 350은 사라지고 이상한 값을 만나게 될 것이다.

 

이것이 공용체이다. 

멤버변수의 가장 큰 자료형의 크기만큼만 할당받아. 모든 멤버변수가 그 공간을 공유해서 사용한다. 

그래서 fDest에 값을 넣은 순간 350이라는 데이터는 float형 3.14f로 변하게 되고 이를 int의 방식으로 읽어냈기 때문에 이상한 값을 받아온 것이다.

 

화이트 보드를 생각하면 좋다.

한 공간에 내가 350이라고 적었지만 그 뒤 누군가가 3.14f라는 나는 못알아들을 방식으로 덮어적어놓은 경우이다.

 

이해가 아직 안되었더라도 괜찮다.

처음에 말했듯 이건 현재는 거의 쓰이지 않는 문법이다. 이해가 되지 않았다면 넘어가도 좋고 이해했더라도 적당히 지우자.

 

 

열거체

 

공용체와는 달리 열거체는 매우 단순하고 이해하기 쉽고 종종 사용된다.

 

열거체는 글자를 상수화하기 위해 사용된다. 일단 선언방법부터 보자.

enum 열거체명{
	글자1;
    글자2;
    글자들;
    ...
};

혹은

typedef enum {
	글자1;
    글자2;
    글자들;
    ...
}열거체 명;

뭐 방식은 위와 같기 때문에 이제 더이상 설명하진 않겠다.

 

솔직히 이거는 예시를 들 수가 없다. 하지만 견본 코드는 있어야하니 테스트열거체를 선언하겠다.

 

enum NUMBER{
	ONE;
    TWO;
    THREE;
    FOUR;
    END;
};

견본 열거체 NUMBER이다. 왜 모두 대문자냐 하면 열거체임을 구분하기 위해 통상적으로 사용한 규칙이라고 한다.

뭐 소문자 써도 상관은 없다.

END도 사실 없어도 되지만, 배열을 선언하거나 할때 최대값이 종종 쓰이는 경우가 많아서 보통 적는편이다.

 

그리고 열거체는 구조체와 공용체처럼 선언할 필요 없이 그냥 열거체 내의 글자를 쓰면 바로 해당 숫자로 치환된다.

 

즉 코드 중 아무곳에서나

cout << ONE << endl;

이라고 한다면 그 값인 0이 나온다.

 

왜 one인데 0이 나오느냐?? 라고한다면 어쩔 수 없다. 컴퓨터는숫자를 0부터 센다.

그리고 그 뒤 TWO는 1이고 그렇게 나열된 순서대로 1씩 증가한다.

 

만일 ONE이 0인게 불편하다면 다음과 같이 하면 된다.

enum NUMBER{
	ONE=1;
    TWO;
    THREE;
    FOUR;
    END;
};

이러면 자연스럽게 ONE=1이 되고 그 뒤인 TWO는 2가 된다. 속이 편안해졌다.

 

만약 중간에 몇개의 값을 뛰어넘고 싶다면 다음과같이 선언하면 된다.

enum NUMBER{
	ONE=1;
    TWO;
    THREE;
    FOUR;
    TEN=10;
    ELEVEN;
    END;
};

이렇게 하면 ONE부터 FOUR까지는 자연스럽게 1,2,3,4가 되고

TEN은 10, ELEVEN은 11이 된다.

 

 

 

이상 열거체를 마친다.

 

 

왜 공용체는 얘기 안하냐고??

아 잊어버려도 된다니깐

'c언어' 카테고리의 다른 글

동적 할당(신버전) + 메모리 관련 함수들  (0) 2023.02.07
동적 할당(구버전)  (0) 2023.02.06
사용자 정의형 자료형 - 구조체  (0) 2023.02.06
문자열  (0) 2023.02.06
이중 포인터  (0) 2023.02.05