728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

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