[ 6주차 - 1 ]
구조체 ( structure )
구조체 : 하나의 이름으로 참조되는 변수들의 모임으로 군집 자료형 ( aggregate data type ) 이라고도 하며,
복합 ( compound ) 자료형이라 부른다.
멤버( member ) : 구조체를 구성하는 변수 ( 원소( element ) 또는 필드( field ) 라고도 부름 )
struct struct-type-name {
type element_name1;
type element_name2;
type element_name3;
type element_name4;
...
}struct_variables;
메모리에 저장된 inv_var 구조체
struct inv_type{
char item[40]; //40byte
double cost; //8byte
double retail; //8byte
int on_hand; //4byte
int lead_time; //4byte
};
struct inv_type inv_var;
구조체 변수를 선언하는 순간에 64byte 크기의 메모리가 할당된다.
구조체 멤버에 접근하기 : 개개의 구조체 멤버는 도트 연산자를 사용하여 접근한다.
//structuture-varname.member-name;
//ex)
int_var.cost = 10.39;
//구조체 배열
inv_type invtry[100];
//멤버에 접근
invtry[2].on_hand;
#include <iostream>
#include <cmath>
using namespace std;
struct point {
int x, y;
};
int main() {
struct point p1, p2;
double dist;
cout << "p1의 x,y 좌표를 입력하세요 : ";
cin >> p1.x;
cin >> p1.y;
cout << "p2의 x,y 좌표를 입력하세요 : ";
cin >> p2.x;
cin >> p2.y;
dist = sqrt(pow(float(p2.x - p1.x), 2) + pow(float(p2.y - p1.y), 2));
cout << "두 점 사이의 거리 : " << dist;
return 0;
}
함수에게 구조체 전달하기
- 전체적인 구조체가 걊에 의한 호출 방식의 매개 변수 전달 방식에 의해 전달이 된다.
- 큰 구조체를 전달하는 것은 상당한 시간 지체를 야기한다. → 주소를 전달해서 시간을 단축시키는 것이 좋음
- 인수의 데이터 타입이 매개 변수의 데이터 타입과 일치해야 한다.
#include <iostream>
using namespace std;
struct sample {
int a;
char ch;
};
void f1(sample parm);
int main() {
struct sample arg;
arg.a = 1000;
arg.ch = 'X';
f1(arg);
return 0;
}
void f1(sample parm) {
cout << parm.a << " " << parm.ch;
cout << "\n";
}
//▶ 1000 X
구조체 치환하기
두 구조체가 같은 구조체 형일 때 하나의 구조체를 다른 구조체에 치환할 수 있다.
서로 다른 구조체 형이라면 컴파일 에러가 나게 된다.
#include <iostream>
using namespace std;
struct stype {
int a, b;
};
int main() {
stype svar1, svar2;
svar1.a = svar1.b = 10;
svar2.a = svar2.b = 20;
cout << "< 구조체 치환 전 > \n";
cout << "svar1 a b : " << svar1.a << "\t" << svar1.b << "\n";
cout << "svar2 a b : " << svar2.a << "\t" << svar2.b << "\n";
svar2 = svar1; // 구조체를 치환한다.
cout << "\n\n< 구조체 치환 후 > \n";
cout << "svar1 a b : " << svar1.a <<"\t" << svar1.b << "\n";
cout << "svar2 a b : " << svar2.a << "\t" << svar2.b << "\n";
return 0;
}
//▶ < 구조체 치환 전 >
// svar1 a b : 10 10
// svar2 a b : 20 20
// < 구조체 치환 후 >
// svar1 a b : 10 10
// svar2 a b : 10 10
구조체에 대한 포인터와 화살표 연산자
구조체 포인터는 다른 포인터 변수를 선언하는 것과 같이 선언된다.
inv_type *inv_pointer
struct bal{
float balance;
char name[80];
}person; //person만이 메모리를 할당받는다.
bal *p; // 구조체 포인터를 선언
p = &person; // 구조체 변수인 person의 주소
p -> balance; // 화살표 연산자
p에는 bal이라는 구조체 변수의 주소를 저장해줘야한다. 다른 변수의 주소를 저장하면 안된다.
구조체 변수를 통해서 멤버에 접근할 때는 '.'을 사용해야 하지만, 구조체 변수의 주소를 갖고 있는 포인터 변수를
이용할 때는 화살표 연산자를 이용해서 멤버에 접근해야 한다.
큰 구조체가 함수에게 전달될 때 일어나는 시간 지체 때문에 많은 경우에 구조체에 대한 포인터만 전달한다.
#include <iostream>
#include <ctime>
using namespace std;
struct mytm{ // 분리된 시간을 나타내는 구조체
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday; // 일요일 이래로 날 수 0~6
int tm_yday; // 1월 1일 이래로 날 수 0~365
int tm_isdst;
};
// 달력 시간을 분리된 시간으로 변환하는 함수
// localtime 시간은 현재 컴퓨터 시간임
// time_t는 시스템에 정의되어있는 자료형
struct mytm *localtime_s(const time_t *curtime);
int main() {
struct mytm *ptr;
time_t lt;
lt = time('\0'); //달력 시간을 얻는다.
ptr = localtime_s(<); // 달력 시간을 분리된 시간으로 변환한다.
cout << ptr->tm_hour << " : " << ptr->tm_min;
cout << " : " << ptr->tm_sec;
return 0;
}
구조체에 대한 참조
구조체 참조는 함수 매개변수 또는 함수 반환형으로 흔히 사용
구조체 참조를 통해 멤버들을 접근할 때, '.'을 사용한다.
화살표 연산자는 포인터를 통해서 멤버들을 접근할 때만 사용한다.
struct mystruct{
int a,b;
}
int func( mystruct &svar){ //svar는 참조형 매개변수이다.
svar.a = 10;
svar.b = 50;
...
}
func 함수를 호출할 때 구조체 변수를 인수로 주게 되면, 구조체 변수의 주소가 참조형 매개변수 이므로
svar에 전달이 된다. svar.a = 10이라 하면 10이라는 값이 인수로 명시되어 있는 참조형 매개변수의 멤버에
들어가게 된다.
구조체 내의 배열과 구조체
1. 구조체 내의 배열
//구조체 내의 배열
struct stype {
int nums[10][10];
float b;
}var;
//구조체 내의 배열 접근
var.nums[3][7];
2. 중첩된 구조체
struct addr {
char name[40];
char street[40];
char city[40];
char zip[10];
};
struct emp {
addr address;
float wage;
}worker;
3. 구조체는 멤버로써 구조체에 대한 포인터를 포함할 수 있다.
→ 자료구조에 많이 사용하게 된다.
struct mystruct {
int a;
char str[80];
mystruct *sptr; // mystruct 구조체에 대한 포인터
};
비트 필드
하드웨어나 임베디드 시스템 컨트롤 프로그램을 작성할 때 주로 사용된다.
한 바이트 내의 단일 비트를 엑세스하는 방법을 제공한다. 각각의 비트가 의미를 가지고 있음.
공용체 ( union )
같은 메모리 위치를 공유하는 둘 또는 그 이상의 변수들로 구성
공용체는 같은 비트 형태를 둘 또는 그 이상의 다른 방법으로 표현하는 방법을 제공한다.
공용체는 권장되지 않음 → 같은 메모리를 서로 다른 자료형으로 사용하게 되면 실수하기 쉬움
메모리를 절약하기 위해 과거에 썼던 기능임
union utype{
short int i;
char ch;
};
utype u_var;
실습문제
구조체를 사용하여 5개의 좌표값을 갖는 배열을 선언하고, 5개의 좌표값을 읽어 들이기.
그리고 각 좌표값에 대해 원점까지의 거리를 계산하여 가장 가까운 좌표값을 출력하기.
#include <iostream>
#include <cmath>
using namespace std;
struct point {
int x, y;
};
int main() {
point p[5];
double dist[5] = { 0, };
for (int i = 0; i < 5; i++) {
cout << i + 1 << "번째 좌표값 (x,y)를 입력하기 : ";
cin >> p[i].x >> p[i].y;
}
for (int i = 0; i < 5; i++) {
dist[i] = sqrt(pow(p[i].x, 2) + pow(p[i].y, 2));
}
double min = dist[0];
int minIndex = 0;
for (int i = 1; i < 5; i++) {
if (min > dist[i]) {
min = dist[i];
minIndex = i;
}
}
cout << "원점과 가장 가까운 좌표값 ( " << p[minIndex].x << " , " << p[minIndex].y << " ) 거리 : " << min;
return 0;
}
'2CHAECHAE 학교생활 > 객체지향프로그래밍(C++)' 카테고리의 다른 글
[ 객체지향프로그래밍(C++) 7주차 ① ] (0) | 2022.04.16 |
---|---|
[ 객체지향프로그래밍(C++) 6주차 ② ] (0) | 2022.04.11 |
[ 객체지향프로그래밍(C++) 5주차 ② ] (0) | 2022.04.01 |
[ 객체지향프로그래밍(C++) 5주차 ① ] (0) | 2022.04.01 |
[ 객체지향프로그래밍(C++) 4주차 ② ] (0) | 2022.03.28 |