Professional Documents
Culture Documents
이주현 교수
( joohyunlee@hanyang.ac.kr)
목차
■ 구조체의 정의
구조체의 필요성
■ 학생에 대한 데이터를 하나로 모으려면?
int number;
char name[10];
double grade;
와 같이 개별 변수
로 나타낼 수 있지
만 묶을 수가 있나?
4
구조체의 필요성
구조체를 사용
하면 변수들을
하나로 묶을 수
있습니다.
5
구조체 정의
구조체
그룹을 지어줘야 POINT 정의
하는 데이터 변수
double xPos;
double yPos;
구조체를 기반으로
변수 xPos와 yPos
를 묶음
6
구조체 변수 선언
■ 구조체 정의와 구조체 변수 선언은 다르다.
7
구조체의 초기화
■ 중괄호를 이용하여 초기값을 나열한다.
struct student {
int number;
char name[10];
double grade;
};
struct student s1 = { 24, "Kim", 4.3 };
8
struct point
{ ∙ 정의가 이뤄지고 난 다음부터 point는 변수의 선언
double xPos; 에 사용되는 자료형의 이름으로 인식 됨.
double yPos; ∙ 즉, point라는 이름은 프로그래머가 정의한 자료형
};
기본 자료형 double과
구조체 자료형 point
double point 비교
■ 데이터들의 일반적인 특징
▶ 소프트웨어 개발 과정에서 표현하는 데이터들은 그룹을 형성한다.
주소
록관
프로 리
그램
int main(void)
{
double num;
struct point pnt;
Typedef 이용 구조체 선언
typedef
struct point struct point 사용
{ {
double xPos; double xPos;
double yPos; double yPos; POINT가 struct point를
}; };
대신하도록 typedef 선언
p1.xPos=0.1, p1.yPos=0.2;
p2.xPos=2.4, p2.yPos=2.5;
typedef과 #define 비교
■ 이식성을 높여준다.
▶ 코드를 컴퓨터 하드웨어에 독립적으로 만들 수 있다
▶ (예) int형은 2바이트이기도 하고 4바이트, int형 대신에 typedef을 이용
한 INT32나 INT16을 사용하게 되면 확실하게 2바이트인지 4바이트인지
를 지정할 수 있다.
구조체 변수의 활용
■ 함수의 인자로 전달 및 반환 가능
■ 대입연산자의 피연산자로 사용 가능
int main(void)
{
point p1, p2, p3;
p1.xPos=0.5;
p1.yPos=1.5;
p2=p1;
p3=IncrePos(p2);
....
}
17
int main(void)
{
PERSON p1, p2; 구조체 변수를
....
이용한 사칙연산
p1=p1+p2; 불가능
....
}
19
구조체 변수 활용 방법
struct __point
{
double xPos;
double yPos;
};
typedef struct __point point;
int main(void)
{
point p1, p2, p3;
p1.xPos=0.5;
p1.yPos=1.5;
p2=p1;
p3=IncrePos(p2);
int main(void)
{
person jongsoo; 구조체 person의 멤버인 char형 배열
person copyman; 을 초기화 하기 위해 strcpy 함수 사용
strcpy( jongsoo.name, "한종수");
strcpy( jongsoo.ID, "900218-1012589");
jongsoo.age=20;
구조체 변수 jongsoo에 저장된 값
copyman=jongsoo; 을 동일한 자료형 변수인 copyman
ShowPersonData(copyman);
return 0;
에 대입연산을 통해 복사
}
21
struct __person
{
char name[NAME_LEN]; // 이름
char ID[PID_LEN]; // 주민등록번호
unsigned int age; // 나이
};
typedef struct __person person;
int main(void)
{
person jongsoo;
person copyman;
strcpy( jongsoo.name, "김한양");
strcpy( jongsoo.ID, "970218-2234589");
jongsoo.age=20;
copyman=jongsoo;
ShowPersonData(copyman);
return 0;
}
23
int main(void)
{
person jongsoo;
person copyman; 구조체 변수의 포인터
person * personPtr;
선언방식
strcpy( jongsoo.name, "한종수");
strcpy( jongsoo.ID, "900218-1012589");
jongsoo.age=20;
copyman=jongsoo;
personPtr=©man;
ShowPersonData(personPtr); 접근 방식 2
struct __person
{
char name[NAME_LEN]; // 이름
char ID[PID_LEN]; // 주민등록번호
unsigned int age; // 나이
};
typedef struct __person person;
int main(void)
{
person jongsoo;
person copyman;
person * personPtr;
strcpy(jongsoo.name, "한종수");
strcpy(jongsoo.ID, "900218-1012589");
jongsoo.age=20;
copyman=jongsoo;
personPtr=©man;
ShowPersonData(personPtr);
return 0;
}
26
int main(void)
{
person jongsoo={"한종수", "900218-1012589", 20};
person sungeun={"이성은", "910218-1012589", 19};
ShowPersonData(&jongsoo);
ShowPersonData(&sungeun);
return 0;
}
27
■ 구조체 배열
▶ 구조체도 필요에 따라 배열의 형
typedef struct __person
태로 선언 가능 {
char name[30];
▶ 선언방식이 기본 자료형의 배열 char ID[15];
unsigned int age;
선언방식과 동일 } person;
int main(void)
{
int i;
person personArr[3]={
{"한종수", "900218-1012589", 20},
{"이성은", "910218-1012589", 19},
1. person 구조체 배열을 선언과 동시에 {"윤지민", "930218-1012589", 17}
초기화 };
2. 초기화 방식은 각각의 구조체 변수를
....
초기화 할 데이터들의 집합으로 다시
한 번 중괄호로 묶음 return 0;
}
29
int main(void)
{
int i;
person personArr[ARRY_LEN]={
{"한종수", "900218-1012589", 20},
{"이성은", "910218-1012589", 19},
{"윤지민", "930218-1012589", 17}
};
자기 참조 구조체(Self-Referential Structures)
▶ 자기자신과 동일한 자료형의 구조체 변수를 참조할 수 있도록 정의된 구조체
하나의 box형 구조체 변수가
typedef struct box 다른 box형 구조체 변수의 주
{ 소 값을 저장할 수 있는 형태
int data;
struct box * boxRef;
} box;
int main(void)
{
int i;
box * bxPtr;
b2.boxRef=&b1;
....
32
자기 참조 구조체 활용 예
typedef struct box
{ 구조체 box의 멤버로는 구
int data; 조체 box의 포인터 변수가
struct box * boxRef;
} box; 올 수 있다.
int main(void)
{
int i;
box * bxPtr;
b1.boxRef=&b2;
b2.boxRef=&b1;
bxPtr=&b1;
공용체
■ 공용체(union)
▶ 같은 메모리 영역을 여러 개의 변수가 공유
▶ 공용체를 선언하고 사용하는 방법은 구조체와 아주 비슷
union example {
char c; // 같은 공간 공유
int i; // 같은 공간 공유
};
34
공용체
#include <stdio.h>
union example {
공용체 선언
int i;
char c;
};
공용체 변수 선언.
int main(void)
{ char 형으로 참조.
union example v;
v.c = 'A';
printf("v.c:%c v.i:%i\n", v.c, v.i );
v.c:A v.i:-858993599
v.c:† v.i:10000
35
공용체에 타입 필드 사용
#include <stdio.h>
#include <string.h>
#define STU_NUMBER 1
#define REG_NUMBER 2
struct student {
int type;
union {
int stu_number; // 학번
char reg_number[15]; // 주민등록번호
} id;
char name[20];
};
36
공용체에 타입 필드 사용
공용체에 타입 필드 사용
학번: 20190001
이름: 홍길동
주민등록번호: 860101-1056076
int main(void) 이름: 김철수
{
struct student s1, s2;
s1.type = STU_NUMBER;
s1.id.stu_number = 20190001;
strcpy(s1.name, "홍길동");
s2.type = REG_NUMBER;
strcpy(s2.id.reg_number, "860101-1056076");
strcpy(s2.name, "김철수");
print(s1);
print(s2);
}
38
열거형
■ 열거형(enumeration)이란 변수가 가질 수 있는 값들을 미리 열거해
놓은 자료형
■ (예) 요일을 저장하고 있는 변수는 { 일요일, 월요일, 화요일, 수요일,
목요일, 금요일, 토요일 } 중의 하나의 값만 가질 수 있다.
39
열거형 선언
열거형 변수 선언
enum days today;
today = SUN; // OK!
40
열거형의 필요성
■ 다음과 같이 프로그램을 작성할 수 있다.
▶ int today;
▶ today = 0; // 일요일
▶ today = 1; // 월요일
열거형 초기화
• 값을 지정하기
않으면 0부터
할당
enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; // SUN=0, MON=1, ...
enum days { SUN=1, MON, TUE, WED, THU, FRI, SAT }; // SUN=1, MON=2, ...
enum days { SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6 };// SUN=7, MON=1, ...
ex)
enum colors { white, red, blue, green, black };
enum boolean { false, true };
enum levels { low, medium, high };
enum car_types { sedan, suv, sports_car, van, pickup, convertible };
예제
#include <stdio.h>
enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
char *days_name[] = {
"sunday", "monday", "tuesday", "wednesday", "thursday", "friday",
"saturday" };
int main(void)
{
enum days d;
d = WED;
printf("%d번째 요일은 %s입니다\n", d, days_name[d]);
return 0;
}
열거형과 다른 방법과의 비교
정수 사용 기호 상수 열거형
#define LCD 1 enum tvtype { LCD, OLED };
#define OLED 2 enum tvtype code;
switch(code) {
case 1:
switch(code) { switch(code) {
printf("LCD TV\n");
case LCD: case LCD:
break;
printf("LCD TV\n"); printf("LCD TV\n");
case 2:
break; break;
printf(“OLED TV\n");
case OLED: case PDP:
break;
printf(“OLED TV\n"); printf(“OLED TV\n");
}
break; break;
} }
컴퓨터는 알기 쉬우나 사람은 기호 상수를 작성할 때 오류를 컴파일러가 중복이 일어나지 않
기억하기 어렵다. 저지를 수 있다. 도록 체크한다.