C Programming Language/C++

C++ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©(Operator Overloading)

567Rabbit 2024. 8. 31. 12:14

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©(Operator Overloading)μ΄λž€?

 

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ 말 κ·ΈλŒ€λ‘œ μ—°μ‚°μž(operator)의 λ™μž‘μ„ μƒˆλ‘œ μ •μ˜(μž¬μ •μ˜)ν•˜λŠ” 것이닀.

예λ₯Ό λ“€μ–΄, + μ—°μ‚°μžλŠ” 숫자끼리 더할 λ•Œ μ“°λŠ” 것인데 이 + μ—°μ‚°μžλ₯Ό μš°λ¦¬κ°€ λ§Œλ“  ν΄λž˜μŠ€μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆκ²Œλ” λ™μž‘μ„ μƒˆλ‘œ μ •μ˜ν•˜λŠ” 것이닀. μƒˆλ‘œμš΄ νƒ€μž…(ν΄λž˜μŠ€λ‚˜ ꡬ쑰체)을 λ§Œλ“€ λ•Œ, κ·Έ νƒ€μž…μ— λŒ€ν•΄ +, -, *, / 같은 연산을 μžμ—°μŠ€λŸ½κ²Œ μ‚¬μš©ν•˜κ³  싢을 λ•Œκ°€ μžˆλ‹€. ( ex 두 개의 λ³΅μ†Œμˆ˜λ₯Ό 더할 λ•Œ c1 + c2처럼 κ°„λ‹¨ν•˜κ²Œ μ“°κ³  싢을 λ•Œ) 그런데, κΈ°λ³Έμ μœΌλ‘œλŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄ + 같은 연산이 μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ•„μ„œ μ“Έ 수 μ—†λ‹€. λ”°λΌμ„œ 직접 + 연산이 μ–΄λ–»κ²Œ μž‘λ™ν• μ§€λ₯Ό μ •μ˜ν•΄ μ£ΌλŠ” 것을 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ΄λΌκ³  ν•œλ‹€.

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•˜λ©΄ μ—°μ‚°μžλ₯Ό μ¨μ„œ μ‘°μž‘ν•  수 있게 λ˜λ―€λ‘œ μ½”λ“œλ₯Ό 더 직관적이고 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€.

 

 

λ‹€μŒκ³Ό 같은 μ—°μ‚°μžλ“€μ€ μ˜€λ²„λ‘œλ“œ 될 수 μžˆλ‹€.

 

::, ., *, ?:, sizeof, typeid λŠ” μ—°μ‚°μž μ˜€λ²„λ‘œλ“œ 될 수 μ—†λ‹€.

 

 

예제)

#include <iostream>
using namespace std;

class Complex {
    double re, im;

public:
    Complex(double re = 0.0, double im = 0.0) {
        this->re = re;
        this->im = im;
    }

    void operator += (const Complex& c) {  // μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•˜μ—¬ += μ—°μ‚°μžλ₯Ό μ •μ˜ν•œ λΆ€λΆ„
        re += c.re;  //  c 객체의 μ‹€μˆ˜ 뢀뢄을 this 객체의 μ‹€μˆ˜ 뢀뢄에 λ”ν•΄μ£ΌλŠ” μ½”λ“œ
        im += c.im;  //  c 객체의 ν—ˆμˆ˜ 뢀뢄을 this 객체의 ν—ˆμˆ˜ 뢀뢄에 λ”ν•΄μ£ΌλŠ” μ½”λ“œ
    }

    void print() const {
        cout << re << " + " << im << "i" << endl;
    }
};

int main() {
    Complex c1, c2(2, 3);
    c1.print();           // 0 + 0i

    c1 += c2;             // c1.operator+=(c2) c1 객체의 re와 im 값에 각각 c2 객체의 re와 im 값을 더함
    c1.print();           // 2 + 3i

    return 0;
}

 

operator +=λŠ” C++μ—μ„œ += μ—°μ‚°μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜.

 

+= μ—°μ‚°μžλŠ” 기본적으둜 λ‚΄μž₯된 μžλ£Œν˜•(예: int, double)에 λŒ€ν•΄ μ •μ˜λ˜μ–΄ μžˆμ§€λ§Œ, μ‚¬μš©μž μ •μ˜ 클래슀인 Complex에 λŒ€ν•΄ 이 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ˜€λ²„λ‘œλ”©ν•œ 것이닀.

 

