구조체란?
구조체는 C에서 사용되는 파생 자료형 중 가장 일반적이고 많이 사용되는 자료형이다. 파생 자료형이란 기본 자료형인 char, int, double에서 파생된 것으로 배열, 구조체, 공용체, 포인터 등을 들 수 있다.
동일한 자료형을 묶어서 사용하는 배열과 다르게 구조체는 다른 자료형을 하나로 묶어서 표현할 수 있다. 예를 들어 학생을 하나의 종류로 나타낸다고 할 때 다음과 같이 묶어서 나타낼 수 있다.
int number; // 학번
char name[10]; // 이름
double grade; // 학점
구조체 선언
구조체는 struct 키워드를 사용해 다음과 같은 형식으로 정의된다. 구조체를 선언하는 것도 하나의 문장에 해당하기 때문에 구조체 선언의 마지막에 세미콜론을 붙여줘야 한다.
struct student {
int number;
char name[10];
double grade;
};
구조체 태그(tag)
struct에 이어서 나오는 이름을 구조체 태그라고 한다. 즉, 구조체를 구별하기 위해 구조체에 붙여지는 이름이다.
구조체 멤버(struct member)
태그 다음에 있는 중괄호 사이에 원하는 변수들을 구조체 멤버라고 한다. 구조체 멤버는 구조체에 포함되는 변수이며 어떠한 자료형의 변수도 구조체의 멤버가 될 수 있다. 하지만 모두 유일한 이름을 가져야 한다.
구조체 선언은 변수 선언이 아니다. 구조체 선언은 구조체 안에 어떤 변수들이 들어간다는 것만 말해주는 것이다. 즉, 구조체 선언은 구조체의 형태만 정의한 것다.
구조체 변수 생성
위에서 만든 student 구조체를 이용해 구조체 변수를 생성하면 다음과 같다. struct 키워드 다음에 구조체 태그를 쓴 다음 원하는 변수명을 적어주면 된다.
int main {
struct student s1;
struct student s2, s3; // 여러 개 동시에 선언
}
s1 변수가 생성되었다. s1 변수 안에는 구조체 멤버 number, name, grade가 들어있고, 실제 메모리 공간이 할당된다. 대략 계산해보면 4+10+8=22byte가 된다. 컴파일러는 액세스 속도를 빠르기 하기 위해 더 많은 메모리를 할당하는 경우도 있으므로 sizeof 연산자를 이용하는 것이 정확하다.
student 구조체를 전역변수와 같이 소스 파일의 첫 부분에서 정의하게 된다면 student 구조체를 전체 소스 파일에서 사용할 수 있다. 만약 특정 함수 안에서 구조체를 정의했다면 그 함수에서만 해당 구조체를 사용해 변수를 만들 수 있다.
아래와 같이 구조체의 정의와 구조체 변수 선언을 동시에 할 수도 있다.
struct student {
int number;
char name[10];
double grade;
} s1;
구조체 초기화
구조체 정의와 구조체 변수 선언이 분리된 경우에는 구조체 변수 선언 뒤에서 초기화한다. 멤버들의 초기값을 중괄호 안에서 나열하면 된다.
struct student s1 = {24, "Kim", 4.3};
struct student s2 = {25, "Park", 3.9};
위와 같이 선언하게 되면 구조체 변수 s1은 24, "Kim", 4.3이 차례대로 구조체 멤버인 number, name, grade에 할당된다. s1과 s2의 구조를 살펴보면 다음과 같다.
(사진 추가 예정...)
구조체 멤버 참조
구조체 정의하고, 구조체 변수를 선언했으니 이제 구조체에 접근을 해야한다. 학생의 이름을 출력하고, 학점을 수정하려면 구조체 멤버를 참조 해야한다.
구조체 멤버는 멤버 연산자(.)를 이용해서 액세스 할 수 있다. 구조체 변수 이름을 쓰고 멤버 연산자를 찍은 다음, 멤버 변수의 이름을 써주면 된다. 다음과 같이 위에서 선언한 s1의 학점을 참조해 값을 변경할 수 있다.
s1.grade = 2.4;
만약 멤버의 자료형이 문자 배열이라면 strcpy()를 사용해 문자열을 저장해야 한다.
strcpy(s1.name, "Won");
이름 없는 구조체
위에서 구조체 정의할 때 student 태그를 사용하였다. 하지만 구조체 태그 이름은 생략할 수 있다. 이 경우 구조체의 이름이 없으므로 구조체 변수를 더 이상 생성할 수 없다. 따라서 구조체를 정의할 때 필요한 모든 구조체 변수를 정의 해야한다.
struct {
int name;
char name[10];
double grade;
} s1, s2, s3;
만약 프로그램의 다른 부분에서 똑같은 구조체가 필요한 경우 이름 없는 구조체를 사용해 구조체 변수를 선언할 수 없으므로 다시 구조체를 정의 해야한다.
'Study > Programming Language' 카테고리의 다른 글
[C++] cout << 을 사용해 화면 출력하기 (0) | 2024.05.03 |
---|---|
[C] typedef: typedef의 사용법과 특징, 구조체 활용 (2) | 2024.03.23 |
[C] 공용체(Union): 공용체 정의와 공용체 변수 선언, 초기화 (1) | 2024.03.23 |
[Java] Java에서 EOF 다루는 방법 (0) | 2023.09.25 |
[Java] SimpleDateFormat: 날짜를 내 마음대로 다뤄보자 (0) | 2023.08.24 |