C 프로그래밍 기초
chapter 09. 구조체와 공용체
구조체와 공용체 C언어에서는 효율적인 프로그래밍을 위해 새로운 자료형을 만들어 사용하는 것을 지원함 구조체 서로 다른 자료형을 가지는 변수들을 단일 명칭 하에 그룹화시켜 또 다른 자료형으로 정의하는 것 [예]10명의 사원(employee)에 관한 자료를 표현할 경우 각 사원에 관한 자료 - 성명, 나이, 성별, 주소 등 각각의 속성을 따로따로 관리하는 것보다 하나의 이름으로 그룹화하여 관리하는 것이 편리 구조체 char name[10][20] name[0] name[1] name[9] int age[10] age[0] age[1] age[9] char sex[10] sex[0] sex[1] sex[9] char addr[10][50] addr[0] addr[1] addr[9]
구조체와 공용체 공용체 여러 변수를 모아 하나의 공통된 변수를 만들고 메모리를 공유 여러 변수가 메모리를 공유하므로 독립적으로 사용이 불가능
9.1 구조체의 정의 - 1 구조체는 두 개 이상의 원소들로 구성된 자료형이다. 구조체는 두 개 이상의 원소들로 구성된 자료형이다. 배열과 달리, 구조체의 각 원소는 자신의 자료형을 갖는데 이 자료형은 다른 원소의 자료형과 다를 수 있음 형식 예제 struct tag-name { type element 1; type element 2; ∶ type element n; } variable-list; struct sample { char name[15]; int age; char sex; char nationality[10]; }; struct : 키워드 type : 자료형 tag-name : 구조체의 타입명 variable-list : 구조체의 변수명
9.1 구조체의 정의 - 2 구조체 사용시 메모리 구조 name 예제 struct sample { char name[15]; nationality sex age name 예제 15 byte struct sample { char name[15]; int age; char sex; char nationality[10]; }; 4 byte 1byte 10 byte
9.2 구조체의 선언 선언 방법 정의와 선언 형식 예제 struct employee x; struct 구조체명 변수명 리스트; struct employee y; struct employee x, y; 예제 struct employee { char name[15]; int age; char sex; char nationality[10]; } x, y;
9.3 구조체의 멤머 구조체 멤버 변수들을 참조를 위한 참조 연산자 일반 변수 : ‘.’ 연산자 사용 포인터 변수 : ‘->’ 연산자 사용 struct sample var, *ptr; nationality sex age name var.name ptr->name var.age ptr->age var.sex ptr->sex var.nationality ptr->nationality
[실습] 9-1. 구조체의 정의와 선언, 활용
[실습] 9-2. 구조체 멤버 접근 및 연산 [예제9-2] 구조체 정의, 선언 그리고 구조체 멤버에 입력하고 연산하는 프로그램
[실습] 9-3. 구조체 멤버 접근 및 연산 [예제9-3] 예제 9-1 프로그램에 구조체 포인터 변수 활용을 첨가한 예제 프로그램 [연습] 학생 개인 한 명에 대한 신상정보를 구조체로 표현해 보라
9.4 구조체 연산과 배열 - 1 구조체에 적용할 수 있는 연산자는 세 가지만 멤버 참조 연산자(. ->) : 구조체의 멤버에 접근하도록 하는 참조 연산자 주소 연산자(&) : 구조체의 시작 주소를 계산함 대입 연산자(=) : 동일한 구조체 형을 갖는 구조체 변수 사이에 대입 연산자를 사용할 수 있음 struct employee x = {"Robert",50,'M',"U.S.A"}, y; y = x;
9.4 구조체 연산과 배열 - 2 구조체에서도 배열을 사용할 수 있음 선언 방법 구조체에서 배열의 초기화 형식 예제 struct 구조체명 배열명[배열크기]; struct employee x[3]; 예제 struct employee x[3]= {{"Roberts", 50, 'M', "U.S.A"}, {"Tom", 25, 'M', "U.K"}, {"July", 30, 'F', "U.S.A"}};
[실습] 예제 9-4 예제 9-1 프로그램을 확장하여 많은 종업원의 정보가 구조체 배열로 저장되어 있고, 나아가 25세이하인 종업원을 검색하는 프로그램이다.
[실습] 예제 9-4 – 실행 결과
[실습] 예제 9-5 학생들의 이름과 성적을 구조체 배열을 사용하여 그룹으로 처리하는 프로그램
[실습] 예제 9-5 [연습] 예제 9-5에 물리, 화학 과목을 추가하여 프로그램해 보라. 도서(book)를 나타내기 위해 title, author, price, page를 멤버로 하는 구조체를 선언하고, 이것을 이용한 도서검색 프로그램을 작성해 보라.
9.5 구조체 포인터 구조체도 포인터를 사용할 수 있음 선언 방법 구조체 멤버 참조 형식 예제 struct 구조체명 *변수명; struct employee *ptr; 예제 ptr->age;
[실습] 9-6. 구조체 포인터(성적처리) - 1 다음 페이지에 계속 …
[실습] 9-6. 구조체 포인터(성적처리) - 2
[실습] 9-6. 구조체 포인터(성적처리) – 실행 결과
9.6 함수의 인자로서 구조체 1.구조체가 함수인자 2.구조체의 포인터가 함수의 인자 구조체의 모든 멤버 데이터가 전달되기 때문에 구조체의 크기에 따라서 프로그램의 수행시간이 길어지게 되므로 비효율적 따라서 구조체의 포인터를 함수의 인자로 사용하게 되면 구조체의 포인터만 전달하기 때문에 효율적 2.구조체의 포인터가 함수의 인자 구조체가 통째로 복사되는 것이 아니라 구조체의 선두 번지만이 전달되기 때문에 프로그램의 수행 속도가 빠름 구조체를 함수의 인자로 사용할 경우에는 구조체 자체보다 구조체 포인터를 전달하는 것이 좋음
[실습] 9-7. 구조체를 반환하는 함수
[실습] 9-7. 구조체를 반환하는 함수 수행결과
9.7 함수의 리턴값이 구조체 함수의 리턴값을 구조체로 할 수 있음 지금까지 실습에서는 함수의 리턴값을 단 하나만 사용 구조체를 사용하면 여러 개의 값을 그룹핑하여 리턴할 수 있는 장점이 있음
[실습]9-8. 함수의 리턴값을 구조체로
9.8 중첩 구조체 중첩 구조체 구조체 속에 또 다른 구조체가 있는 것 분류, 인덱스 테이블의 링크 등 자료 구조 속성에 따라 매우 효율적으로 표현할 수 있음
[실습] 9-9. 구조체 안에 구조체 - 1 계속…
[실습] 9-9. 구조체 안에 구조체 -2
9.9 공용체 공용체 구조체와 공용체 비교 공용체의 정의와 선언 동일한 메모리 영역을 여러 개의 구성 요소가 공유하는 것 할당 멤버 각 구성 요소에 대하여 연속적으로 주소를 할당 멤버 각 구성 요소에 대하여 동일한 주소를 할당 사용방식 정해진 메모리 공간을 멤버들이 독립적으로 이용 멤버 중 가장 큰 메모리를 차지하는 크기만큼 메모리를 확보하여 멤버들이 공간을 공유 형식 예제 union 공용체명 { 공용체 멤버 정의; }; union u_tag { char a; int b; long c; } union u_tag *ptr;
[실습] 9-10. 공용체 사용 프로그램
연습문제 – 프로그램 작성 <연습문제>