• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Board와 Program에서 Player를 선언할때 질문입니다.

20.05.08 17:57 작성 조회수 282

1

Board클래스에서는 Player _player; 라고 쓰신 후에 이니셜라이즈에서 바로 _player = ~~~라고 하셨는데

Program클래스에서는 Player player = new Player(); 라고 쓰신 후에 Initialize(size, player); 라고 하셨습니다.

Program에서 Board처럼 선언했더니 오류가 났습니다.

둘의 차이가 뭔가요?

메인함수가 아니면 Player _player; 처럼 선언할수 있는건가요?

답변 1

답변을 작성해보세요.

7

안녕하세요,

처음 배울 때 매우 매우 헷갈리는 부분에 딱 걸리셨군요.
우선 메인함수와 Player _player; 선언 가능 여부는 아무런 상관이 없습니다.
문제가 되는 부분은 static 함수 내부에선
static이 아닌 멤버 변수를 사용할 수 없기 때문입니다. (참고로 main은 static으로 되어 있음)

아마 위에서 말씀하신 오류가 다음과 같이 떴을텐데요.
   [static이 아닌 필드, 메서드 또는 속성 'Program._player'에 개체 참조가 필요합니다.]
말 그대로 static Player _player 로 수정하면 문제는 해결됩니다.

어떤 클래스 내부의 필드(멤버 변수)나 메서드(함수)에서 static을 붙여줄 경우,
[클래스 Instance마다 각자 갖고 있는 것이 아니라, 모두가 공유해서 사용하는]의 의미가 됩니다.
반면 static이 붙지 않을 경우 [클래스 인스턴스마다 고유한]의 의미가 됩니다.
예를 들어 Program 내부 필드로 Player _player = new Player();로 선언하면,
Program 인스턴스 1개마다 각기 다른 Player 1개를 갖는 것이 되지만,
static Player _player = new Player();로 선언하면,
모든 Program 인스턴스가 동일한 _player를 참조하게 됩니다.

static의 사용 예제를 드리자면, 스타크래프트 마린 객체를 만든다고 가정을 해봅시다.

class Marine
{
  int _hp = 40;
  static int _upgradeAttack = 0;

  static void UpgradeAttack() { _upgradeAttack++ }
}

모든 마린은 각기 다른 HP값을 갖고 있으니,
static이 아닌 일반 필드로 만들어서 각 마린마다 HP를 따로 관리를 해줘야 합니다.
반면 공격 업그레이드 수치는 모든 마린들이 공유하는(동일한) 수치이니,
static을 붙여서 모두 동일한 수치를 공유하게 관리를 할 수가 있겠습니다.

아무튼 static 함수 또한 [모두가 공유해서 사용하는 함수]의 개념이기 때문에,
특정 Instance에 고유한 변수에는 접근을 할 수가 없습니다.
위의 static UpgradeAttack() 함수 내부에서 _hp에 접근할 수 없는데,
모든 Instance가 공유해서 사용하는 함수이기 때문에 
도대체 어떤? 마린의 HP에 접근할지 이해를 하지 못하기 때문입니다.
동일하게 static Main은 Program 내부의 일반 필드로 선언된 Player에는 접근할 수 없습니다.

마지막으로 static Main 내부에서 직접 Player p = new Player()를 하면 아무런 문제가 없는데,
특정 Instance에 종속적인 플레어를 뽑아오는게 아니라,
실시간으로 새로운 플레이어를 직접 만들었기 때문입니다.

미묘한 차이가 있는데 설명이 잘 되었는지 모르겠네요.