const Complex& cλŠ” μ°Έμ‘°λ₯Ό 톡해 μ „λ‹¬λœ Complex νƒ€μž…μ˜ 객체λ₯Ό μ˜λ―Έν•œλ‹€.

const ν‚€μ›Œλ“œλŠ” 이 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ c 객체의 값을 λ³€κ²½ν•  수 없도둝 보μž₯ν•œλ‹€.

 

 

예제)

class Complex {
private:
    double re, im;  //reλŠ” μ‹€μˆ˜, imλŠ” ν—ˆμˆ˜ 뢀뢄이닀

public:
    Complex(double r = 0, double i = 0) : re(r), im(i) {}

    // == μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
    bool operator==(const Complex& other) const {
        // μ‹€μˆ˜ λΆ€λΆ„κ³Ό ν—ˆμˆ˜ 뢀뢄이 λͺ¨λ‘ κ°™λ‹€λ©΄ true, 그렇지 μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•¨.
        return (re == other.re) && (im == other.im);
    }
};

 

bool operator==(const Complex& other) constλŠ” == μ—°μ‚°μžκ°€ 두 개의 Complex 객체λ₯Ό 비ꡐ할 λ•Œ μ‚¬μš©λœλ‹€.

 

λΉ„κ΅λŠ” 객체의 μ‹€μˆ˜ λΆ€λΆ„(re)κ³Ό ν—ˆμˆ˜ λΆ€λΆ„(im)이 λͺ¨λ‘ 같은지 ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ 이루어진닀.

 

 

 

 

Non-Member Operators (비멀버 μ—°μ‚°μž) 의 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

 

클래슀의 멀버 ν•¨μˆ˜κ°€ μ•„λ‹Œ, 클래슀 μ™ΈλΆ€μ—μ„œ μ •μ˜λœ μ—°μ‚°μž ν•¨μˆ˜μ—μ„œλ„ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ ν•  수 μžˆλ‹€. 일반적으둜 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ 클래슀 λ‚΄λΆ€μ—μ„œ 멀버 ν•¨μˆ˜λ‘œ μ •μ˜λ˜μ§€λ§Œ, νŠΉμ • κ²½μš°μ—λŠ” 클래슀 μ™ΈλΆ€μ—μ„œ 이 μ—°μ‚°μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•΄μ•Ό ν•  ν•„μš”κ°€ 생길 수 μžˆλ‹€. 이런 κ²½μš°μ— friend ν•¨μˆ˜λ‚˜ 비멀버 ν•¨μˆ˜(non-member function)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ μ •μ˜ν•  수 μžˆλ‹€.

#include <iostream>
using namespace std;

class Complex {
private:
    double re, im;

public:
    Complex(double r = 0, double i = 0) : re(r), im(i) {}

    // friend ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 두 개의 Complex 객체λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜ μ„ μ–Έ
    friend Complex addComplex(const Complex& c1, const Complex& c2);

    void print() const {
        cout << re << " + " << im << "i" << endl;
    }
};

// friend ν•¨μˆ˜ μ •μ˜
Complex addComplex(const Complex& c1, const Complex& c2) {
    return Complex(c1.re + c2.re, c1.im + c2.im);
}

int main() {
    Complex c1(1, 2);  // 1 + 2i
    Complex c2(3, 4);  // 3 + 4i

    Complex result = addComplex(c1, c2);  // friend ν•¨μˆ˜ 호좜

    cout << "두 λ³΅μ†Œμˆ˜μ˜ ν•©: ";
    result.print();  // κ²°κ³Ό 좜λ ₯

    return 0;
}

 

이 μ˜ˆμ œμ—μ„œ addComplex ν•¨μˆ˜λŠ” Complex 클래슀의 멀버가 μ•„λ‹ˆμ§€λ§Œ, re와 im에 μ ‘κ·Όν•˜μ—¬ 두 객체λ₯Ό λ”ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

 

 

C++ 클래슀(Class)와 friend ν•¨μˆ˜/클래슀, this 포인터

