10. 구조체

Download Report

Transcript 10. 구조체

구조체 (Structure)
구조체란?
「다른 형」의 데이터를 한데 모은 것
 cf. 배열: 「동일한 형」의 데이터를 한데 모은 것
 구조체에 의해 정리된 요소 하나하나를 멤버라고 한
다.
사용자 정의 자료형 (Data type)
 실세계 모델링에서 중요한 자료형
구조체의 선언
구조체 템플릿 선언
 어떤 변수를 구조체로써 하나로 묶을 것인지 정의하는 일
 예: struct employ {
// employ : 구조체 템플릿 이름
int no;
// 멤버
char name[10];
int age;
};
구조체 변수 선언
 실제 저장공간 확보
 예: struct employ kim;
// kim : 구조체 변수명
구조체의 활용1
구조체 변수에 대입
 .연산자로 멤버 접근
 예: kim.no = 3;
strcpy( kim.name, “놀부”);
kim.age = 40;
 구조체 변수 참조
 예: printf(“%d %s\n”, kim.no, kim.name);
구조체의 활용2
구조체 변수간에 대입
 구조체 템플릿 이름이 같을 때, 멤버간 대입 불필요
다시말하며, 구조체 템플릿 구성은 같아도 이름이 다르면 구조체
변수간 대입 불가.
 예: struct employ kim, someone;
someone = kim;
 구조체내의 구조체
 예: struct lab {
float temperature;
int table;
struct employ manager;
};
구조체와 포인터
 멤버 접근 외에는 일반 포인터 사용법과 같다
 예:
struct employ kim = { 3, “놀부”, 40 }; // 초기화
struct employ *sp;
sp = &kim;
// 구조체 포인터 sp가 구조체 변수 kim을
지시하게 된다.
 포인터를 사용한 구조체의 참조
 연산자로 멤버 참조
 예: printf(“%d %s\n”, spno, spname);
구조체와 함수
 값의 전달 (Call by Value)
 예: struct employ kim;
print_employ( kim );
 함수의 원형 선언 : void print_employ( struct employ);
 참조 전달 (Call by Reference)
 예: struct employ kim, lee;
swap( &kim, &lee );
 함수의 원형 선언 :
void swap( struct employ*, struct employ*);
구조체의 배열
 구조체 배열을 선언할 수 있다.
 예:
struct employ list[3] {
{ 1, “놀부”, 40 },
{ 2, “흥부”, 38 },
{ 3, “홍길동”, 29 }
};
// 구조체 배열의 초기화
 기본 구문
 예:
for( i=0; i<3; i++) {
printf( “ %d %s %d\n”, list[ i ].no, list[ i ].name,
list[ i ].age);
}
Byte Align
구조체에서
 아래 구조체와 같이 char a, int b 순으로 선언되면, b는 1B이지만,
그 다음에 3B에 0으로 더 채워진 후 d가 시작된다. (padding)
 왜냐하면 int형은 4의 배수 (int 가 32bit 일 경우) 지점에서 시작
하도록 되어 있으며, 이를 Byte Align 이라고 한다. ( double형은
8B이고, 8의 배수지점에서 시작
 struct balign {
char a;
int b;
};
Byte Align
 왜?
 데이터들의 메모리 정렬 시, 처리 효율(물리적 머신의 성능)을 높
이고자 구조체에서 Byte Align을 사용한다.
 Byte Align 변경
 #pragma pack(1)
: 1B단위로 Byte Align
 실습: sizeof( )로 Byte Align이 바뀌었을 때 구조체의 크기 관찰?
실세계 모델링
 버스를 구조체로 구현하시오. 버스의 멤버는 3개로 버스
명(문자열), 기름의 양(정수형), 승객 인원수(정수형)이다.
구조체 변수를 생성하고, 3개의 멤버를 화면 입력 받고 출
력하는 프로그램을 구현하시오.
[적절한 변수명을 줄 것]
 입력예:
버스명 >
기름(리터) >
승객(명) >
 출력예:
버스명 : 광역버스2000번
기름 : 50 리터
승객 : 15 명
실습과제 (요구사항)
 직원 10명의 정보를 입출력 할 수 있는 시스템을
원한다.
 입출력은 화면으로 가능하면 된다. 파일 입출력
불필요.
 직원 정보는 사번, 이름, 나이 정도면 된다.
 직원 정보는 구조체로 구현한다.
 일련번호로 검색해서 직원 정보를 보는 기능이 있
다.
 직원 입력은 신규 인원이 충원될 때 마다 입력하
고 싶다.
End