본문 바로가기
C

struct 구조체 (C언어 데이터 타입)

by yororing 2024. 8. 9.

00 개요

  • 구조체에 대한 용어와 개념 소개, 정의 및 선언 방법 정리 

01 구조체란

1. 정의

  • C 언어에서 구조체(struct)안, 타입이 다른 데이터를 하나로 묶을 수 있는 데이터 타입
  • 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입
  • 구조체는 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현 가능
  • 이때 구조체를 구성하는 변수를 구조체의 멤버(member) 또는 멤버 변수(member variable) 또는 필드 (field)라고 함

2. 배열과의 비교

  • 배열 (array): 같은 타입의 변수 집합
  • 구조체 (struct): 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것

02 구조체 정의 및 선언

1. 정의 방법

  • struct 키워드 사용
struct 구조체이름
{
    멤버변수1의타입 멤버변수1의이름;
    멤버변수2의타입 멤버변수2의이름;
    ...
};
  • 예시: book이라는 이름의 구조체 정의하기

  • 설명:
    • struct라는 키워드를 사용하여 구조체의 시작을 알리고, 구조체 이름인 book으로 구조체를 정의
    • 중괄호 사이에 char titile[30], char author[30], int price와 같은 변수들은 book의 멤버 변수들
    • 마지막 세이콜론은 구조체 정의를 종료한다는 의미
    • 이렇게 정의된 book 구조체는 사용자 정의 자료형이라고 함

2. 선언 방법

  • 한 번 정의된 book이라는 구조체는 다음과 같이 구조체 변수로 선언하여 사용 가능함
struct 구조체이름 구조체변수이름;
  • 예시: book이라는 이름의 구조체 선언하기
struct book my_book;

3. 정의 및 선언 동시에 하는 방법

  • 구조체의 정의와 구조체 변수의 선언을 동시에 할 수 있음
struct 구조체이름
{
    멤버변수1의타입 멤버변수1의이름;
    멤버변수2의타입 멤버변수2의이름;
    ...
} 구조체변수이름;
  • 예시: book이라는 이름의 구조체 정의 및 book 구조체의 타입을 가진 my_book 구조체 변수 선언하기
struct book
{
    char title[30];
    char author[30];
    int price;
} my_book;

4. typedef 키워드 사용하여 선언하기

  • typedef 키워드는 이미 존재하는 타입에 새로운 이름을 붙일 때 사용
  • 보통 구조체 변수를 선언하거나 사용할 때에는 매번 struct 키워드를 사용하여 구조체임을 명시해야 함
  • 하지만 typedef 키워드를 사용하여 구조체에 새로운 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됨
typedef struct 구조체이름 구조체의새로운이름;
  • 예시:
typedef struct book TEXTBOOK;
  • 예시: 구조체의 정의와 typedef 선언을 동시에 진행
typedef struct (구조체이름)
{
    멤버변수1의타입 멤버변수1의이름;
    멤버변수2의타입 멤버변수2의이름;
    ...
} 구조체의새로운이름;

/* 구조체의 정의와 typedef 선언을 동시에 할 때에는 구조체의 이름을 생략 가능 */
typedef struct {
    char title[30];
    char author[30];
    int price;
} TEXTBOOK;

03 구조체 접근 및 사용

1. 구조체 접근하기

  • 배열에서는 인덱스를 이용하여 배열 요소에 접근 가능하나 구조체에서 구조체 멤버로 접근하려고 할 때는 멤버 연산자(.) 사용 필수
  • note: 구조체의 주소값과 구조체의 첫 번째 멤버 변수의 주소값은 언제나 같음
구조체변수이름.멤버변수이름

/* 예시 */
my_book.author

2. 구조체 변수 초기화하기

  • 구조체 변수를 초기화할 때에는 멤버 연산자(.)와 중괄호({}) 사용
  • 이 방법 사용 시 원하는 멤버 변수만을 초기화 가능
  • 이때 멤버 변수가 정의된 순서와 초기화하는 순서는 상관이 없으며, 초기화하지 않은 멤버 변수는 0으로 초기화됨
  • 또한, 배열의 초기화와 같은 방법으로 구조체 변수를 초기화 가능
구조체변수이름 = {.멤버변수1이름 = 초깃값, .멤버변수2이름 = 초깃값, ...};

/* 예시 */
struct book
{
    char title[30];
    char author[30];
    int price;
};  

int main(void)
{
    struct book my_book = {"HTML과 CSS", "홍길동", 28000};
    struct book java_book = {.title = "Java language", .price = 30000};  

    printf("첫 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
        my_book.title, my_book.author, my_book.price);
    printf("두 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
        java_book.title, java_book.author, java_book.price);
    return 0;
}
  • 결과:
첫 번째 책의 제목은 HTML과 CSS이고, 저자는 홍길동이며, 가격은 28000원입니다.
두 번째 책의 제목은 Java language이고, 저자는 이며, 가격은 30000원입니다.
  • 예시: 구조체에 typedef 키워드를 사용하여 새로운 이름을 선언한 후 사용하기
#include <stdio.h>  

typedef struct
{
    char title[30];
    char author[30];
    int price;
}  TEXTBOOK;  
 
int main(void)
{
    TEXTBOOK my_book = {"HTML과 CSS", "홍길동", 28000};
    TEXTBOOK java_book = {.title = "Java language", .price = 30000};  
 
    printf("첫 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
        my_book.title, my_book.author, my_book.price);
    printf("두 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
        java_book.title, java_book.author, java_book.price);
    return 0;
}
  • 결과:
첫 번째 책의 제목은 HTML과 CSS이고, 저자는 홍길동이며, 가격은 28000원입니다.
두 번째 책의 제목은 Java language이고, 저자는 이며, 가격은 30000원입니다.

 

참조

  1. https://plas.tistory.com/110
  2. https://www.tcpschool.com/c/c_struct_intro
  3.  
  4.  

'C' 카테고리의 다른 글

PyList_New(size 또는 0)  (0) 2024.08.30
memset (C 메모리 초기화 함수)  (0) 2024.08.28
매크로 함수, 인라인 함수(#define, #inline)  (0) 2024.06.25
Macro (매크로)  (0) 2024.06.25
# 및 ## (C 언어 매크로 연산자)  (0) 2024.06.25