본문 바로가기

방송통신대학교

C++로 가중이동평균을 계산하는 클래스 설계와 구현하기

728x90
반응형
728x170

안녕하세요, 여러분! C++에 입문한 많은 분들이 객체 지향 프로그래밍과 클래스를 활용하는 방법에 대해 궁금하실텐데요. 오늘은 바로 그 중 하나인 '가중이동평균'을 계산하는 클래스를 설계하고 구현하는 방법에 대해 알아보려고 합니다. 덤으로, 여러분의 프로그래밍 실력도 향상시킬 수 있는 좋은 기회가 될 것입니다! 😄

 

먼저, 가중이동평균(weighted moving average)에 대한 간략한 설명부터 시작하겠습니다.

가중이동평균은 데이터의 특정 구간에서의 평균값을 계산할 때, 각 데이터마다 다른 가중치를 줘서 계산하는 방법입니다. 이는 최근의 데이터에 더 큰 가중치를 부여하므로, 최근의 변동성을 잘 반영할 수 있습니다.

 

그럼 C++로 가중이동평균 클래스를 만들어봅시다!

#include <iostream>
using namespace std;

class WeightedMovingAverage {
private:
    double* values;      // 데이터를 저장할 배열
    double* weights;     // 가중치를 저장할 배열
    int size;            // 데이터의 크기
    int currentIndex;    // 현재 데이터의 위치

public:
    // 생성자
    WeightedMovingAverage(int n, double* w) : size(n), currentIndex(0) {
        values = new double[n]();
        weights = new double[n]();

        for (int i = 0; i < n; i++) {
            weights[i] = w[i];
        }
    }

    // 소멸자
    ~WeightedMovingAverage() {
        delete[] values;
        delete[] weights;
    }

    // 가중이동평균 재설정 함수
    void reset(int n, double* w) {
        if (n < 1) return;

        delete[] values;
        delete[] weights;

        size = n;
        values = new double[n]();
        weights = new double[n]();

        for (int i = 0; i < n; i++) {
            weights[i] = w[i];
        }
    }

    // 값 전달 함수
    void addValue(double value) {
        values[currentIndex % size] = value;
        currentIndex++;
    }

    // 가중이동평균 계산 함수
    double getWMA() {
        double sum = 0;
        double weightSum = 0;

        int dataSize = (currentIndex < size) ? currentIndex : size;

        for (int i = 0; i < dataSize; i++) {
            sum += values[(currentIndex - 1 - i) % size] * weights[i];
            weightSum += weights[i];
        }

        return sum / weightSum;
    }
};

int main() {
    double weights[] = {0.5, 0.3, 0.15, 0.05};
    WeightedMovingAverage wma(4, weights);

    wma.addValue(10);
    wma.addValue(5);
    wma.addValue(8);
    wma.addValue(12);
    wma.addValue(10);
    wma.addValue(14);

    cout << "가중이동평균: " << wma.getWMA() << endl;

    return 0;
}

이렇게 클래스를 설계하고 구현하면 간단한 메인 함수를 통해 원하는 가중이동평균 값을 얻을 수 있습니다. 여러분도 이 코드를 활용하여 다양한 데이터와 가중치로 실험해 보세요!

 

추가적으로 아래 내용을 붙여서 작성해볼게요~

  1. 클래스의 멤버함수 및 용도를 표로 작성
  2. 클래스의 데이터멤버 및 용도를 표로 작성
  3. 각각의 클래스 멤버함수에 대해 다음 내용 작성
    3-1. 매개변수의 자료형 및 용도
    3-2. 반환 값이 있다면 값의 의미 및 자료형
    3-3. 처리 내용의 설명(형식 제한 없음)

 

1. 클래스의 멤버함수 및 용도

멤버함수 용도
WeightedMovingAverage 생성자: 초기 크기와 가중치를 설정하며 메모리 할당
~WeightedMovingAverage 소멸자: 동적 할당한 메모리 해제
reset 가중이동평균 재설정: 크기 및 가중치 재설정
addValue 값 전달: 가중이동평균 객체에 새로운 값을 추가
getWMA 가중이동평균 계산: 최근 n개의 값의 가중이동평균 반환

2. 클래스의 데이터멤버 및 용도

데이터멤버 자료형 용도
values double* 데이터를 저장하기 위한 동적 배열
weights double* 가중치를 저장하기 위한 동적 배열
size int 데이터의 크기를 저장
currentIndex int 현재 데이터의 위치를 저장

3. 각각의 클래스 멤버함수에 대한 설명

3-1. WeightedMovingAverage

  • 매개변수:
    • int n: 데이터의 크기. 이동평균을 구할 데이터의 개수
    • double* w: 가중치 배열
  • 반환 값: 없음
  • 처리 내용: 초기 크기와 가중치를 설정하며 동적으로 메모리를 할당한다.

3-2. ~WeightedMovingAverage

  • 매개변수: 없음
  • 반환 값: 없음
  • 처리 내용: 동적으로 할당된 메모리를 해제한다.

3-3. reset

  • 매개변수:
    • int n: 새로운 데이터의 크기
    • double* w: 새로운 가중치 배열
  • 반환 값: 없음
  • 처리 내용: 기존에 저장된 데이터와 가중치를 제거하고 새로운 크기 및 가중치로 재설정한다.

3-4. addValue

  • 매개변수:
    • double value: 새로운 데이터 값
  • 반환 값: 없음
  • 처리 내용: 새로운 값을 데이터 배열에 추가하고, currentIndex를 업데이트한다.

3-5. getWMA

  • 매개변수: 없음
  • 반환 값:
    • double: 최근 n개의 값의 가중이동평균
  • 처리 내용: 객체에 저장된 최근 n개의 데이터를 기반으로 가중이동평균을 계산하고 반환한다.

위와 같이 클래스의 멤버함수와 데이터멤버에 대한 설명을 표로 정리하였습니다. 클래스 설계 및 구현 시 이러한 정보를 미리 정리하면 더욱 체계적으로 코드를 작성할 수 있습니다.

 

결론적으로, C++ 클래스를 활용하여 가중이동평균을 계산하는 방법에 대해 알아보았습니다. 이를 통해 여러분은 C++의 객체 지향 프로그래밍 기법을 익히고 실력을 향상시킬 수 있을 것입니다. 다음 번에도 유익한 정보로 찾아뵙겠습니다. 화이팅! 😊

728x90
반응형
그리드형