this
포인터의 활용 예제 코드 분석C++에서 this
포인터는 객체 자신의 주소를 가리키는 내장 포인터입니다. 이는 주로 멤버 함수 내부에서 사용되며, 멤버 변수를 명확하게 구분하거나, 객체 자신을 반환할 때 유용합니다. 다음은 주어진 예제 코드를 통해 this
포인터의 사용법을 설명하겠습니다.
#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
포인터를 통해 객체 자신을 가리키며, 이를 사용해 현재 객체를 반환하거나 멤버 변수에 접근할 수 있습니다.#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
포인터를 반환함으로써, 빌더 패턴에서 객체의 초기화를 유연하게 할 수 있습니다.#include <iostream>
#include "Person.h"
#include "Transaction.h"
using namespace std;
int main()
{
personFunc(); // Person 클래스 예제 실행
buildTransaction(); // Transaction 빌드 예제 실행
}
main.cpp
파일에서는 앞서 정의된 Person
과 Transaction
클래스의 예제를 실행합니다.personFunc()
함수는 Person
클래스를 사용해 두 객체를 비교하고 승자를 출력합니다.buildTransaction()
함수는 Transaction
객체를 생성하는 예제입니다.this
포인터는 C++에서 객체 내부에서 객체 자신을 참조하는 중요한 도구입니다. 이를 사용하여 멤버 변수를 명확하게 구분하고, 객체 자신을 반환하며, 빌더 패턴에서 메서드 체이닝을 가능하게 합니다. 이러한 활용을 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.