TIL 2024/8/14

Sung Joo Lee·2024년 8월 14일

Static Class Members


  • 객체가 아닌 클래스에 속하는 변수
    • 메모리 구조에서 heap , stack , code , static 중 stack이 아니라 static에 속하는 변수

static class 멤버 변수

  • 개별적인 객체의 데이터가 아닌 클래스에 공통 데이터 구현이 필요할 때 사용

static class 멤버 함수

  • 클래스 이름 하에서 바로 호출 가능

  • static class 멤버 함수는 static 클래스 멤버 변수에만 접근 가능

#include <iostream>

class Player {
private:
	int x, y;
	int speed;
	static int numPlayer;
public:
	Player(int x, int y, int speed)
		:x{ x }, y{ y }, speed{ speed }
	{
		numPlayer++;
	}

	void setPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

	void printPosition() const
	{
		std::cout << x << "," << y << std::endl;
	}

	static int getNumPlayer() {
		return numPlayer;
	}
};

int main()
{

	Player p1{ 0,0,1 };
	Player p2{ 0,1,1 };
	Player p3{ 1,0,1 };

	std::cout << Player::getNumPlayer() << std::endl;

	return 0;
}
  • 위와 같이 코드를 작성하고 컴파일을 하면 오류가 발생한다
    - numPlayer를 초기화하지 않은 상태이기 때문에!
#include <iostream>

class Player {
private:
	int x, y;
	int speed;
	static int numPlayer;
public:
	Player(int x, int y, int speed)
		:x{ x }, y{ y }, speed{ speed }
	{
		numPlayer++;
	}

	void setPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

	void printPosition() const
	{
		std::cout << x << "," << y << std::endl;
	}

	static int getNumPlayer() {
		return numPlayer;
	}
};

int Player::numPlayer = 0;// 초기화

int main()
{

	Player p1{ 0,0,1 };
	Player p2{ 0,1,1 };
	Player p3{ 1,0,1 };

	std::cout << Player::getNumPlayer() << std::endl;

	return 0;
}

근데 왜 클래스 안에서 초기화 해주지 않고 별도로 초기화를 시켜줄까?

이는 우리가 앞에서 배웠던 이유가 존재하기 때문이다. static 변수는 stack 공간에 있는 것이 아니라 static 공간에 따로 존재하기 때문에 따로 초기화 해주는 것이다.

Friend


  • Private 멤버에 대해 접근할 수 있는 함수나 클래스를 선언할 때 사용

  • 비대칭

    • A가 B의 friend 일 대 B가 A의 friend는 아님
  • 전이되지 않음

    • A가 B의 friend이고 B가 C의 friend일 때, A가 C의 friend는 아님

외부에서 private 변수에 접근하고 싶을 때

#include <iostream>

class Player
{
private:
	int x, y;
	int speed;
public:
	Player(int x ,int y, int speed)
		:x{x},y{y},speed{speed}
	{
		std::cout << this << std::endl;
	}

	void SetPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

	int getXPos() {
		return x;
	}

	int getYPos() {
		return y;
	}
};

void DisplayPlayer(const Player& p) //Player::DisplayPlayer()가 아님
{
	std::cout << p.getXpos() << "," << p.getYPos() << std::endl;//ERROR
}
  • 위의 코드를 봐보자!
    • DisplayPlayer에서 error가 발생하는데 이는 p가 const이기 때문이다.
    • 우리가 이전에 공부했던 것을 떠올려보자!
      • 컴파일러는 const로 설정된 데이터의 함수 및 변수에 대한 접근을 막는다.

      • 우리가 컴파일러에게 함수뒤 const를 사용하여 ‘명시’해 줘야한다.

        	int getXPos() const {
        		return x;
        	}
        
        	int getYPos() const {
        		return y;
        	}

<오류 해결 한 코드>

#include <iostream>

class Player
{
private:
	int x, y;
	int speed;
public:
	Player(int x ,int y, int speed)
		:x{x},y{y},speed{speed}
	{
		std::cout << this << std::endl;
	}

	void SetPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

	int getXPos() const {
		return x;
	}

	int getYPos() const {
		return y;
	}
};

int main()
{

	Player p1{ 1,2,10 };

	DisplayPlayer(p1);

}

void DisplayPlayer(const Player& p) //Player::DisplayPlayer()가 아님
{
	std::cout << p.getXPos() << "," << p.getYPos() << std::endl;
}

이는 단계를 많이 거치기 때문에 friend 키워드를 사용해서 class 외부에서 접근을 해보도록 하자!

friend 사용

#include <iostream>

class Player
{
	friend void DisplayPlayer(const Player& p);
private:
	int x, y;
	int speed;
public:
	Player(int x ,int y, int speed)
		:x{x},y{y},speed{speed}
	{
		std::cout << this << std::endl;
	}

	void SetPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

};

int main()
{

	Player p1{ 1,2,10 };

	DisplayPlayer(p1);

}

void DisplayPlayer(const Player& p) //Player::DisplayPlayer()가 아님
{
	std::cout << p.x << "," << p.y << std::endl;
}
  • friend 키워드를 사용하여 class 외부의 DisplayPlayer() 함수에게 접근 권한을 부여한다고 생각하라! ( 친구니까 )

  • 주의)

    • DisplayPlayer() 함수는 멤버 함수가 아니다! , 멤버 함수는 friend로 지정해주지 않아도 그냥 접근이 가능하다.

friend class

  • 외부의 클래스에서 다른 클래스의 private 변수에 접근하고 싶을 때 또한 마찬가지로 friend 키워드를 사용하여 접근 권한을 부여한다.
class Player
{
	friend void DisplayPlayer(const Player& p);
	friend class Game;
private:
	int x, y;
	int speed;
public:
	Player(int x ,int y, int speed)
		:x{x},y{y},speed{speed}
	{
		std::cout << this << std::endl;
	}

	void SetPosition(int x, int y)
	{
		this->x = x;
		this->y = y;
	}

};

class Game
{
	//Player 객체의 private 변수에 접근하고 싶다
};
profile
개발로그

0개의 댓글