OOP(객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°)의 4가지 νŠΉμ„±(좔상화, μΊ‘μŠν™”, 상속, λ‹€ν˜•μ„±)C++λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 언어이닀  OOP(객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°) 4가지 νŠΉμ„± 1. 좔상화 : μ–΄λ–€ νŠΉμ • 정보λ₯Ό ν‘œμ‹œν•΄μ•Ό ν•˜κ³  μ–΄

codebunny99.tistory.com

 

  • friend ν•¨μˆ˜λŠ” 클래슀의 멀버 ν•¨μˆ˜κ°€ μ•„λ‹ˆμ§€λ§Œ, 클래슀 λ‚΄λΆ€μ˜ λΉ„κ³΅κ°œ 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • friend ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄, 클래슀 μ™ΈλΆ€μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ„ 마치 클래슀 멀버 ν•¨μˆ˜μ²˜λŸΌ 클래슀 λ‚΄λΆ€μ˜ 데이터에 μ ‘κ·Όν•  수 있게 λœλ‹€.

 

 

 

 

ν˜Όν•©ν˜• μ—°μ‚° (Mixed-mode Arithmetic) μ—μ„œμ˜ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

 

Mixed-Mode Arithmetic(ν˜Όν•©ν˜• μ—°μ‚°)λž€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž… κ°„μ˜ 연산을 μ˜λ―Έν•œλ‹€. 예λ₯Ό λ“€μ–΄, ν•˜λ‚˜μ˜ ν”Όμ—°μ‚°μžκ°€ intν˜•μ΄κ³  λ‹€λ₯Έ ν”Όμ—°μ‚°μžκ°€ doubleν˜•μΌ λ•Œ 이듀 μ‚¬μ΄μ—μ„œ λ°œμƒν•˜λŠ” 연산을 ν˜Όν•©ν˜• 연산이라고 ν•œλ‹€.

 

C++μ—μ„œλŠ” 두 개의 λ‹€λ₯Έ 데이터 νƒ€μž…μ„ μ—°μ‚°ν•  λ•Œ λ¬΅μ‹œμ μœΌλ‘œ, ***μžλ™μœΌλ‘œ ν˜• λ³€ν™˜μ΄ μΌμ–΄λ‚˜λ©°***, μ΄λŸ¬ν•œ 연산을 지원할 수 μžˆλ„λ‘ μ—°μ‚°μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•  수 μžˆλ‹€. 

 

Mixed-Mode Arithmetic은 C++μ—μ„œ 맀우 μœ μš©ν•œ κΈ°λŠ₯이닀. μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ 톡해 κΈ°λ³Έ μžλ£Œν˜•κ³Ό μ‚¬μš©μž μ •μ˜ 클래슀 κ°„μ˜ 연산을 κ°€λŠ₯ν•˜κ²Œ ν•˜μ—¬ λ”μš± μžμ—°μŠ€λŸ¬μš΄ μ½”λ“œ μž‘μ„±μ„ λ•λŠ”λ‹€. 이둜 인해 μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ ν–₯μƒλ˜λ©°, μ‚¬μš©μžκ°€ μ •μ˜ν•œ 데이터 νƒ€μž…μ„ μ‰½κ²Œ λ‹€λ£° 수 있게 λœλ‹€.

 

 

<C++ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ˜ μžλ™ ν˜•λ³€ν™˜ : λ¬΅μ‹œμ  ν˜•λ³€ν™˜ μž₯점>

  1. μœ μ—°μ„±: μ‚¬μš©μžκ°€ μ •μ˜ν•œ Complex νƒ€μž…κ³Ό κΈ°λ³Έ μžλ£Œν˜•μΈ double을 μžμ—°μŠ€λŸ½κ²Œ μ—°μ‚°ν•  수 μžˆμ–΄ μ½”λ“œλ₯Ό 더 μœ μ—°ν•˜κ³  μ§κ΄€μ μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μ‚¬μš© νŽΈμ˜μ„±: Mixed-Mode Arithmetic을 μ‚¬μš©ν•˜λ©΄ λ³΅μ†Œμˆ˜ 연산이 λ”μš± μžμ—°μŠ€λŸ¬μ›Œμ§‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, c1 + 10 λ˜λŠ” 10 + c1 같은 연산이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.
  3. ν˜• λ³€ν™˜μ˜ μ œμ–΄: μžλ™ ν˜• λ³€ν™˜μ΄ μ΄λ£¨μ–΄μ§€λŠ” μƒν™©μ—μ„œ μ˜€λ²„λ‘œλ”©λœ μ—°μ‚°μžλŠ” μ–΄λ–€ 연산이 μ΄λ£¨μ–΄μ§ˆμ§€ λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜λ―€λ‘œ 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

