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);
}