Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 클래스로 벡터 구현하기: 연산자 오버로딩으로 배우는 벡터 연산

벡터(vector)는 크기(magnitude)방향(direction)을 모두 가지는 물리량입니다. 이번 글에서는 C++의 클래스를 활용해 3차원 벡터를 직접 구현하고, 덧셈·뺄셈·내적·외적 같은 기본 연산을 수행하는 방법을 단계별로 알아보겠습니다.

핵심 원리: 연산자 오버로딩

C++의 연산자 오버로딩(operator overloading)을 사용하면 사용자 정의 타입에도 +, -, *, ^ 등의 연산자를 기본 자료형처럼 자연스럽게 적용할 수 있습니다. 벡터 클래스에 이 기술을 적용하면 복잡한 함수 호출 없이 수학 표현식 그대로 직관적인 코드를 작성할 수 있다는 장점이 있습니다.

전체 예제 코드

#include <cmath>
#include <iostream>
using namespace std;
class Vector {
    private:
    int x, y, z;
    // 벡터의 성분
    public:
    Vector(int x, int y, int z){
        this->x = x;
        this->y = y;
        this->z = z;
    }
    Vector operator+(Vector v);
    Vector operator-(Vector v);
    int operator^(Vector v);
    Vector operator*(Vector v);
    float magnitude(){
        return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
    }
    friend ostream& operator<<(ostream& out, const Vector& v);
    // 벡터 출력
};
// 벡터의 덧셈
Vector Vector::operator+(Vector v){
    int x1, y1, z1;
    x1 = x + v.x;
    y1 = y + v.y;
    z1 = z + v.z;
    return Vector(x1, y1, z1);
}
// 벡터의 뺄셈
Vector Vector::operator-(Vector v){
    int x1, y1, z1;
    x1 = x - v.x;
    y1 = y - v.y;
    z1 = z - v.z;
    return Vector(x1, y1, z1);
}
// 벡터의 내적
int Vector::operator^(Vector v){
    int x1, y1, z1;
    x1 = x * v.x;
    y1 = y * v.y;
    z1 = z * v.z;
    return (x1 + y1 + z1);
}
// 벡터의 외적
Vector Vector::operator*(Vector v){
    int x1, y1, z1;
    x1 = y * v.z - z * v.y;
    y1 = z * v.x - x * v.z;
    z1 = x * v.y - y * v.x;
    return Vector(x1, y1, z1);
}
ostream& operator<<(ostream& out, const Vector& v){
    out << v.x << "i ";
    if (v.y >= 0)
        out << "+ ";
    out << v.y << "j ";
    if (v.z >= 0)
        out << "+ ";
    out << v.z << "k" << endl;
    return out;
}
int main(){
    Vector V1(3, 4, 2), V2(6, 3, 9);
    cout << "V1 = " << V1;
    cout << "V2 = " << V2;
    cout << "V1 + V2 = " << (V1 + V2);
    cout << "Dot Product is : " << (V1 ^ V2);
    cout << "Cross Product is : " << (V1 * V2);
    return 0;
}

코드 상세 설명

1. Vector 클래스 정의

벡터의 x, y, z 성분을 private 멤버 변수로 선언하고 생성자에서 초기화합니다. 또한 벡터의 크기를 구하는 magnitude() 메서드와 각종 연산자 함수를 public 영역에 배치해 외부에서 자유롭게 사용할 수 있도록 구성했습니다.

2. 벡터의 덧셈과 뺄셈 (operator+, operator-)

두 벡터의 대응되는 성분끼리 각각 더하거나 빼서 새로운 Vector 객체를 반환합니다. 예를 들어 (x1, y1, z1) + (x2, y2, z2)의 결과는 (x1+x2, y1+y2, z1+z2)가 됩니다.

3. 내적 (operator^)

두 벡터의 각 성분을 서로 곱한 뒤 모두 더한 값을 반환합니다. 내적의 결과는 벡터가 아닌 스칼라(int)라는 점에 유의하세요.

4. 외적 (operator*)

외적 공식에 따라 계산한 결과를 새로운 Vector 객체로 반환합니다. 외적의 결과 벡터는 원래 두 벡터 모두에 수직이라는 성질을 가집니다.

5. 출력 연산자 (operator<<)

friend로 선언된 출력 연산자는 벡터를 'xi + yj + zk' 형태로 보기 좋게 화면에 출력합니다. 성분이 음수일 때 부호가 중복 출력되지 않도록 조건문으로 처리한 점이 특징입니다.

실행 결과

V1 = 3i + 4j + 2k
V2 = 6i + 3j + 9k
V1 + V2 = 9i + 7j + 11k
Dot Product is : 48
Cross Product is : 30i -15j -15k

마무리

이처럼 클래스와 연산자 오버로딩을 활용하면 수학적 개념인 벡터를 C++ 코드로 깔끔하게 표현할 수 있습니다. 예제에 포함된 magnitude() 메서드를 활용하면 벡터의 크기도 손쉽게 계산할 수 있으니, 직접 코드를 실행하며 다양한 벡터 연산을 확장해 보시기 바랍니다.