언어 자료구조 알고리즘/C 언어 문법

7.사용자 정의 형식 - 구조체, 공용체, 열거형

언제나휴일 2009. 8. 19. 05:47
반응형
7.사용자 정의 형식 - 구조체, 공용체, 열거형

 

 

다루는 내용

   - 구조체

   - 공용체

   - 열거형

   - typedef 

   - Byte Order

 

 사용자 정의 형식은 프로그램 개발자가 구현 목적에 따라 정의하는 형식을 의미한다.

 

사용자 정의 형식(UDT)
구조체(struct) 멤버 사이즈의 합 + padding
공용체(union) 제일 큰 멤버 사이즈 bytes

 

1. 구조체

 구조체는 여러 개의 멤버를 하나로 묶어 사용하는 형식이다.  가령, 학생 관리 프로그램에서 한 명의 학생의 데이터로 학번, 이름, 학년 등을 관리해야 한다고 할 때 학번들을 따로 관리하고, 이름을 따로 관리하고 학년을 따로 관리하는 것은 비효율적인 관리가 될 수 있다.  학생이라는 형식을 정의를 해서 학생들을 관리를 하면 좀 더 나을 수 있을 것이다.

 

비교  

 구조체를 사용하지 않는 부분은 DemoA이고 사용하는 부분은 DemoB이다.

 

다음은 공통적으로 사용할 열거형과 상수이다. 

 

- 데이터 선언부 

DemoA

  구조체 정의 구문은 없다.

변수는 이름들을 관리하는 names,  번호들을 관리하는 snums, 학년들을 관리하는 grades,

           현재까지 등록된 학생 수 usage

DemoB

   _Stu 구조체와 _DemoB 구조체를 정의하고 Stu, Demo로 형식명을 정의하였다.

 Stu 형식에는 한 학생의 데이터를 관리할 수 있게 정의하였고

 Demo에는 학생들을 관리할 수 있게 하였다.

 변수로는 DemB 형식의 demob하나이다. 

 

 데모는 학생 두 명의 데이터를 입력하여 전체 출력하는 내용으로 하였다. 

 

- 데모 시작함수 

DemoA

 

DemoB 

 

- 학생 한명의 데이터 추가하는 함수

DemoA 

 

DemoB 

 

- 학생 한 명의 데이터를 Setting하는 함수

DemoA 

 DemoB

 

 

-보관된 전체 학생 데이터 출력하는 함수

DemoA 

 

DemoB 

 

2. 공용체

공용체는 여러 멤버중에 하나의 멤버를 사용할 수 있게 하는 형식이다.  즉, 공용체 내의 여러 멤버 중에 메모리 크기가 제일 큰 멤버 만큼만 할당을 하게 된다.   가령, 회원 관리 프로그램에서 기본 정보(이름, 아이디)만 입력하면 준회원, 주소를 추가로 입력하면 정회원이라 하자.  해당 프로그램에서 회원에 관련된 기능을 작성을 하고자 할 때 회원 기능을 정의하는 곳에서는 종류별로 기능을 정의를 하게 될 것이다.  하지만, 해당 기능을 사용하는 곳에서는 회원 종류에 상관없이 사용할 수 있다면 좀 더 나을 것이다.

  

Look and Think and Feel

 

공통

#define MAX_MNAME_LEN 20
#define MAX_ID_LEN  50
#define MAX_ADDR_LEN 100

 -준회원

PreMember.h

typedef struct _PreMember PreMember;
struct _PreMember
{
    char name[MAX_MNAME_LEN+1];
    char id[MAX_ID_LEN+1];
};

 

PreMember.c

void PreMemberView(PreMember *pthis)
{
    printf("이름:%s 아이디:%s\n",pthis->name,pthis->id);

}

 

 

-정회원

RealMember.h

typedef struct _RealMember RealMember;
struct _RealMember
{
    PreMember pre;
    char addr[MAX_ADDR_LEN+1];
};

 

RealMember.c

void RealMemberView(RealMember *pthis)
{
    PreMemberView(&(pthis->pre));
    printf("주소:%s\n",pthis->addr);
}
 

 

-회원 

Member.h

typedef enum _TypeMember TypeMember;
enum _TypeMember
{
    MEM_PRE,
    MEM_REAL
};

typedef union _MemberInfo MemberInfo;
union _MemberInfo
{
    PreMember  premember;
    RealMember realmember;
};

typedef struct Member  Member;
struct Member
{
    TypeMember typemember;
    MemberInfo meminfo;
};

 

Member.c

void MemberView(Member *pthis)
{
 switch(pthis->typemember)
 {
    case MEM_PRE:
        PreMemberView(&(pthis->meminfo.premember));
    break;
    case MEM_REAL:
        RealMemberView(&(pthis->meminfo.realmember));
     break;
 }
}
 

 

 

 3. 열거형

열거형은 데이터 값을 미리 열거해 놓는 형식을 얘기한다.  사용자 정의 리터럴 상수로 생각해도 큰 무리가 없을 듯하다. 

앞서 얘기했듯이 C언어에서 열거형은 int형으로 취급이 되며 C++에서는 별도의 형식으로 취급을 한다.

구조체와 공용체를 보면서 Look & Feel했으리라 믿게 과감히 설명을 생략한다.

반응형

'언어 자료구조 알고리즘 > C 언어 문법' 카테고리의 다른 글

12. 증감연산자  (0) 2009.08.19
11. 산술 연산자  (0) 2009.08.19
10. 연산자  (0) 2009.08.19
9. 변수의 종류  (0) 2009.08.19
8. 변수의 선언과 초기화  (5) 2009.08.19
6.메커니즘 형식 - 배열, 포인터  (0) 2009.08.19
5.기본 형식 - 문자, 정수, 실수형  (0) 2009.08.19
4. 형식(type -자료형)  (0) 2009.08.19
3.헤더파일과 소스파일의 내용  (0) 2009.08.19
2. 프로그램 구성 요소  (0) 2009.08.19