벡터(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() 메서드를 활용하면 벡터의 크기도 손쉽게 계산할 수 있으니, 직접 코드를 실행하며 다양한 벡터 연산을 확장해 보시기 바랍니다.