C - Struct, 구조체
C언어를 주제로 한 아홉번째 포스팅은 구조체에 대하여 다루어보겠습니다.
구조체는 여러가지 타입의 변수를 특정한 양식에 따라 초기화 할수있게 만든 변수공간
정도로 생각하면 될것같습니다. 다양한 정보를 갖는 변수를 초기화 하기에 좋습니다.
예를들어 초등학생의 정보라고 하여도 이름,성별,학년,학급,성적,주소 등 하나의 타입으로는 저장하기 힘든
여러 유형의 정보를 가지고 있습니다. 이러한 정보들을 하나의 양식을 만들어 초기화 하는방법으로 구조체를
이용하는것 입니다.
C 예제문제 11번 - 사원의 정보를 담는 구조체를 구성하고 연봉을 계산하는 함수를 만들어서 사용하라
해결 과정)
step1) 기본적인 인적사항을 초기화할 구조체인 person을 선언하기.
person구조체는 마치 명함처럼 개개인의 이름과 전화번호 주소등 기본적인 인적사항을 포함하고 있습니다.
EX)
구조체의 정의에서 제가 실전 코딩에서 가장 선호하는 방법은 p.603에 나오는 typedef를 이용하여 구조체 정의와 새로운 자료형의 선언을 같이 하는 것입니다. 아래의 예시와 같습니다.
typedef struct person {
char* name; //이름
char* phoneNum; //전화번호
char* address; //주소
}person;
person은 변수가 아닌 새로운 자료형이 되기 때문에 나중에 동일한 구조체를 선언할 때 편리합니다.
Step2) person구조체를 포함하는 사원정보 구조체 employee선언하기.
다음은 사원의 정보 사번, 월급, 인센티브와 person구조체를 포함하는 사원정보 구조체인 employ를 선언하였습니다
typedef struct employee{
person person;
int staffNum; //사번
int pay; //월급
int incentive; //인센티브
}employee;
Step1에서 다룬 구조체의 선언방식과 동일하게 선언하여주었고 person이라는 이름으로 person구조체를 하나 선언하여 주었습니다. 나중에 초기화를 할때는 구조체안에 구조체를 들어가는 방식으로
struct employee e; , e.person.address; 이런식으로 접근이 가능합니다.
Step3) 연봉을 계산해주는 calc_totalPay() 함수 선언하기
먼저 책의 출력표에 연봉이 소수점1의자리까지 표기가 되어있어 double형 리턴타입으로 함수를 선언하여 주었고, 연산에 필요한 매개변수들을 double형으로 강제 타입변환 이후 연산을 진행하였습니다.
double calc_totalPay(struct employee e) { //연봉계산
double pay, incentive;
pay = e.pay; incentive = e.incentive;
return pay * ((12 + incentive / 100));
}
직원정보를 저장한 구조체 employ를 매개변수로 받아와 그안의 월급과 인센티브를 초기화시킨 변수
Pay와 incentive를 double형으로 타입변환 시켰습니다.
이후 연봉을 계산하는 식인 월급*(12+인센)을 프로그램 연산식으로 코딩하여 리턴하여주었습니다.
Step4) 모든 정보를 출력해주는 print_all 함수 선언하기.
employee구조체 안에 초기화 되어있는 모든 내용들과 calc_totalPay함수로 계산된 연봉을 한번에 출력해줄 print_all함수를 선언하여 메인에서 호출하게 하였습니다.
void print_all(struct employee e) {
printf("%d %s %s %s %d %d%% %.1f\n",
e.staffNum, e.person.name, e.person.phoneNum,
e.person.address,e.pay, e.incentive,
calc_totalPay(e));
}
Step5) 메인함수에서 구조체선언, 초기화후 결과물 출력하기.
모든 내용들을 종합하여 메인함수에서 선언하였고 출력양식을 조금 만들어서 출력후 마무리하였습니다.
int main(void) {
printf("사번 이름 전 화 번 호 주소 월급 인센티브 연봉\n");
printf("-------------------------------------------------------------------------\n");
employee kim = { {"kim","010-1234-3214","대전광역시 유성구" },
1001, 1200000, 120};
employee yoo = { {"yoo","010-8795-6524","서울특별시 관악구" },
1002, 1500000, 150 };
employee bae = { {"bae","010-1111-2222","인천광역시 남동구" },
1003, 1800000, 180 };
employee lee = { {"lee","010-9857-6545","부산광역시 동래구" },
1004, 2400000, 250 };
print_all(kim);
print_all(yoo);
print_all(bae);
print_all(lee);
return 0;
}
전체 코드)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct person {
char* name; //이름
char* phoneNum; //전화번호
char* address; //주소
}person;
typedef struct employee{
person person;
int staffNum; //사번
int pay; //월급
int incentive; //인센티브
}employee;
double calc_totalPay(struct employee e) { //연봉계산
double pay, incentive;
pay = e.pay; incentive = e.incentive;
return pay * ((12 + incentive / 100));
}
void print_all(struct employee e) {
printf("%d %s %s %s %d %d%% %.1f\n",
e.staffNum, e.person.name, e.person.phoneNum,
e.person.address,e.pay, e.incentive,
calc_totalPay(e));
}
int main(void) {
printf("사번 이름 전 화 번 호 주소 월급 인센티브 연봉\n");
printf("-------------------------------------------------------------------------\n");
employee kim = { {"kim","010-1234-3214","대전광역시 유성구" },
1001, 1200000, 120};
employee yoo = { {"yoo","010-8795-6524","서울특별시 관악구" },
1002, 1500000, 150 };
employee bae = { {"bae","010-1111-2222","인천광역시 남동구" },
1003, 1800000, 180 };
employee lee = { {"lee","010-9857-6545","부산광역시 동래구" },
1004, 2400000, 250 };
print_all(kim);
print_all(yoo);
print_all(bae);
print_all(lee);
return 0;
}
결과 콘솔)