ProgramingLagnuage/C++
[C++] 사용자 정의 유형 - Structure
TSpoons
2024. 9. 23. 07:00
- 기본 struct 정의 : 여러 데이터를 하나로 묶어 새로운 데이터 타입 정의
struct Vector {
int sz; // 원소의 개수를 저장하는 정수형 변수
double∗ elem; // 원소들을 가리키는 포인터
};
- 구조체 선언
Vector v;
이 상태에서는 v의 포인터 elem이 아무것도 가리키지 않기 때문에 의미가 없다.
- 동적 메모리 할당
void vector_init(Vector& v, int s){
v.elem = new double[s]; // s개의 double을 저장할 수 있는 배열을 할당
v.sz = s; // sz에 원소의 개수를 저장
}
new double[s]는 동적 메모리 할당을 통해 s개의 double 타입 원소를 저장할 수 있는 배열을 생성하고, 그 배열의 시작 주소를 elem에 저장합니다.
&는 참조자를 의미합니다. 함수에서 Vector를 참조로 받음으로써 원본 변수를 수정할 수 있습니다.
- 동적 배열 사용 및 합계 계산 (read_and_sum 함수)
Vector를 이용해 몇 가지 기능을 구현할 수 있습니다. 예를 들어, 사용자가 입력한 값을 저장하고, 그 값들의 합계를 구하는 함수를 작성할 수 있습니다.
double read_and_sum(int s)
{
Vector v;
vector_init(v, s); // s개의 double을 저장할 공간 할당
for (int i = 0; i != s; ++i)
std::cin >> v.elem[i]; // 사용자가 입력한 값을 배열에 저장
double sum = 0;
for (int i = 0; i != s; ++i)
sum += v.elem[i]; // 입력된 값들의 합을 계산
return sum; // 합을 반환
}
- 구조체 멤버 접근
구조체의 멤버를 접근하는 방법은 두 가지가 있습니다:
- **점(.)**을 사용하여 직접 접근: 구조체 변수나 참조자로 멤버를 직접 참조할 때 사용합니다.
- **화살표(->)**를 사용하여 포인터로 접근: 구조체 포인터를 사용해 멤버를 참조할 때 사용합니다.
void f(Vector v, Vector& rv, Vector* pv)
{
int i1 = v.sz; // 이름을 통한 접근 (직접 접근)
int i2 = rv.sz; // 참조자를 통한 접근
int i3 = pv->sz; // 포인터를 통한 접근
}
사용자는 Vector의 내부 구현을 직접 알아야 하고, 수동으로 메모리를 관리해야 하므로 **표준 라이브러리의 vector**처럼 직관적이지 않습니다. 따라서, 더 나은 구조체와 클래스 설계를 통해 이를 개선할 수 있습니다.
결론
- struct는 여러 데이터를 묶어 사용자 정의 타입을 만드는 데 사용됩니다.
- new 연산자를 통해 동적으로 메모리를 할당하여 동적 배열을 만들 수 있습니다.
- . 연산자와 -> 연산자를 통해 구조체 멤버에 접근할 수 있습니다.
- C++의 표준 라이브러리는 이러한 작업을 쉽게 할 수 있도록 여러 가지 유용한 기능(vector, string 등)을 제공하므로, 가능한 표준 라이브러리를 사용하는 것이 좋습니다.
#include <iostream>
using namespace std;
struct Vector{
int sz;
double* elem;
};
void vector_init(Vector& v, int s){
v.elem = new double[s]; // s개의 double을 저장할 수 있는 배열을 할당
v.sz = s; // sz에 원소의 개수를 저장
};
double read_and_sum(int s){
Vector v;
vector_init(v,s);
for(int i=0; i!=s; ++i)
cin >> v.elem[i];
double sum = 0;
for(int i=0; i!=s; ++i)
sum += v.elem[i];
return sum;
}
int main(){
cout << read_and_sum(5);
}