클래스 이름 하에서 바로 호출 가능
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;
}
#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 공간에 따로 존재하기 때문에 따로 초기화 해주는 것이다.
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
}
컴파일러는 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 외부에서 접근을 해보도록 하자!
#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() 함수에게 접근 권한을 부여한다고 생각하라! ( 친구니까 )
주의)
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 변수에 접근하고 싶다
};