Board와 Program에서 Player를 선언할때 질문입니다.
418
작성한 질문수 6
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에 종속적인 플레어를 뽑아오는게 아니라,
실시간으로 새로운 플레이어를 직접 만들었기 때문입니다.
미묘한 차이가 있는데 설명이 잘 되었는지 모르겠네요.
게임개발에서 주로 어느부분에 알고리즘들이 쓰이는지 궁금합니다
0
172
2
글꼴 바꿔도 자간이 좁아 찌그러져보이시는 분들
0
88
1
NullReferenceException 예외) 같은 실수하시는분 계실까봐 남겨요
0
66
1
parent를 Pos타입으로 만든 이유
0
74
1
콘솔창에 격자가 안나옴 미로 생성 X
0
133
1
격자 생성 안됨 무한루프
0
114
1
BFS 질문
0
143
2
격자 무한 출력
0
167
2
A* 의 PriorityQueue 관련 질문입니다
0
155
2
vscode에서 원그리기
0
180
1
환결설정 강의 원 그리기
0
122
1
15-17분
0
87
1
3:16초에 근데 이렇게 해가지고 부분에 "{}"를 만들어서 자식 node들을 생성하던데 왜 중괄호로 감싸게 만드는 건가요?
0
141
2
동적 배열 관련 질문입니다!
0
209
1
Big-o 표기법에서 시간 복잡도
0
167
1
7:40에서 언급하신 색상이 날아가는 문제 이해를 못하겠습니다
0
151
1
트리구현연습 강의 질문있어요
0
143
1
창은 뜨는데 맵이 나타나지 않아요.
0
175
1
Ctrl F5 하면 나오는 창은 어디서 설정할까요??
0
271
1
void CalcPathFromParent(Pos[,] parent)에 대해서
0
202
2
NullReferenceException예외가 발생했을때 어떻게 해야하나요?
0
229
1
[해결] 환경설정 강의에서 원이 이상하게 그려지는 문제
3
311
2
오른손 법칙에서 플레이어 점이 안 움직입니다
0
245
2
맵 만들기 오류
0
179
1





