구조체(structure type)

하나 이상의 변수를 그룹 지어서 새로운 자료형(복잡한 데이터 표현)을 정의하는 것

  • 사용자 정의 자료형 - 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있음
  • 배열은 같은 타입의 변수 집합이지만 구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것
  • 구조체의 구성 : 구조체의 멤버(member) / 멤버 변수(member variable)

구조체 정의와 선언

구조체 정의와 선언

형식

struct 구조체이름{
    멤버변수1의 타입 멤버변수1의 이름;
    멤버변수2의 타입 멤버변수2의 이름;
}
struct 구조체이름{
    멤버변수1의 타입 멤버변수1의 이름;
    멤버변수2의 타입 멤버변수2의 이름;
} 구조체 변수 이름; // 구조체 선언

구조체 멤버 접근

  • 멤버 : 접근 연산자(.)를 사용하여 구조체에서 구조체 멤버로 접근할 수 있음
  • 형식 : 구조체변수이름.멤버변수이름

구조체 변수 초기화

  • 멤버 연산자(.)와 중괄호({})를 사용하여 구조체 변수를 초기화할 수 있음
  • 형식 : 구조체변수이름 = {.멤버변수1이름 = 초기값, .멤버변수2이름 = 초기값, …};

typedef문

  • 어떠한 자료형 이름에 대해 새 이름을 부여하는 목적으로 사용
    • 이미 존재하는 int, float등과 같은 자료형을 사용자가 자유롭게 정의할 수 있음
    • 구조체에 새로운 이름을 선언하면 매번 struct 키워드를 사용하지 않아도 됨
  • 형식 : typedef struct 구조체 이름 구조체의 새로운 이름;
    • e.g.) typedef struct student STD;

구조체의 구현 예

구조체의 정의, 선언, 초기화를 통한 멤버를 출력하는 프로그램

#include<stdio.h>
typedef struct{
    char name[20];
    int age;
    int weight;
} STD;

int main(){
    STD s1 = {"Hong gil dong", 30, 65};
    STD s2 = {.name = "Lee sun sin", .age = 45, .weight = 60};

    printf("첫 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n", s1.name, s1.age, s1.weight);

    printf("두 번째 학생의 이름은 %s이고, 나이는 %d이며, 몸무게는 %d입니다.\n", s2.name, s2.age, s2.weight);

    return 0;
}

실행 결과

첫 번째 학생의 이름은 Hong gil dong이고, 나이는 30이며, 몸무게는 65입니다.
두 번째 학생의 이름은 Lee sun sin이고, 나이는 45이며, 몸무게는 60입니다.


범용 리스트(generalized list)

유한개의 순서가 있는 노드 또는 리스트들로 구성된 집합

  • S = (x1, x2, x3, ……, xn)
    • S = 리스트의 이름, n = 리스트의 길이, 원소 xi = 원자(노드) 또는 리스트
    • A = (a, (b, c)) // 리스트의 길이 = 2
    • S = ((a, b, c), d, (e, f), (), A)
    • T = (A, A, A, A)

활용 예

  • 다변수로 구성된 다항식의 표현 - A(x, y, z) = 4x3 + 3x2 + 2 + 5y + 7z3
  • 희소행렬
  • 특정 PC에서 특정 Web browser를 사용한 기록
    • tab별 기록, jump한 기록

용어

  • 공백리스트(empty list, 0, nil) => S = ()
  • 부분리스트(sublist) => 임의의 주어진 리스트가 다른 리스트의 노드 또는 리스트
  • 헤드(head)
    • 임의의 주어진 리스트에서 첫 번째에 있는 리스트를 말함
    • n ≥ 1인 경우 첫 번째 원소 = X1 <= head(S)
  • 테일(tail)
    • 임의의 주어진 리스트에서 첫 번째 원소를 제외한 나머지 원소를 말함
    • 리스트 = (X2, … Xn) <= tail(S)
  • 순환 리스트(recursive list)
    • 임의의 주어진 리스트의 항목이 동일한 부분리스트인 경우를 말함
      • C = (a, C) => 길이가 2인 순환리스트
      • 두 번째 원소 C => 무한리스트 (a, (a, (a, …)에 대응