#include <iostream>
using namespace std;

class Complex {
private:
    double re, im;

public:
    Complex(double r = 0, double i = 0) : re(r), im(i) {}

    // + μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
    Complex operator+(const Complex& c) const { // (1)
        return Complex(re + c.re, im + c.im);
    }

    Complex operator+(const double r) const {   // (2)
        return Complex(re + r, im);
    }

    friend Complex operator+(const double r, const Complex& c); // (3)

    // - μ—°μ‚°μž μ˜€λ²„λ‘œλ”©
    Complex operator-(const Complex& c) const { // (4)
        return Complex(re - c.re, im - c.im);
    }

    Complex operator-(const double r) const {   // (5)
        return Complex(re - r, im);
    }

    friend Complex operator-(const double r, const Complex& c); // (6)

    void print() const {
        cout << re << " + " << im << "i" << endl;
    }
};

// friend ν•¨μˆ˜λ₯Ό ν†΅ν•œ + μ—°μ‚°μž μ˜€λ²„λ‘œλ”© (3)
Complex operator+(const double r, const Complex& c) {
    return Complex(r + c.re, c.im);
}

// friend ν•¨μˆ˜λ₯Ό ν†΅ν•œ - μ—°μ‚°μž μ˜€λ²„λ‘œλ”© (6)
Complex operator-(const double r, const Complex& c) {
    return Complex(r - c.re, -c.im);
}

int main() {
    Complex c1(1, 0), c2(0, 1);

    Complex c3 = c1 + c2;    // (1) Complex + Complex
    Complex c4 = c1 + 10;    // (2) Complex + double
    Complex c5 = 10 + c1;    // (3) double + Complex
    Complex c6 = c1 - c2;    // (4) Complex - Complex
    Complex c7 = c1 - 10;    // (5) Complex - double
    Complex c8 = 10 - c1;    // (6) double - Complex

    c3.print();
    c4.print();
    c5.print();
    c6.print();
    c7.print();
    c8.print();

    return 0;
}

 

 

 

λŒ€μž… μ—°μ‚°μž(Assignment Operator) '=' 의 볡사(Copy)

 

Copy Assignment OperatorλŠ” 이미 μƒμ„±λœ 객체에 λ‹€λ₯Έ 객체의 값을 λŒ€μž…ν•˜λŠ” μ—°μ‚°μžλ₯Ό μ •μ˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. λ§Œμ•½ ν΄λž˜μŠ€κ°€ 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή(예: newλ₯Ό μ‚¬μš©ν•˜μ—¬ ν¬μΈν„°λ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή)을 ν¬ν•¨ν•˜λŠ” 멀버λ₯Ό 가지고 μžˆλ‹€λ©΄, κΉŠμ€ 볡사(Deep Copy)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 얕은 볡사(Shallow Copy)둜 인해 원본 객체와 λ³΅μ‚¬λœ 객체가 같은 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜κ²Œ λ˜μ–΄, ν•˜λ‚˜μ˜ κ°μ²΄μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•  λ•Œ λ‹€λ₯Έ κ°μ²΄μ—μ„œλ„ μ ‘κ·Όν•  수 μ—†κ²Œ λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

ex)

#include <iostream>
#include <cstring> // std::strlen, std::strcpy

class MyString {
private:
    char* str; // 동적 λ©”λͺ¨λ¦¬ 할당을 μ‚¬μš©ν•˜λŠ” λ¬Έμžμ—΄

public:
    // μƒμ„±μž
    MyString(const char* s = "") {
        str = new char[std::strlen(s) + 1];
        std::strcpy(str, s);
    }

