728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
this
- this는 객체 자신에 대한 포인터로서 클래스 멤버 함수 내에서만 사용.
- 전역 변수, 지역 변수 둘 다 아니다.
- 정확히 말하면 객체의 멤버 함수가 호출될 떄, 컴파일러에 의해 보이지 않게 전달되는 객체에 대한 주소
class Circle {
int radius;
public:
Circle() { this->radius = 1; }
Circle(int radius) { this->radius = radius; }
void setRadius(int radius) { this->radius = radius; }
};
- 각 객체 속의 this는 다른 객체 속의 this와 서로 다른 포인터
- static 멤버 함수에서는 사용할 수 없다.
필요한 경우
Circle() {
this->radius = 1; // this->를 생략하고 radius = 1;로 해도 무관함
}
위와 같은 생성자 함수의 경우 'this->'를 생략해도 된다. 그럼 필요한 2가지 경우에 대해 알아보자
- 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓고자 하는 경우
- 이 경우 매개 변수 이름을 다른 이름으로 선언하면, 굳이 this를 사용하지 않아도 된다고 생각하지만
- 매개 변수의 이름은 소스 프로그램의 강력한 주석 역할을 한다.
Circle(int radius) {
this->radius = radius; // 멤버 radius와 매개 변수 radius
} // this가 없으면 모두 매개 변수를 지칭하게 되어 목적이 왜곡된다.
- 객체의 멤버 함수에서 객체 자신의 주소를 리턴 할 때가 있는데 이 경우 this는 반드시 필요하다.
- 연산자 중복을 구현할 때, 이런 경우가 많이 발생하며, this 없이는 연산자를 중복 할 수 없는 경우도 있다.
class Sample {
public:
Sample* f() {
....
return this; // 현재 객체의 주소 리턴
}
};
제약 조건
- 클래스의 멤버 함수에서만 사용 가능
- 다른 함수들은 어떤 객체에도 속하지 않기 떄문
- 멤버 함수라도 정적 멤버 함수(static member function)는 this를 사용할 수 없다.
- 정적 멤버 함수는 객체가 생성되기 전에 호출 가능, 정적 멤버 함수가 실행되는 시점에서 현재 객체는 존재하지 않을 수 있기 때문
Tip!! 컴파일러는 this를 어떻게 처리하는가?
- this는 컴파일러에 의해 탄생하는 변수
class Sample {
int a;
public:
void setA(int x) {
this->a = x;
}
};
// 위 (a)는 개발자가 작성한 클래스
// 아래 (b)는 컴파일러에 의해 변환된 클래스
class Sample {
int a;
public:
void setA(Sample* this, int x) { // this는 컴파일러에 의해 묵시적으로 삽입된 매개 변수
this->a = x;
}
};
// 아래는 객체의 멤버 함수를 호출하는 코드의 변환
Sample ob; 컴파일러에 의한 변환
ob.setA(5); ========================> ob.setA(&ob, 5); // ob의 주소 = &ob가 this 매개 변수에 전달됨
- (a)의 Sample 클래스는 멤버 변수 a를 접근하기 위해 this를 사용
- Sample 클래스어디에도 'this'라는 이름이 선언된 곳이 없고, 어떤 헤더 파일도 include하고 있지 않지만, 컴파일러는 오류를 발생시키지 않는다.
- (a)를 컴파일 할 때 (b)와 같이 변환하며, 모든 멤버 함수들에 대해 이뤄진다.
- 컴파일러는 Sample의 모든 멤버 함수에 매개 변수 'Sample* this'를 삽입하며, 컴파일러에 의해 변환된 Sample 클래스를 보면, 개발자가 작성한 this는 컴파일러가 삽입해준 바로 그 this이다.
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] 함수와 참조 (0) | 2023.12.03 |
---|---|
[C++] string 클래스를 이용한 문자열 사용 (1) | 2023.12.01 |
[C++] 동적 메모리 할당 및 반환 (1) | 2023.11.30 |
[C++] 객체 포인터와 객체 배열 (0) | 2023.11.30 |
[C++] 포인터 (1) | 2023.11.30 |