구조체 (Structure)
구조체는 서로 다른 자료형을 갖는 데이터들을 하나로 묶어 놓은 자료형으로 내부 데이터는 사용자가 직접 필요한 것만 필요한 만큼 서로 다른 데이터를 지정하여 사용할 수 있습니다.
예를 들어, 사람에 대한 정보를 담는 데이터에는 char배열의 이름, int형의 나이, float형의 키와 몸무게 등의 여러 데이터가 필요합니다.
char name[10] = "Hyeok Jun";
int age = 20;
float height = 175;
float weight = 65;
다음과 같이 사람 정보를 담는 데이터를 하나씩 선언할 수 있지만 10개, 100개, 그 이상의 여러 사람 데이터를 생성한다고 하면 프로그램이 복잡해질 것입니다.
char name[100][10];
int age[100];
float height[100];
float weight[100];
위와 같이 한 자료형의 배열을 이용하여 표현할 수도 있습니다. 하지만 각 데이터들의 관계가 불명확하고 프로그래머가 코드를 읽는 데에도 좋지 않아 보입니다.
struct Person {
char name[10];
int age;
float height;
float weight;
};
struct Person person_ary[100];
이런 문제점들은 구조체를 사용함으로써 해결할 수 있습니다.
구조체 정의와 선언
struct 구조체_이름 {
// 맴버 변수...
};
구조체는 키워드 'struct'를 사용하여 멤버 변수들과 함께 선언합니다.
struct 구조체_이름 변수_이름;
또한 선언한 구조체를 사용할 때에는 일반 변수들과 비슷하게 'struct + {자료형이 지정한 구조체 이름}'인 자료형 변수를 선언합니다.
'struct'와 '구조체이름'은 한 묶음으로 반드시 붙여 사용합니다.
struct Student {
char name[10];
int age;
int grade;
};
struct Student student1, student2;
구조체의 재정의 (typedef)
struct 구조체_이름 {
// 맴버_변수...
};
typedef struct 구조체_이름 재정의_이름;
재정의_이름 변수_이름;
일반적으로 구조체 변수를 선언할 때는 키워드 'struct'를 붙여 사용하지만 키워드 'typedef'를 사용하면 위와 같이 더 편리하게 구조체 변수를 선언할 수 있습니다. 또한 재정의한 이름으로 구조체 자료형을 사용할 수 있습니다.
typedef struct 구조체_이름 {
// 맴버_변수...
} 재정의_이름;
재정의_이름 변수_이름;
또는 구조체의 선언과 동시에 재정의할 수 있습니다.
(이때 재정의 이름으로 구조체 자료형이 존재하기 때문에, 선언시 구조체 이름은 지정하지 않아도 됩니다.)
typedef는 구조체 이름이 긴 경우나 키워드 'struct'를 일일이 쓰고 싶지 않을 때 사용합니다.
typedef struct {
char name[10];
int age;
int grade;
} Student;
Student std1;
구조체 초기화
struct 구조체_이름 변수_이름 = { /* 멤버 변수 초기화 */ };
구조체의 멤버 변수는 중괄호 '{'와 '}'사이에 순서대로 콤마(,)를 기준으로 구분하여 초기화합니다.
struct Student {
char name[10];
int age;
int grade;
};
struct Student std1 = { "James", 21, 80 };
구조체 접근
도트 연산자(.)
구조체_변수_이름.멤버_변수_이름
구조체의 멤버 변수는 도트 연산자(.)를 사용하여 접근할 수 있습니다.
struct Student {
char name[10];
int age;
int grade;
};
struct Student std1 = { "James", 21, 80 };
printf("이름 : %s\n", std1.name);
printf("나이 : %d\n", std1.age);
printf("점수 : %d\n", std1.grade);
화살표 연산자 (->)
(*구조체_포인터_변수_이름).멤버_변수_이름
포인터 구조체의 경우에는 다음과 같이 멤버 변수에 접근할 수 있지만
구조체_포인터_변수_이름->멤버_변수_이름
다음과 같이 화살표 연산자(->)를 사용하여 접근할 수도 있습니다.
struct Student {
char name[10];
int age;
int grade;
};
struct Student std1 = { "James", 21, 80 };
struct Student* pstd1 = &std1;
printf("이름 : %s\n", pstd1->name);
printf("나이 : %d\n", pstd1->age);
printf("점수 : %d\n", pstd1->grade);