C++에서 this 포인터의 활용 예제 코드 분석

C++에서 this 포인터는 객체 자신의 주소를 가리키는 내장 포인터입니다. 이는 주로 멤버 함수 내부에서 사용되며, 멤버 변수를 명확하게 구분하거나, 객체 자신을 반환할 때 유용합니다. 다음은 주어진 예제 코드를 통해 this 포인터의 사용법을 설명하겠습니다.


Person.h

#pragma once
#include <iostream>

using namespace std;

// Person 클래스의 정의
class Person
{
private:
    float weight;  // 멤버 변수: 몸무게
    float height;  // 멤버 변수: 키
    string name;   // 멤버 변수: 이름

public:
    // 생성자: 객체가 생성될 때 호출되어 멤버 변수를 초기화함
    Person(float weight, float height, const string& NAME)
        : weight(weight), height(height), name(NAME) // 초기화 리스트를 사용하여 멤버 변수 초기화
    {
        // 이름이 같은 경우 this로 구분 가능
        weight; // 이 경우 파라미터 weight를 참조
        this->weight; // 이 경우 멤버 변수 weight를 참조

        // 이름이 다르기 때문에 this 생략 가능
        name; // 멤버 변수 name을 참조
        this->name; // 동일하게 멤버 변수 name을 참조
    }

    // 체중 감소 메서드
    void loseWeight(float weight)
    {
        // 아래의 둘은 같다
        this->height; // 멤버 변수 height를 참조
        height;       // 동일하게 멤버 변수 height를 참조

        // 체중 감소를 멤버 변수에 반영
        this->height -= weight;
        // 체중이 음수가 되는 것을 방지
        if (this->weight < 0)
            this->weight = 0;
    }

    // BMI 계산 메서드
    float getBMI()
    {
        // BMI를 계산하여 반환
        return weight / (height * 100 * height * 100);
    }

    // BMI를 비교하여 승자를 반환하는 메서드
    Person& complete(Person& person)
    {
        // 현재 객체(this)의 BMI가 인자로 받은 person의 BMI보다 작다면 현재 객체 반환
        if (this->getBMI() < person.getBMI())
            return *this; // this의 반환 (현재 객체)
        else
            return person; // 상대 객체 반환
    }

    // 승리 메시지를 출력하는 메서드
    void doCeremony()
    {
        // 객체의 이름을 출력
        cout << name << " win!!" << endl;
    }
};

// 함수: Person 객체를 이용한 간단한 시뮬레이션
void personFunc()
{
    Person david(67.3f, 172.3f, "david");  // 객체 생성: 이름은 "david"
    Person daniel(58.3f, 167.3f, "daniel"); // 객체 생성: 이름은 "daniel"

    // 두 객체의 BMI를 비교하여 승자를 출력
    daniel.complete(david).doCeremony();
}

분석

  • this 포인터는 주로 이름이 같은 파라미터와 멤버 변수를 구분하기 위해 사용됩니다. 예를 들어, weight는 파라미터, this->weight는 멤버 변수를 참조합니다.
  • this 포인터를 사용하여 멤버 함수에서 객체 자신을 반환하거나, 특정 로직에서 현재 객체와 다른 객체를 비교할 때 유용합니다.
  • this 포인터를 통해 객체 자신을 가리키며, 이를 사용해 현재 객체를 반환하거나 멤버 변수에 접근할 수 있습니다.

Transaction.h

#pragma once

using namespace std;

// Transaction 구조체: 거래 정보를 담고 있음
struct Transaction
{
    const int txID;   // 거래 ID
    const int fromID; // 발신자 ID
    const int toID;   // 수신자 ID
    const int value;  // 거래 금액

    // Transaction 객체를 빌드하는 Builder 클래스
    class Builder
    {
    private:
        int _fromID;  // 발신자 ID
        int _toID;    // 수신자 ID
        int _value;   // 거래 금액

    public:
        // Transaction 객체 생성 및 반환
        Transaction build()
        {
            int txID = _fromID ^ _toID ^ _value; // 임의의 ID 생성 (XOR 연산)
            return Transaction{txID, _fromID, _toID, _value}; // 생성된 Transaction 객체 반환
        }

        // 발신자 ID 설정
        Builder& setFromID(int fromID)
        {
            _fromID = fromID; // 파라미터로 받은 fromID를 멤버 변수 _fromID에 설정
            return *this; // this 포인터를 반환하여 체이닝을 가능하게 함
        }

        // 수신자 ID 설정
        Builder& setToID(int toID)
        {
            _toID = toID; // 파라미터로 받은 toID를 멤버 변수 _toID에 설정
            return *this; // this 포인터를 반환하여 체이닝을 가능하게 함
        }

        // 거래 금액 설정
        Builder& setValue(int value)
        {
            _value = value; // 파라미터로 받은 value를 멤버 변수 _value에 설정
            return *this; // this 포인터를 반환하여 체이닝을 가능하게 함
        }
    };
};

// 함수: Transaction 빌드 예제
void buildTransaction()
{
    Transaction::Builder builder; // Builder 객체 생성
    Transaction tx = builder.build(); // 기본 설정으로 Transaction 객체 생성
}

분석

  • Builder 패턴은 복잡한 객체 생성 과정을 단순화하는 데 유용합니다.
  • Builder 메서드들(setFromID, setToID, setValue)은 this 포인터를 반환하여 메서드 체이닝을 가능하게 합니다. 이 방식으로 여러 메서드를 연속해서 호출할 수 있습니다.
  • this 포인터를 반환함으로써, 빌더 패턴에서 객체의 초기화를 유연하게 할 수 있습니다.

main.cpp

#include <iostream>
#include "Person.h"
#include "Transaction.h"

using namespace std;

int main()
{
    personFunc(); // Person 클래스 예제 실행
    buildTransaction(); // Transaction 빌드 예제 실행
}

분석

  • main.cpp 파일에서는 앞서 정의된 PersonTransaction 클래스의 예제를 실행합니다.
  • personFunc() 함수는 Person 클래스를 사용해 두 객체를 비교하고 승자를 출력합니다.
  • buildTransaction() 함수는 Transaction 객체를 생성하는 예제입니다.

결론

this 포인터는 C++에서 객체 내부에서 객체 자신을 참조하는 중요한 도구입니다. 이를 사용하여 멤버 변수를 명확하게 구분하고, 객체 자신을 반환하며, 빌더 패턴에서 메서드 체이닝을 가능하게 합니다. 이러한 활용을 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.

profile
李家네_공부방

0개의 댓글