C언어 구조체 typedef 이용 선언 방법
이번 글에서는 C언어에서 구조체 선언 시 struct를 앞에 붙이지 않고도
편리하게 사용할 수 있는 typedef를 이용한 선언 방법에 대해서
살펴보도록 하겠습니다.
구조체 선언 단계에서 struct를 앞에 붙이지 않는다는 것은
다음과 같이 편리하게 선언이 가능하다는 것을 의미합니다.
만일 여러개의 같은 구조체를 선언하는 경우에는
아래쪽의 선언 방식이 더 편리할 것으로 예측됩니다.
아래의 선언 방식을 적용하기 위해서는 typedef struct를 이용해서
구조체 양식을 정해주면 되는데요.
아래와 같은 양식으로 구조체를 정의해주시면 됩니다.
#include <stdio.h>
int main(){
typedef struct _Book { // 구조체 자체의 변수 이름은 _Book
// 구조체 멤버 정의(문자열, 정수, 실수 등...)
char title[30];
int price;
char author[25];
int sales;
} Book ; // 앞으로 Book이라는 이름으로 사용(별칭) -> 필수부분
}
맨 앞 부분에 struct 앞에 typedef가 적힌 것 말고는 특이사항은 없어보입니다.
다만, typedef를 사용할 경우는 일반 struct와는 다르게
맨 아래 부분이 변수 선언이 아닌 별칭 지정의 기능에 해당하고,
이 별칭 지정 부분이 반드시 들어가야 함에 유의해주세요.
예를 들어, 아래와 같이 별칭을 지정해주지 않고는 사용이 불가능합니다.
typedef struct _Book {
char title[30];
int price;
char author[25];
int sales;
} ; // 오류 발생(별칭 없으면 컴파일 에러)
typedef 선언 구조체 선언 및 멤버 변수 접근
typedef를 이용한 선언 방식에서도 멤버 변수에 접근하는 방식은
일반 struct를 이용하여 구조체를 정의한 경우와 크게 다르지는 않습니다.
문자열 자료형을 할당할때는 strcpy 함수 등을 사용해서 간접적으로
할당해야한다는 점에 유의해주세요.
객체이름.멤버변수이름 형태로 값 할당 및 접근을 해주시면 됩니다.
#include <stdio.h>
#include <string.h>
int main(){
typedef struct _Book { // 구조체 자체의 변수 이름은 _Book
// 구조체 멤버 정의(문자열, 정수, 실수 등...)
char title[30];
int price;
char author[25];
int sales;
} Book ; // 앞으로 Book이라는 이름으로 사용(별칭)
// struct를 붙이지 않고 선언
Book romeo_juliet;
// 구조체 멤버 값 할당(string 자료 주의)
// romeo_juliet.title = "Romeo and Juliet" 식으로는 불가능
strcpy(romeo_juliet.title, "Romeo and Juliet");
romeo_juliet.price = 13000;
strcpy(romeo_juliet.author, "Shakespeare");
romeo_juliet.sales = 10000000;
// 구조체 멤버 값 접근도 동일
printf("title : %s\n", romeo_juliet.title);
printf("price : %d\n", romeo_juliet.price);
}
typedef 익명 구조체
typedef를 이용한 구조체 정의 방식에서는 앞에서 별칭이 반드시 포함되어야한다고
언급한 적이 있습니다.
대신, 이 경우에는 구조체의 본 이름은 생략되고 별칭만 있는 익명 구조체 형태로도
사용이 가능하다는 것을 알아두시면 유용합니다.
익명 구조체는 아래와 같은 방식으로 사용해주시면 됩니다.
typedef struct { // 구조체 자체의 변수 이름 생략(익명 구조체)
char title[30];
int price;
char author[25];
int sales;
} Book ; // 별칭만 사용하여 정의
typedef struct 뒤에 아무 이름도 붙지 않고 구조체가 정의된 것을 확인할 수 있습니다.
위와 같이 사용하더라도 구조체 사용 및 멤버변수 접근 과정에는 전혀 지장이 없습니다.
'C & C++' 카테고리의 다른 글
C언어 포인터를 input으로 받는 함수 선언 (pass by pointer) : swap 함수 예제 비교 (0) | 2021.12.20 |
---|---|
C언어 실수 자료형 정리 : float, double, long double, 부동소수점/형변환 (0) | 2021.12.16 |
[C언어] switch ~ case 문 사용법, 유의 사항 정리 (0) | 2021.12.15 |