프로그래밍2008. 4. 25. 19:08
반응형
공용체, 열거형 상수, typedef문

공용체

공용체란 한개 이상의 변수가 기억장소를 공유하고 있는

구조라고 생각하시면 됨니다.

공용체는 구조체와 완전히 똑같습니다. 단 그 안의 모든 멤버 변수들이

기억장소를 공유하고 있다는 점이 다르죠.

즉 모든 멤버 변수들의 주소가 같습니다.

그러므로 어떤 멤버 변수의 내용이 바뀌면 다른 모든 멤버 변수의

내용도 바뀌게 됨니다.

공용체의 선언부터 사용까지도 모두 구조체와 같다고 보시면 되는데

단 구조체는 struct라는 키워드를 썼지만 공용체는 union이라는

키워드를 쓰고 있죠. 그러므로 특별히 선언, 사용방법 등에 대해서는

설명 드리지 않겠습니다. 10회에 나왔던 구조체의 설명만 잘 읽으셨고

그것을 잘 이해하셨다면 구지 설명이 필요 없다고 봅니다.

그럼 몇가지 예를 들어 보고 공용체에 대해선 마치도록 하죠.

두 정수 변수 a와 b를 멤버 변수로 가지고 있는

Data라는 이름의 공용체는 다음과 같이 만들면 되겠죠?


union Data
{
int a;
int b;
};

구조체와 똑같지만 단지 union이라는 키워드를 쓴 것 뿐입니다.

그럼 사용할땐 어떻게 할까요? 구조체에선 구조체 변수라는 것을

선언해 사용했는데, 이와 마찬가지로 공용체에선 공용체 변수라는 것을 선언해

사용하면 됨니다.

예를 들어 d라는 이름을 가진 위의 Data라는 공용체의 변수는


union Data d;


이렇게 선언하겠죠?

그리고 멤버 변수인 a를 10으로 바꾼다고 하면 구조체와 같은 방법으로


d.a=10;


이렇게 해 주면 됨니다.

그런데 여기서 중요한 것이 있는데, 지금 멤버 변수인 a에 10을

넣었습니다. 그렇다면 또다른 멤버변수 b에는 어떤 값이 들어갈까요?

b에도 역시 10이 들어가겠죠? 이게 구조체라면 b라는 멤버변수에는

아무 변화가 없겠지만 공용체이기 때문에 a와 b는 기억장소를 공유하고

있으므로 그렇게 되는 것이죠.

구조체처럼 공용체에도 공용체 배열과 공용체 포인터가 있는데

이건 생략해도 상관 없을것 같군요. 어차피 struct라는 키워드 데신

union이라는 키워드를 쓴다는 것 빼고는 구조체와 선언및 사용법 등이

똑같으니까요.

구조체를 잘 공부하셨다면 그리 어렵지 않으셨을 걸로 알고

이정도로 공용체 설명은 마치겠습니다.


열거형 상수

열거형 상수란 정수형 상수의 일종으로 동일한 용도로 쓰이는 상수들에게

그들을 대신할수 있는 이름을 부여하여 열거해 둔 것입니다.

열거형 상수를 만드는 방법은 다음과 같습니다.


enum [열거명] { 상수명 [= 상수값], ... } [변수, 변수, ..];


여기서 열거명은 열거해둔 상수가 어떤 상수들인지 그 상수들

전체에 대한 이름입니다.

그리고 상수명은 상수를 대신할 이름, 상수값은 그 상수명에대한 실재 값,

마지막으로 변수는 일반 변수를 선언한 것으로서 정수형(int) 변수입니다.

여기서 상수값은 생략 가능한데 생략하면 그 전에 있는 상수의 다음 값으로

지정됨니다. 예를 들어 전에 값이 100이면 그 다음 값인 101이 되죠.

그런데 그 전에 있는 상수가 없을때 즉 처음일때는 0이 됨니다.

