Trivia
7강.구조체(1) 본문
7.1 구조체란?
▶C언어의 자료형
1. 기본 자료형: char, int, double 등
2. 파생 자료형: 배열, 포인터, 구조체, 열거형, 공용체 등
cf1) 서로 다른 형태의 데이터 결합이 매우 유용
cf2) 여러 개의 자료형을 묶어서 새로운 자료형 생성 가능
cf3) 배열: 같은 타입의 집합, 구조체: 다른 타입의 집합
7.2 구조체의 선언, 초기화, 사용
▶선언(정의): struct라는 키워드를 사용하여 정의
struct 태그 {
자료형 멤버1;
자료형 멤버2;
.
.
.
};
1. 구조체 태그는 변수가 아님 (각 구조체를 구별하기 위한 이름)
2. 중괄호 안에 원하는 변수들을 선언 (=구조체 멤버)
3. 구조체의 정의가 끝나면 세미콜론(;) 삽입
cf1) 구조체 선언≠변수 선언
cf2) 구조체 선언은 안에 어떠한 변수들이 들어간다는 것을 알려주는 것
cf3) 구조체의 형태만 정의(변수 생성X)했으므로 데이터 저장이 불가
//복소수
struct complex {
double real; //실수부
double imag; //허수부
};
//날짜
struct date {
int month;
int day;
int year;
};
//직원
struct employee {
char name[20]; //이름
int age; //나이
int gender; //성별
int salary; //월급
};
▶변수 생성: 기본 자료형의 변수 생성 방식과 동일 (단, struct를 붙임)
struct student { //구조체 정의
int number;
char name[10];
double grade;
};
int main() {
struct student s1; //구조체 변수 선언
.
.
.
}
- student라는 구조체를 이용하여 s1이라는 구조체 변수 생성
- 변수 s1에는 구조체의 멤버인 number, name, grade가 포함
- s1에는 실제 메모리 공간이 할당
1. 하나의 문장에서 여러 개의 구조체 변수 선언 가능 (ex. struct student s2, s3;)
2. 구조체의 정의와 변수 선언을 동시에 처리 가능
ex. struct student { →구조체 정의
int number;
char name[10];
double grade;
} s1 ; →변수 선언 (s1: 구조체 student의 변수)
▶초기화
1. 배열과 유사
2. 멤버들의 초기값을 중괄호안에 나열
3. 문장의 끝은 세미콜론(;)으로 마침
struct student {
int number;
char name[10];
double grade;
};
struct student s1 = { 20, "Lee", 4.0 };
cf) 구조체의 선언과 변수 선언을 동시에 한 경우의 초기화 표현
struct student {
int number;
char name[10];
double grade;
} s1 = { 20, "Lee", 4.0 };
▶멤버 참조
1. 실질적으로 중요한 것은 구조체의 멤버 변수를 참조하는 것
2. 멤버 연산자(.)를 이용하여 접근 가능
s1.number = 20; //정수 멤버
strcpy(s1.name, "Lee"); //문자열 멤버
s1.grade = 4.0; //실수 멤버
▶이름 없는 구조체
1. 구조체 정의 시 태그 이름 생략 가능
2. 가독성을 위해 태그 이름은 생략하지 않는 것이 좋음
3. 구조체 변수의 추가 생성은 불가, 추후 구조체 재정의
ex) 예제 프로그램(1)
#include <stdio.h>
#include <stdlib.h>
struct student{
int number; //학번
char name[10]; //이름
double grade; //학점
}; //학생이라는 구조체 정의
int main()
{
struct student s; //구조체 변수 선언
s.number = 201812300; //멤버 참조
strcpy(s.name,"홍길동");
s.grade = 4.0;
printf("학번: %d\n", s.number);
printf("이름: %s\n", s.name);
printf("학점: %f\n", s.grade);
return 0;
}
학번: 201812300
이름: 홍길동
학점: 4.000000
ex) 예제 프로그램(2)
#include <stdio.h>
#include <stdlib.h>
struct student{
int number;
char name[10];
double grade;
};
int main()
{
struct student s;
printf("학번을 입력하시오:");
scanf("%d", &s.number);
printf("이름을 입력하시오:");
scanf("%s", &s.name);
printf("학점을 입력하시오:");
scanf("%lf", &s.grade);
printf("\n")
printf("학번:%d\n", s.number);
printf("이름:%s\n", s.name);
printf("학점:%f\n", s.grade);
return 0;
}
학번을 입력하시오: 201812300
이름을 입력하시오: 홍길동
학점을 입력하시오: 3.5
학번: 201812300
이름: 홍길동
학점: 3.500000
7.2 구조체의 활용
▶구조체를 멤버로 가지는 구조체
1. 구조체도 다른 구조체의 멤버로 처리 가능
2. 포인터도 구조체의 멤버로 처리 가능
struct date { //구조체 선언
int year;
int month;
int day;
};
struct student { //구조체 선언
int number;
char name[10];
double grade;
struct date d; //구조체 안에 구조체 포함
};
struct student s; //구조체 변수 선언
s.d.year = 2018; //멤버 참조
s.d.month = 03;
s.d.day = 09;
▶구조체 변수의 대입과 비교
1. 하나의 구조체를 다른 구조체에 대입하는 연산은 가능
2. 하나의 구조체를 다른 구조체와 비교하는 것은 불가능
struct point{
int x;
int y;
};
int main()
{
struct point p1;
struct point p2;
p2=p1; //대입 가능
if( p1 == p2 ) //비교 → 컴파일 오류
printf("p1과 p2는 같습니다.");
if((p1.x == p2.x) && (p1.y == p2.y)) //올바른 비교
printf("p1과 p2는 같습니다.");
}
[응용예제 7.1] 구조체와 배열의 차이점을 비교하시오.
[답] 배열: 같은 type의 자료형 묶음
구조체: 서로 다른 type의 자료형 묶음
[응용예제 7.2] 구조체 태그와 구조체 변수 선언의 차이점은?
[답] 구조체 태그: 공간확보 X
구조체 변수 선언: 실질적 공간 확보 O
[응용예제 7.3] 다음 코드의 오류를 찾으시오.
struct book {
char title[50];
int pages;
};
book.pages = 512;
[답] struct book {
char title[50];
int pages;
};
struct book b;
b.pages = 512;
[응용예제 7.4] 다음 문장이 참인지 거짓인지 판정하시오.
(a) 구조체를 선언하면 자동으로 변수가 생성된다.
(b) 구조체 멤버는 == 연산자를 사용하여 비교할 수 있다.
[답] (a) 거짓, (b) 참