구조체는 프로그램 개발에 있어서 매우 중요한 요소
구조체의 정의
'구조체(structure)' 라는 것은 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구.
구조체를 기반으로 새로운 자료형을 정의할 수 있다.
물론 이렇게 정의하는 자료형은 기본 자료형과 그 성격에 있어서 조금 차이가 있다.
프로그램상에서 마우스의 좌표정보를 저장하고 관리
다음과 같이 두 개의 변수를 선언
int xpos; // 마우스의 x 좌표
int ypos; // 마우스의 y 좌표
이 둘은 항상 함께 있어야 함
서로 독립된 정보를 표현하는 것이 아니라, 마우스의 위치라는 하나의 정보를 표현하기 때문.
이 둘은 함께 있을 때 의미를 지니며, 이 중 하나가 어떠한 이유로 인해서 소멸된다면 나머지 하나도 의미 없는 변수가 되어 버린다.
"이 둘을 묶어버리는 방법은 없을까? 마우스를 표현하기 위해서 이 둘을 묶어놓으면 프로그램 상에서의 데이터 표현과 관리가 용이할 텐데"
이러한 이유로 등장한 것이 구조체이며, 다음과 같이 구조체를 정의함으로써 위의 두 변수를 하나로 묶을 수 있다.
/*point라는 이름의 구조체 정의*/
struct point
{
int xpos; // point 구조체를 구성하는 멤버 xpos
int ypos; // point 구조체를 구성하는 멤버 ypos
}
위의 정의는 point 라는 이름의 구조체를 정의한 결과.
이 때 point라는 이름이 int나 double과 같은 자료형의 이름이 되는 것
기본 자료형은 아니고, 기본 자료형 변수를 묶어서 새로운 자료형을 만든 것.
이를 사용자 정의 자료형(user defined data type)
구조체의 정의 예 하나 더.
사람의 이름과 나이 그리고 전화번호의 정보를 묶을 수 있도록 정의
struct person // person이라는 이름의 구조체
{
char name[20]; // 이름 저장을 위한 멤버
char phonenum[20]; // 전화번호 저장을 위한 멤버
int age; // 나이 저장을 위한 멤버
}
배열의 값도 저장이 가능한, 사실상 변수의 성격을 띠기 때문에 구조체의 멤버가 될 수 있다.
구조체의 선언과 접근
위의 point와 person이라는 이름의 구조체를 정의하였다.
즉, 두 개의 자료형을 정의
따라서 이제는 이 자료형들을 대상으로 변수를 선언할 수 있다.
그리고 이렇게 선언되는 변수를 가리켜 '구조체 변수'라 한다.
struct type_name val_name; // 구조체 변수선언의 기본 형태
구조체 변수를 선언할 때에는 맨 앞에 struct 선언을 추가,
이어서 구조체의 이름과 구조체 변수의 이름을 선언해야 한다.
예시
struct point pos;
struct person man;
이렇게 선언하면 다음과 같이 존재
구조체 변수 pos에는 int형 변수 xpos와 ypos가 존재하며,
구조체 변수 man에는 char형 배열 name과 phonenum 그리고 int형 변수 age가 존재
구조체 변수 안에 존재하는 멤버에 접근할 때는?
구조체 변수의 이름.구조체 멤버의 이름
pos.xpos=20; // 구조체 변수 pos의 멤버 xpos에 20을 저장
printf("%s \n", man.name); // 구조체 변수 man의 멤버 name에 저장된 내용을 출력
이렇듯 구조체 변수의 멤버에 접근할 때에는 . 연산자를 사용.
예제 → 두 점에 대한 x, y 좌표정보를 입력 받아서, 두 점 사이의 거리를 계산하여 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
struct point
{
int xpos;
int ypos;
};
int main(void)
{
struct point pos1, pos2;
double distance;
fputs("point1 pos: ", stdout);
scanf("%d %d", &pos1.xpos, &pos1.ypos);
fputs("point2 pos: ", stdout);
scanf("%d %d", &pos2.xpos, &pos2.ypos);
/* 두 점간의 거리 계산 공식 */
distance = sqrt((double)(pos1.xpos - pos2.xpos) * (pos1.xpos - pos2.xpos) + (pos1.ypos - pos2.ypos) * (pos1.ypos - pos2.ypos));
printf("두 점 사이의 거리는 %g 입니다. \n", distance);
return 0;
}
math.h에 선언되어 있는 sqrt 함수를 호출
double sqrt(double x) // 제곱근 x의 값을 반환
이렇듯 인자로 double형 데이터를 요구하기 때문에 위 예제 22행에서도 double형으로의 형 변환을 시도하였다.
무엇을 어떻게 함수로 정의할 것인가?
- 공식화해서 설명하는 것은 불가능한 일이다.
- 다만 다음과 같은 지침 정도는 제시 가능
- "하나의 함수는 하나의 기능을 지녀야 한다"
- 이것이 함수의 크기를 결정짓는 최소한의 기준이 된다.
- 하나의 함수가 둘 이상의 기능을 지닌 경우에는 이를 두 개의 함수로 나눠야 한다.
person 구조체 기반 예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct person
{
char name[20];
char phonenum[20];
int age;
};
int main(void)
{
struct person man1, man2;
strcpy(man1.name, "하이");
strcpy(man1.phonenum, "010-1234-5678");
man1.age = 20;
printf("이름 입력: "); scanf("%s", man2.name); // 배열
printf("번호 입력: "); scanf("%s", man2.phonenum); // 배열
printf("나이 입력: "); scanf("%d", &(man2.age)); // int형 변수
printf("이름 : %s \n", man1.name);
printf("번호 : %s \n", man1.phonenum);
printf("나이 : %d \n", man1.age);
printf("이름 : %s \n", man2.name);
printf("번호 : %s \n", man2.phonenum);
printf("나이 : %d \n", man2.age);
}
구조체 변수의 초기화
int형 변수를 선언과 동시에 초기화할 수 있듯이 구조체 변수도 선언과 동시에 초기화할 수 있다.
그리고 초기화 방법은 배열의 초기화와 유사하다.
멤버의 순서대로 초기화할 대상을 나열하면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct point
{
int xpos;
int ypos;
};
struct person
{
char name[20];
char phonenum[20];
int age;
};
int main(void)
{
struct point pos = { 10, 20 };
struct person man = { "하이맨", "010-2477-2836", 21 };
printf("%d %d \n", pos.xpos, pos.ypos);
printf("%s %s %d \n", man.name, man.phonenum, man.age);
}
구조체 변수 선언 이후에 구조체의 멤버에 문자열을 저장하기 위해서 strcpy 함수를 호출해야만 했다.
"초기화 과정에서는 문자열 저장을 위해서 strcpy 함수를 호출하지 않아도 된다."
참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C' 카테고리의 다른 글
구조체와 사용자 정의 자료형2(23-1) 구조체의 정의와 typedef 선언 (0) | 2020.12.13 |
---|---|
구조체와 사용자 정의 자료형1(22-2) 구조체와 배열 그리고 포인터 (0) | 2020.12.12 |
문자와 문자열 관련 함수(21-5) 입출력 이외의 문자열 관련 함수 (0) | 2020.12.11 |
문자와 문자열 관련 함수(21-4) 표준 입출력과 버퍼 (0) | 2020.12.11 |
문자와 문자열 관련 함수(21-3) 문자열 단위 입출력 함수 (0) | 2020.12.10 |