오픈소스소프트웨어개발입문 (CP33992) 사용자정의자료형 부산대학교공과대학정보컴퓨터공학부
학습목표 여러자료형변수들의집합체인구조체와공용체의특징과차이점을이해할수있다. 구조체 구조체선언과사용방법을알수있다. 구조체배열을이용한프로그램을할수있다. 구조체포인터를이용한프로그램을할수있다. 구조체자체혹은구조체포인터를매개변수로전달할수있다. 구조체의멤버로서다른구조체를사용할수있다. 공용체 공용체선언과사용방법을알수있다. 공용체와구조체의차이점을알수있다. 2
구조체개요 3
구조체란무엇인가? 예 : 학생관리프로그램의각학생에대한기록 (record) 한학생에대한자료들을한곳에모아서관리하면편리 한학생의이름, 학번, 나이, 전화번호, 전공등 구조체는여러자료형변수들의집합체이다. 구조체구문구조 struct 구조체명 { 자료형1 멤버명1; 자료형2 멤버명2;... }; 멤버변수혹은필드변수 구조체를구성하는변수 4
구조체정의와변수선언 (1/2) 구조체정의와변수선언 #1 정의 struct student { int id; char name[20]; char major[20]; }; 구조체정의와변수선언 #2 형정의 (typedef) 사용하여구조체자료형이름정의 typedef struct { int id; char name[20]; char major[20]; } STUD; 선언 STUD s1, s2; 선언 struct student s1, s2; 5
구조체정의와변수선언 (2/2) 구조체정의와변수선언 #3 정의및선언 struct student { int id; char name[20]; char major[20]; 구조체정의와변수선언 #4 구조체이름을붙이지않고구조체와변수동시선언 struct { int id; char name[20]; char major[20]; } s1, s2; } s1, s2; 6
구조체변수를위한기억공간 구조체변수를위한기억공간 구조체의각멤버들을위한기억공간을연속적으로할당 struct student 형의변수를위한기억공간할당 예 : struct student 형의구조체변수를위한기억공간할당 [ 프로그램 12-1] 구조체변수의크기를출력 (struct.c) 학습 point: 구조체변수 stud 가할당받는기억공간의크기를이해할수있다 7
프로그램 12-1 8
구조체변수사용 구조체변수에포함된멤버변수에접근하기위해서점연산자를사용한다. 구문형식 구조체변수. 멤버명 예 [ 프로그램 12-2] 학생구조체사용예 (student.c) 학습 point: 점연산자를사용하여학생구조체의멤버인정수형변수 id 와문자형배열 name, major 에접근할수있음 9
프로그램 12-2 10
구조체대입 구조체변수간의대입이가능하며이경우모든멤버가한번에대입된다. 예 struct student stud1, stud2;... stud2 = stud1; 정수형멤버인 id 값만변경하는방법은? 11
구조체포인터 구조체에대한포인터를이용하여구조체참조 구조체포인터변수선언형식 struct 구조체명 * 포인터명 ; 예 struct student stud1, stud2, *p; p = &stud2; 12
구조체포인터사용 *p는 p가가리키는구조체 구조체포인터 p가가리키는구조체내의멤버 예 : (*p).id, (*p).name, (*p).major 주의! *p.id == *(p.id) 의의미 구조체포인터연산자 : -> 구조체포인터-> 멤버명 == (* 구조체포인터 ). 멤버명 예 : p->id, p->name 13
구조체배열과포인터 14
구조체배열 구조체배열의각원소는하나의구조체이다. 구문형식 struct 구조체명배열명 [ 원소의개수 ]; 예 struct student s[100]; 예를들어 stud 배열의 2 번째구조체의멤버사용 s[1].id s[1].name s[1].major 15
구조체배열초기화예 struct student stud[] = { }; 구조체배열초기화 {1401001, " 박찬호 ", " 정보과학 "}, {1401005, " 김연아 ", " 영문학 "}, {1401008, " 박세리 ", " 정보과학 "}, {1401015, " 홍길동 ", " 경영학 "} [ 프로그램 12-3] 학생정보를입력받고정보과학전공학생들만출력 (student1.c) 학습 point: 사용자입력을통해구조체를초기화하는방법을학습하고조건에맞는구 조체변수를찾아출력 16
프로그램 12-3 17
프로그램 12.3 의구조체배열 구조체포인터배열 실제입력되는학생수에관계없이배열크기 100 struct student *s[100]; 구조체의배열이아니라 구조체포인터의배열 필요할때 malloc() 함수로구조체기억공간할당 18
구조체를매개변수로전달 19
구조체를매개변수로전달 구조체자체혹은구조체포인터를매개변수로전달할수있다. (1) 구조체자체를매개변수로전달하는방법 함수를정의할때구조체를매개변수로선언하고 함수가호출될때실매개변수로구조체를전달 실매개변수구조체의모든값이형식매개변수에그대로복사 (2) 구조체포인터를매개변수로전달하는방법 구조체의포인터를실매개변수로건네주어 이포인터로구조체를참조하는방법 구조체전체를복사할필요가없으므로시간이적게듬 20
구조체매개변수예 구조체자체를매개변수로전달하는예 printstudent1(stud1); 구조체포인터를매개변수로전달하는예 printstudent2(&stud2); p = ( struct student *) malloc(sizeof(struct student *));... printstudent2(p); [ 프로그램 12-4] 함수를이용하여학생구조체의데이터를출력 (printstudent.c) 학습 point: student 구조체변수의값을입력받고함수호출을통해출력 21
프로그램 12-4 (1/2) 22
프로그램 12-4 (2/2) 23
구조체리턴 구조체자체를리턴 구조체에대한포인 터를리턴 24
중첩구조체 25
중첩구조체 (nested structure) 선언 구조체의멤버로서다른구조체를사용 복잡한구조의데이터를관리하기위함 예 struct date { char month; // 월 char day; // 일 }; struct student { int id; char name[20]; struct date birthday; } stud; 26
중첨구조체접근 중첩구조체에서내부구조체의멤버접근 외부 _ 구조체명. 내부 _ 구조체명. 멤버명 예 stud.birthday.month = 12; [ 프로그램 12-5] 학생들의생일정보를입력받고학생이름으로검색하는프로그램 (student3.c) 학습 point: 중첩구조체 student를선언하고값을접근할수있음 27
프로그램 12-5 28
다른구조체에대한포인터를포함한중첩구조체 다른구조체에대한포인터를구조체의멤버로사용 struct student { int id; char name[20]; struct date *ptr; } stud; 이포인터 ptr 를사용하기위해서 이포인터가실제 date 구조체를가리키고있어야한다. 예를들어, stud.ptr = (struct date *) malloc(sizeof(struct date)); stud.ptr->month = 12; 29
자기참조구조체 30
자기참조구조체개요 여러권의책에대한정보를어떻게저장할까? 구조체배열을이용 : 배열의크기를미리정해야함 보다유연한데이터표현방법이필요함 구조체내에자신을가리킬수있는포인터변수를선언 struct book { char title[50]; char author[20]; char publisher[20]; struct date pub_day; struct book *next; }; 31
struct book *ptr; 자기참조구조체사용 // 첫번째책을위한구조체생성 ptr = (struct book *) malloc(sizeof(struct book));... // 첫번째책자료대입 // 두번째책을위한구조체생성 ptr->next = (struct book *) malloc(sizeof(struct book)); ptr = ptr->next; // 두번째책구조체를포인터... // 두번째책자료대입 // 세번째책을위한구조체생성 ptr->next = (struct book *) malloc(sizeof(struct book)); ptr = ptr->next; // 세번째책구조체를포인터... // 세번째책자료대입 32
공용체 33
공용체 (union) 구조체와비슷하게여러개의멤버변수로구성된다 한순간에하나의멤버변수만사용할수있다. 공용체정의 union 공용체명 { 자료형1 멤버명1; 자료형2 멤버명2; : }; 공용체변수선언 union 공용체명변수명 ; 34
공용체예 가격을나타내는공용체 가격은원, 달러, 유로중하나로표시 union price { int won; // 원 float dollar; // 달러 float euro; // 유로 }; union price book_price; book_price.won = 10000; book_price won, dollar, euro 35
공용체의기억공간할당 멤버변수 won, dollar, euro 가모두한기억공간을공유 주의! 공용체내의다른멤버변수에새로이데이터를대입하면기존의데이터는지워짐 예 : dollar 값을대입하면 won 값은지워짐 book_price.won = 10000; book_price.dollar = 39.99; 36
공용체배열 / 포인터 공용체도배열이나포인터형태로도선언되어사용됨 예 공용체배열선언 union price book_prices[10]; 공용체포인터및변수선언 union price book_price, *price_ptr; 공용체주소를공용체포인터변수에대입 price_ptr = &book_price; 37
열거형 38
열거형 (enumerated type) 열거형 일련의관련정수, 상수들의집합을하나의자료형으로정의 열거형은자료형의일종이므로하나의자료형으로사용 특히변수값이특정집합으로제한된경우에좋음 열거형을사용하면코드가보다간결해지고읽기쉬워짐 열거형정의 enum 열거명 { 상수명 [= 정수값 ],..., 상수명 [= 정수값 ] }; 39
열거형예 열거형정의 enum day { SUN, MON, TUE, WED, THU, FRI, SAT }; 실제로는 enum day { SUN = 0, MON = 1, TUE = 2, WED = 3, THU = 4, FRI = 5, SAT = 6 }; enum day 형의변수선언 enum day d1,d2; d1 = fri; [ 프로그램 12-6] 프로그램 11-7 에서선언된매크로상수 INT 와 DOUBLE 을열거 형을사용하여선언한프로그램 (eumprint.c) 학습 point: 열거형상수를선언하고사용할수있음 40
프로그램 12-6 41
열거형이용함수 다음요일을리턴하는함수 next_day() enum day next_day(enum day d) { return (enum day)((int)d+1); } 42
열거형에서초기화 열거형에서상수명의값을초기화가능함 열거형을정의하면서변수선언도함께할수도있음 enum suit { CLUB = 1, DIAMOND = 2, HEART = 3, SPADE = 4 } a, b, c; 43
프로그램실습 (1/2) 다음그림과같이개인정보등록, 모든정보출력, 특정인의정보출력, 특정인의정보제거기능을가진간단한전화번호관리프로그램을작성하시오. 44
프로그램실습 (2/2) 조건 전화번호부에는최대 50개의정보를저장할수있음 사용자가그만하기를선택할때까지여러기능을반복하여처리할수있음 구조체배열을사용하고구조체포인터를이용하여참조함 프로그램 Tip 개인정보를저장할구조체배열의크기와실제로정보가저장된배열원소수가다름. 즉배열전체의크기와상관없이실제배열에저장된개인정보의수를별도의변수 ( 예로 size) 에관리해야한다. 일단 #define MAX 50으로정의한매크로상수를이용하여 struct phone book[max}; 로 phone형구조체배열 book을선언한후 int size = 0; 으로선언함 개인정보가등록될때마다 size를 1 증가하고 3번기능에의해정보가제거될때마다 size를 1 감소하며 1번기능에서는 book[0] 부터 book[size-1] 까지의원소에저장된정보를출력함 배열의한원소를삭제할때는삭제할이름을포함하고있는배열원소의첨자를먼저구해야함. 만일삭제할개인정보의배열원소첨자가 5이고현재배열에저장된정보가 9(size) 개라면 book[5]=book[6], book[6]=book[7], book[7]=book[8] 과같이첨자 6부터 9-1(size-1) 까지의원소에대해한칸씩앞으로이동하고배열에저장된정보개수 size도 1을빼서 7로수정해야함 45