본문 바로가기

Programming/C언어 초급

C언어 초급) 02.변수 : 07. 구조체와 사용자 정의 타입

들어가며...

이번 글에서는 변수의 마지막 형태로 구조체와 사용자 정의 타입에 대해서 알아보도록 하겠습니다. 이 외에 배열이나 포인터등의 타입이 있으나 이는 별도의 Chapter로 묶어 자세하게 설명토록 하겠습니다.

 

  • Table of Contents
    • 구조체 선언 및 예제
    • 사용자 정의 타입 선언 및 예제

구조체 선언 및 예제

구조체는 특정 대상을 표현하기 위해 여러 종류의 타입들을 묶어 대상을 표현할 때 사용하는 변수 형태입니다. 객체 지향 프로그래밍 언어에서 객체를 표현할 때 함수부를 제외한 멤버변수 선언부만을 생각하시면 됩니다. 즉, java에서 사용하는 vo, dto 클래스와 비슷합니다.

그럼 C언어에서 구조체를 선언하는 방식에 대해서 설명하면 다음과 같습니다.

 

● 구조체 선언 방법

typedef struct 구조체명 {
    멤버변수1;
    멤버변수2;
    ...
} 태그;

회원관리 프로그램을 개발한다고 가정했을 때 회원에 대한 정보를 구조체로 정의하여 사용하면 좋을 것입니다.

 

● 회원관리 프로그램의 회원에 대한 구조체 정의 예

// 회원 구조체 정의
typedef struct _MEMBER {
    char name[20];
    int  age;
    char email[30];
    char phoneNumber[16];
} MEMEBER;

// 회원 변수 선언
MEMBER member1;

// 회원의 멤버변수 접근
printf("name is %s\n", member1.name);

크게 어려운 부분은 없으리라 생각됩니다. 그럼 간단한 예제를 통해 구조체에 대해서 좀 더 익숙해 져 보도록 하겠습니다.

구구단과 관련한 문제를 보여주는 프로그램을 만들고자 합니다. 이를 위해 임의의 구구단 문제와 답을 생성한 후 해당 정보를 구조체에 담아 반환하는 함수를 정의하고 이를 출력하는 간단한 예제르 살펴보도록 하겠습니다.

 

● 예제코드

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

// 구구단 정보를 담고 있는 구조체 정의
typedef struct _MULTIPLICATION_TABLE {
    int factor1;
    int factor2;
    int product;
} MULTIPLICATION_TABLE;

// 함수 원형
MULTIPLICATION_TABLE getMultiplicationTable(void);

/**
 Main 함수
 */
int main(int argc, const char * argv[]) {

    MULTIPLICATION_TABLE multi_table = getMultiplicationTable();
    // 구구단 출력
    printf("%2d * %d = %d\n", multi_table.factor1, multi_table.factor2, multi_table.product);
    
    return 0;
}

// 임의의 구구단 정보를 생성하는 함수
MULTIPLICATION_TABLE getMultiplicationTable(void) {
    MULTIPLICATION_TABLE multi_table;
    
    // 초기화
    memset((void *)&multi_table, 0x00, sizeof(MULTIPLICATION_TABLE));
    // 난수 초기화
    srand((unsigned int)time(NULL));
    // 0 ~ 7까지의 난수 값 생성 후 2를 더함 (2 ~ 9 범위의 임의의 값이 생성되게 됨)
    multi_table.factor1 = (rand() % 8) + 2;
    multi_table.factor2 = (rand() % 8) + 2;
    // 결과값 저장
    multi_table.product = multi_table.factor1 * multi_table.factor2;
    
    return multi_table;
}

 

● 결과확인

 

난수를 발생하는 srand(), time(), rand() 함수를 제외하고는 이해하는데 크게 어렵지 않으리라 생각됩니다. 구조체에 대한 설명은 이것으로 마무리 하고 사용자 정의 타입에 대해서 알아보도록 하겠습니다.

사용자 정의 타입 선언 및 예제

프로그래밍 언어에서 개발에 필요한 자료형을 충분히 제공하지만 때로는 필요에 의해서 또는 기존의 자료형에 대해 가독성을 높이기 위해 사용자가 직접 자료형을 정의해야할 경우가 있습니다. 이럴 때 "typedef" 또는 "define"문등을 이용하여 사용자 정의 타입을 선언할 수 있습니다.

위에서 살펴본 구조체의 정의도 typedef를 사용함으로써 구조체를 하나의 변수처럼 정의하여 사용하도록 한 것입니다.  몇가지 예를 더 살펴보고 사용자 정의 타입에 대해 마무리 하도록 하겠습니다.

 

● 사용자 정의 타입 선언 예

// Boolean 타입 정의 : C언어에는 Boolean 타입이 없음
typedef enum {TRUE, FALSE} BOOL;

// #define 문을 이용한 기존 변수형 타입 재정의
#ifndef myInt
#define myInt int
#endif

#ifndef myChar
#define myChar char
#endif

#ifndef myByte
#define myByte unsigned char
#endif

// 위와 동일한 목적으로 기존 변수형 타입 재정의
typedef int myInt;
typedef char myChar;
typedef unsigned char myByte;

첫번째 예처럼 다른 언어에는 있으나 C언에는 없는 타입을 정의하여 사용할 수도 있고 기존에 있는 변수이지만 해당 프로젝트에서만 사용할 변수명 변경을 위한 용도로 정의하여 사용할 수도 있습니다.

 

✳︎ 덧붙히기

요즘은 단말도 하드웨서 성능이 좋아져 프로그래밍 환경이 쾌적한 편이지만 커널의 종류에 따라 변수의 크기가 조금씩 차이가 발생할 수도 있습니다. 이러한 경우 변수를 코드 내에서 바로 사용하는 것 보다 위와 같이 본인이 정한 변수명을 사용하는 것이 유용합니다. 커널의 환경에 따라 정의한 변수명은 그대로 사용하고 실제 변수 타입만 바꿔주면 되기 때문입니다. 

마무리...

이번 글을 끝으로 부족하지만 변수에 대해 모든 설명을 마쳤습니다. 다시 한번 말씀 드리지만 프로그래밍 언어에 따라 문법은 어쩔 수 없이 새로 배워야 하는 부분이지만 하나의 프로그래밍 언어에 대한 변수형에 대해 깊이 이해하게 되면 다른 프로그래밍 언어의 경우 변수 사용의 목적이 동일하기 때문에 변수의 타입만 공부하면 되기 때문에 새로운 프로그래밍 언어를 배우는데 도움이 됩니다.

 

 


U2ful은 입니다. @U2ful Corp.