「구조체」
- 여러 개의 변수들을 묶어서 새로운 자료형을 만드는 방법
int number;
char name[10];
double price;
구조체 선언->
struct stock{
int number;
char name[10];
double price;
};
stock: 구조체 정의하는 키워드
stock: 구조체 이름(태그)
구조체 멤버들->
int number;
char name[10];
double price;
> 태그는 구조체와 구조체를 구별하기 위해서 구조체에 붙여지는 이름이다. 태그 다음에 중괄호를 써주고 중괄호 사이에 원하는 변수를 선언하면 된다. 이렇게 선언된 변수들을 구조체 멤버라고 한다. 구조체 멤버는 구조체에 포함되는 변수이며 어떠한 자료형의 변수도 구조체의 멤버가 될 수 있지만, 모두 유일한 이름을 가져야 한다. 그리고 구조체 선언이 끝나면 반드시 ;(세미클론)을 붙여줘야 한다.
> 주의할 점은 구조체 선언은 변수 선언이 아니라는 것이다. 구조체 선언은 구조체의 틀만 선언하는 것이다.
「구조체 변수 선언」
//구조체 변수 선언
struct stock{
int number;
char name[10];
double price;
};
int main(void)[
struckt stock s1;
...
}
//구조체 정의와 변수 동시 선언
struct stock{
int number;
char name[10];
double price;
} s1;
「구조체 초기화」
struct stock{
int number;
char name[10];
double price;
};
struct stock s1={035420,'NAVER',172000}
struck stock s2={005930,'삼성전자','59900}
「구조체 멤버 참조」
구조체변수.구조체멤버=0.0
->
s2.price=59900
- 만약 문자가 문자 배열이라면 strcpy를 사용한다
strcpy(s1.name,"NAVER"};
「이름 없는 구조체」
> 구조체를 정의할 때는 이름을 생략해도 상관없다. 하지만 이 경우 구조체의 이름이 없으므로 구조체의 변수를 더 이상 생성할 수 없다. 따라서 필요한 모든 구조체 변수를 구조체 정의와 함께 선언해야 한다.
struct stock{
int number;
char name[10];
double price;
}s1,s2;
「구조체를 멤버로 가지는 구조체」
struck ex_rate{
double usd;
double jpy;
double eur;
double gbp;
struct stock{
int number;
char name[10];
double price;
struck ex_rate ex;
}s1,s2;
s1.ex.usd=1411.90;
s1.ex.jpy=959.14;
s1.ex.eur=1400.89;
s1.ex.gbp=1596.79;
「구조체 변수의 대입과 비교」
struck point{
int x;
int y;
};
struct point p1={10,20};
struct point p2={30,40};
-> 대입 방법
p2=p1; //good
p2.x=p1.x //good
p2.y=p1.y //good
//비교방법
if((p1.x==p2.x)&&(p1.y==p2.y)){
.....
}
「구조체 배열」
struct stock{
int number;
char name[10];
double price;
};
struck stock list[200];
list[2].number=000660
strcpy(list[2].name='sk하이닉스');
list[2].price=86400;
- 구조체 배열 초기화
struck stock list[3]={
{005930,"삼성전자",60200},
{000660,"sk하이닉스",86400},
{373220,"lg에너지솔루션",586000}
};
「포인터와 구조체」
- 구조체에서 포인터를 사용하는 경우는 다음의 경우이다
- 구조체를 가리키는 포인터
- 포인터를 멤버로 가지는 구조체
- 구조체를 가지는 포인터
struct stock s2={00660,"sk하이닉스",86400};
struct stock *p;
p=&s;
printf(".......", (*p).number, (*p).name, (*p).price);
- 간접 멤버 연산자
(*p). number: 포인터 p가 가리키는 구조체의 멤버 number를 의미
p->number: 포인터p가 가리키는 구조체의 멤버 number를 의미하며 (*p). number와 의미는 동일
*p.number: 연산자 우선순위에 의해서 (*p.number)와 동일. 구조체 p의 멤버 number가 가리키는 것이란 의미이다. 이때 number는 반드시 포인터여야 한다. 아니라면 오류가 발생한다
*p->number: 연산자 우선순위에 의해서 *(p->number)와 같다. p가 가리키는 구조체의 멤버 number가 가리키는 내용을 의미한다. 만약 number가 포인터가 아니라면 오류가 발생한다.
「구조체와 함수」
- 구조체는 함수의 인수로도 사용이 가능하고 함수에서 반환값으로 반환될 수 있다. 구조체가 인수나 반환값으로 사용될 때는 "값에 의한 호출"을 원칙이 적용된다. 구조체 변수의 모든 내용이 복사되어 함수로 전달되며 함수에는 구조체의 복사본이 인수로 전달되므로 함수 안에서 인수의 값이 변경되더라도 원본 구조체에 영향을 주지 않는다.
단점> 구조체의 크기가 클 경우에는 상당한 시간이 소모된다. 이러한 경우에는 구조체를 직접 전달하거나 반환하기보다는 구조체의 포인터를 사용한다.
- 구조체를 함수의 인수로 넘기는 경우, 다른 기본형을 넘길 때와 동일하게 구조체의 복사본이 함수로 전달된다. 따라서 구조체의 크기가 크면 그만큼 시간과 메모리가 소모된다.
「열거형」
- 변수가 가질 수 있는 값들을 나열해 놓은 자료형
//정의
열겨형을정의하는키워드 열거형이름(태그) {열거형의 자료형들} //
// 열거형은 기호상수들이 모여있는 자료형임
enum nasdaq {msft,amzn, intl,aple,f,ba};
> 구조체의 정의처럼 변수를 찍어낼 수 있는 틀만 생성한 것이다
- 구조체 선언
enum nasdaq name;
name=msft;
「typedef」
- typedef는 자료형을 정의하는 것이다.
typedef 기본의자료형 새자료형;
typedef unsighend char BYTE;
//정의하는 방법
BYTE index;
typedef int INT16;
typedef short INT32;
INT32 i;
INT16 k;
- 구조체로 자료형 만들기
struck point{
int x;
int y;
};
typedef struct point POINT;
POINT a,b;
typedef struct point{
int x;
int y;
}POINT;
- 구조체 장점
- 이식성을 높여준다
- 문서화의 역할도 한다