    // μ†Œλ©Έμž
    ~MyString() {
        delete[] str;
    }

    // 볡사 μƒμ„±μž (κΉŠμ€ 볡사 μ‚¬μš©)
    MyString(const MyString& other) {
        str = new char[std::strlen(other.str) + 1];
        std::strcpy(str, other.str);
    }

    // Copy Assignment Operator (κΉŠμ€ 볡사 μ‚¬μš©)
    MyString& operator=(const MyString& other) {
        if (this == &other) {
            return *this; // 자기 μžμ‹ μ— λŒ€ν•œ λŒ€μž…μ„ 방지
        }

        // 기쑴에 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ ν•΄μ œ
        delete[] str;

        // μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•˜κ³ , 데이터λ₯Ό κΉŠμ€ 볡사
        str = new char[std::strlen(other.str) + 1];
        std::strcpy(str, other.str);

        return *this;
    }

    // λ¬Έμžμ—΄ 좜λ ₯
    void print() const {
        std::cout << str << std::endl;
    }
};

int main() {
    MyString str1("Hello, World!");
    MyString str2;

    str2 = str1;  // Copy Assignment Operator 호좜

    str1.print(); // Hello, World!
    str2.print(); // Hello, World!

    str1 = "Goodbye!";  // μƒˆλ‘œμš΄ λ¬Έμžμ—΄ λŒ€μž… (μž„μ‹œ 객체 생성 ν›„ λŒ€μž…)

    str1.print(); // Goodbye!
    str2.print(); // Hello, World! (str1의 변경이 str2에 영ν–₯을 주지 μ•ŠμŒ)

    return 0;
}

 

이미 μ‘΄μž¬ν•˜λŠ” 객체에 λ‹€λ₯Έ 객체λ₯Ό λŒ€μž…ν•  λ•Œ ν˜ΈμΆœλœλ‹€

자기 μžμ‹ κ³Όμ˜ λŒ€μž…μ„ λ°©μ§€ν•œ ν›„, 기쑴에 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜κ³  μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•˜μ—¬ κΉŠμ€ 볡사λ₯Ό μˆ˜ν–‰ν•œλ‹€

 

 

C++ Shallow Copy(얕은 볡사)와 Deep Copy(κΉŠμ€ 볡사)

Shallow Copy(얕은 볡사) Shallow Copy(얕은 볡사)λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ§Œ λ³΅μ‚¬ν•˜μ—¬, 원본 객체와 λ³΅μ‚¬λœ 객체가 같은 λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κ²Œ ν•œλ‹€. μ΄λŠ” μ˜λ„μΉ˜ μ•Šμ€ 데이터 변경을 μ΄ˆλž˜ν•  수 μžˆλ‹€.   객체의 데

codebunny99.tistory.com

 

 

 

 

Conversion Operator (ν˜•λ³€ν™˜ μ—°μ‚°μž)

Conversion OperatorλŠ” 클래슀의 객체λ₯Ό νŠΉμ • νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법을 μ •μ˜ν•˜λŠ” 것을 λ§ν•œλ‹€. 이λ₯Ό 톡해 클래슀 객체λ₯Ό λ‹€λ₯Έ κΈ°λ³Έ 데이터 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  수 μžˆλ‹€.

 

#include <iostream>

class MyClass {
private:
    int value; // μ €μž₯ν•  κ°’

public:
    // μƒμ„±μž
    MyClass(int v) : value(v) {}

    operator double() const {        // Conversion Operatorλ₯Ό μ •μ˜
        return static_cast<double>(value);
    }
};

int main() {
    MyClass obj(10);

    // λ¬΅μ‹œμ  λ³€ν™˜ 예제
    double d = obj; // MyClass 객체가 μžλ™μœΌλ‘œ double둜 λ³€ν™˜λ¨
    std::cout << "λ¬΅μ‹œμ  λ³€ν™˜λœ κ°’: " << d << std::endl;

    // λͺ…μ‹œμ  λ³€ν™˜ 예제
    double explicitDouble = static_cast<double>(obj);
    std::cout << "λͺ…μ‹œμ  λ³€ν™˜λœ κ°’: " << explicitDouble << std::endl;

    return 0;
}