13.1 구조체란 무엇인가?
자료형의 분류
자료형 | ||
기초자료형 | 파생자료형 | 사용자정의 자료형 |
int | 배열 | typedef |
chasr | 포인터 | enum |
double | 구조체 | |
void | 공용체 | |
··· |
구조체
서로 다른 종류의 데이터를 하나로 묶은 자료형
struct student {
int number;
char name[10];
double grade;
};
13.2 구조체의 선언, 초기화, 사용
구조체 선언
구조체_정의 구조체_이름 {
구조체_멤버
};
구조체 변수 생성
struct student {
int number;
char name[10];
double grade;
};
struct student s1;
struct student s2, s3;
struct student {
int number;
char name[10];
double grade;
} s1;
구조체 초기화
struct student {
int number;
char name[10];
double grade;
};
struct student s1 = { 24, "Kim", 4.3 };
struct student s2 = { 25, "Park", 3.9 };
13.3 구조체의 활용
구조체 멤버 참조
멤버 연산자(.)를 이용하여 접근
이름 없는 구조체
구조체를 정의할 때 태그 이름 생략 가능
모든 구조체 변수를 구조체 정의와 함께 선언
구조체를 멤버로 갖는 구조체
어떠한 자료형도 구조체 변수가 될 수 있음
구조체도 다른 구조체의 멤버가 될 수 있음
구조체 변수의 대입
struct point {
int x;
int y;
};
struct point p1 = { 10, 20 };
struct point p2 = { 30, 40 };
방법 1 | 방법 2 |
p2 = p1; | p2.x = p1.x; p2.y = p1.y; |
구조체 변수의 비교
잘못된 방법 | 올바른 방법 |
if (p1 == p2) { printf("p1과 p2가 같습니다."); } |
if ((p1.x == p2.x) && (p1.y == p2.y)) { printf("p1과 p2가 같습니다."); } |
13.4 구조체의 배열
구조체 배열
여러 개의 구조체를 저장하는 배열
13.5 구조체와 포인터
구조체를 가리키는 포인터
struct student s = { 24, "Kim", 4.3 };
struct student* p;
p = &s;
printf("학번: %d, 이름: %s, 학점: %f", (*p).number, (*p).name, (*p).grade);
간접 멤버 연산자 (->)
구조체 포인터를 이용하여 멤버에 접근하기 위해 사용: p->number
printf("학번: %d, 이름: %s, 학점: %f", p->number, p->name, p->grade);
구조체 변수와 구조체 포인터의 조합
(*p).number - 포인터 p가 가리키는 구조체 멤버 number를 의미
p->number - 포인터 p가 가리키는 구조체 멤버 number를 의미
*p.number - 구조체 p가 가리키는 구조체 멤버 number가 가리키는 대상 (number는 포인터)
*p->number - 구조체 p가 가리키는 구조체 멤버 number가 가리키는 대상 (number는 포인터)
포인터를 멤버로 갖는 구조체
구조체는 포인터를 멤버로 갖는 것이 가능
기본 자료형에 대한 포인터, 구조체에 대한 포인터
문자 배열과 문자 포인터의 차이점
struct studentA { int number; char name[20]; double grade; }; |
struct studentA s1 = { 20210001, "홍길동", 4.3 }; struct studentA s1; scanf("%s", s1.name); // 가능 |
struct studentB { int number; char* p; double grade; }; |
struct studentB s2 = { 20210001, "김유신", 4.2 }; struct studentB s2; scanf("%s", s2.p); // 불가능 |
13.6 구조체와 함수
함수의 인수로 구조체 전달
구조체의 복사본이 전달
시간과 메모리 공간 차지
함수의 인수로 구조체 포인터 전달
시간과 메모리 공간 절약
원본 데이터 훼손 가능성
함수의 반환값으로 구조체 사용
반환형을 구조체로 표시
구조체의 복사본이 반환
13.7 공용체
공용체
같은 메모리 영역을 여러 개의 변수가 공유
공용체 선언 및 사용 방법은 구조체와 비슷
union example {
char c;
int i;
};
공용체_정의 공용체_이름 {
공용체_멤버
};
13.8 열거형
열거형
변수가 가질 수 있는 값들을 미리 열거해 놓은 자료형
열거형 필요성
오류를 줄이고 높은 가독성
의미를 쉽게 알 수 있는 기호 상수 사용
의미 없는 값이 대입되지 않도록 미리 차단
열거형 정의
enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
열거형_정의 열거형_이름 { 기호_상수 };
열거형 변수 선언
열거형 이름에 정의된 값들만 사용 가능
enum days today;
today = SUN; // 가능
today = MY_DAY; // 오류
기호 상수
0에서 시작하여 1씩 증가
사용자가 값 변경 가능
enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
enum days { SUN = 1, MON, TUE, WED, THU, FRI, SAT };
enum days { SUN = 7, MON = 1, TUE, WED, THU, FRI, SAT = 6 };
정수값, 기호 상수, 열거형 비교
정수 사용 | 기호 상수 | 열거형 |
switch(code) { case 1: printf("LCD TV\n"); break; case 2: printf(“OLED TV\n"); break; } |
#define LCD 1 #define OLED 2 switch(code) { case LCD: printf("LCD TV\n"); break; case OLED: printf(“OLED TV\n"); break; } |
enum tvtype { LCD, OLED }; enum tvtype code; switch(code) { case LCD: printf("LCD TV\n"); break; case PDP: printf(“OLED TV\n"); break; } |
컴퓨터는 알기 쉬우나 사람은 기억 하기 어렵다. | 기호 상수를 작성할 때 오류를 저지 를 수 있다. | 컴파일러가 중복이 일어나지 않도 록 체크한다. |
13.9 typedef
사용자 정의 자료형
프로그래머가 자신이 필요한 자료형을 typedef 키워드로 정의하여 사용
typedef unsigned char BYTE;
typedef_정의 기존_자료형 새로운_자료형;
기본 자료형 재정의
기본 자료형에 새로운 자료형을 추가
typedef unsigned char BYTE;
BYTE index;
typedef int INT32;
typedef unsigned int UINT32;
INT32 i;
UINT32 k;
새로운 자료형 만들기
구조체를 새로운 자료형으로 정의
struct point {
int x;
int y;
};
typedef struct point POINT;
POINT a, b;
typedef struct point {
int x;
int y;
} POINT;
typedef의 장점
이식성을 높여준다.
#define과의 차이점
문서화의 역할
'잠든 카테고리 > 쉽게 풀어쓴 C언어 Express' 카테고리의 다른 글
12-12.1(문자와 문자열)~12.7(문자열 여러 개를 저장하는 방법) (0) | 2022.06.14 |
---|---|
11-11.1(포인터란?)~11.7(포인터 사용의 장점) (0) | 2022.06.14 |
10-10.1(배열이란?)~10.6(2차원 배열) (0) | 2022.06.10 |
09-9.1(변수의 속성)~9.8(순환 호출)+Advanced Topic (0) | 2022.06.10 |
08-8.1(함수란?)~8.7(함수를 사용하는 이유)+Advanced Topic (0) | 2022.06.09 |