그리고 열거명과 변수들도 생략해도 됨니다.

그럼 예를 들어 다음과 같은 열거형 상수가 있다고 합시다.


enum NUMBER { ZERO, FIRST, SECOND, THIRD, FORHT, FIFTH };


이렇게 열거형 상수를 만들고 나면 프로그램 내에서

0대신 ZERO를 1대신 FIRST를.... 이렇게 사용할수 있습니다.

그리고 열거형 상수를 만들때 열거명은 생략 가능하므로


enum { ZERO, FIRST, SECOND, THIRD, FORHT, FIFTH };


이렇게만 해도 됨니다.

또한 위와 같은 열거형 상수를 만들면서 변수 a, b를 선언하려면


enum NUMBER { ZERO, FIRST, SECOND, THIRD, FORHT, FIFTH } a, b;


이렇게 하면 됨니다. 이때 선언된 a, b는 정수형(int) 변수입니다.

그러므로


enum NUMBER { ZERO, FIRST, SECOND, THIRD, FORHT, FIFTH };
int a, b;

이렇게 하는 것과 똑같은 것이죠.

마지막으로 어떤 프로그램에는


enum 열거명 변수명[, 변수명, ...];


이렇게 선언된 변수가 있습니다.

이것은 일반 정수형(int) 변수와 완전히 똑같습니다.

그러니까 위와나온 NUMBER라는 열거형 상수가 만들어져 있을때


enum NUMBER a, b, c;


이렇게 한 것은


int a, b, c;


이것과 똑같은 의미 입니다.


타입 만들기

C언어에는 여러가지 데이터 타입 키워드 들이 있습니다.

int, char, float, double등이 있죠?

이런건 그냥 쓰기에 불편한 점이 없습니다.

하지만 unsigned short int형태의 데이터를 많이 써야 한다고 합시다.

그럴때는 너무 길어서 쓰기가 지겨워 지죠.

이걸 간단히 쓰는 방법이 있는데 방법은 unsigned short int와

똑같은 형태의 데이터 타입을 새롭게 만들어 주는 것이죠.

이렇게 새로운 데이터 타입을 만들때 쓰는 것이 typedef입니다.

그럼 사용 방법을 알아보죠. 사용은 다음과 같이 합니다.


typedef 기존타입 새로운타입;


예를 들어 unsigned short int와 똑같은 형태의 word라는 데이터

형태를 만들려면


typedef unsigned short int word;


이렇게 해 주면 됨니다.

그러면 프로그램 내에서


unsigned short int a;


이거 대신


word a;


이렇게만 해 주어도 됨니다.

그리고 typedef로는 구조체를 데이터 타입으로 만들어 줄 수가 있습니다.

저번에 구조체를 설명할때 구조체는 데이터 타입을 새롭게 만드는 것이라고

생각하시면 된다고 했는데 그것이 진짜로 새로운 데이터 타입을 만든것은

아닙니다. 하지만 typedef를 쓰면 진짜로 새로운 데이터 타입을 만들수

있게 되는 것이죠.

예를 들어 Student라는 구조체가 있다고 합시다.

그때


typedef struct Student StudentType;


이렇게 해 주면 Student라는 구조체를 StudentType라는 이름의

데이터 타입으로 만들어 준 것입니다.

그러면 프로그램에서


struct Student s;


이렇게 할 것을 단지


StduentType s;


이렇게만 해 주면 됨니다.

공용체 역시 구조체와 마찬가지로 데이터 타입을 만들수 있습니다. 
반응형

'프로그래밍' 카테고리의 다른 글

break와 continue  (0) 2008.04.25
argc, argv에 대해..  (0) 2008.04.25
C언어에서 실수형의 출력 내용이 정확하지 않은 이유  (0) 2008.04.25
전처리기  (0) 2008.04.25
조건부 컴파일  (0) 2008.04.25
Posted by pmj0403