Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

시작은 0부터

25. 콘솔RPG 100% - 생성자와 스태틱(Static) 본문

C# 학습일지

25. 콘솔RPG 100% - 생성자와 스태틱(Static)

0base 2022. 8. 5. 23:56

콘솔 RPG 만들기를 진행하면서 프로젝트 안에 여러 개의 클래스를 나누고, 각 클래스마다 특정 함수들이 각각 서로 다른 클래스들을 오가면서 참조하고 값을 넣고 하다보니 참조를 제대로 하지 못하는 문제가 발생했고, 처음에 이를 해결하기 위해 외부 클래스에서 사용을 하는 모든 멤버변수들을 전부 다 스태틱으로 바꿔버렸다. 그리고 해당 클래스 내부의 변수값을 가져올 때는 생성자를 통해서 가져오는 것이 아닌 클래스 자체의 값을 가져오는 식으로 가져왔다. 모든 변수를 스태틱으로  만들고 게임을 실행하다보니 처음에는 잘 되는 것 같다가 거의 다 완성이 되갈 때 쯤 제대로 작동하지 않는 문제가 생겼다.

 

클래스 a, b, c, d 가 있고 메인 함수가 있는 프로그램에서 모든 클래스의 변수를 사용하는 a의 생성자를 생성했는데, b, c, d 각각각의 클래스에서 또 서로의 값을 참조하는 함수들이 각각 따로따로 실행되는 상황에서 스태틱으로 바꿔버리니 모든 클래스를 사용하는 a의 생성자가 원할하게 각각의 값을 가져오지 못하는 문제가 발생했고, 결국 이를 해결하기 위해 스태특으로 바꿨던 변수들의 정적 선언을 전부 지우고, 외부 클래스의 변수를 참조하는 모든 함수들은 a의 생성자 안에서 실행되도록 바꿔서 해결했다.

 

처음에 모든 변수들을 스태틱으로 썼을 때, 동기들은 왜 굳이 생성자를 두고 그런식으로 하냐고 했었는데 말로 설명을 들을 때보다 직접 수정해보면서 체감하게 되었다. 그리고 스태틱은 게임이 실행되면서 동시에 값이 저장되어있는 상태로 프로그램이 실행되는 동안 계속 값이 남아있는 상태이기 때문에( 메모리에 계속 누적이 되어있는 상태 ) 메모리 최적화를 위해서라도 스태틱 선언은 지양하는 것이 좋다는 것을 배웠다.

 

class Program
{
	Aclass A = new Aclass(); // A 객체를 생성하는 생성자
}
class Aclass
{
    Bclass B = new Bclass();
    Cclass C = new Cclass();
}

메인 함수가 있는 프로그램에서 다른 클래스들의 생성자를 가진 클래스 A 를 선언하고 그 A 클래스 안에서 각각의 외부변수를 사용하는 함수들을 클래스 내부의 생성자로 생성한 객체를 이용해 참조하면 스태틱 선언없이 각각의 클래스 변수들을 사용할 수 있다.