• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

InputManagers과 static

21.07.16 16:02 작성 조회수 156

0

이전 강의에서 Managers에 대하여 강의하실때

    static Managers s_Instance; ... (1)

    static Managers Instance { get ... }  ...(2)

이런 코드를 사용하셨습니다. 

이에대한 저의 이해를 확한하겠습니다.

(1)번에서 사용한 static은 다른 곳에서 같은 Managers타입의 새로운 클래스를 생성하는것이 싫고, s_instance라는 유일한 Managers를 이용하여 모두를 관리(?)하고 싶다는 뜻이고

(2)번에서 사용한 static은 다른곳에서 s_instance를 부르고 싶을 때  매니저를 new를 이용하여 새롭게 만들지 말고 형식이름을 통해 간접적으로 호출하기 위한 static이라는 뜻,

으로 이해했습니다. 이 이해가 맞는지 확인하고싶습니다.

이러한 이해가 맞다면 궁금한 점이 생깁니다.

첫째로 (이 질문은 처음 Managers를 생성하고 설명한 강의해서 했어야 할것 같으나 양해부탁드립니다.) 

다른 파일에서 Managers를 생성하고 싶을 때에는 유일성이 보장된 Managers 내의 s_instance를 간접적이로 호출해야 하는데 다른 사람들이 Managers를 직접적으로 new를 이용해서 호출하는 참사(?)가 발생할 수 있다는 생각이 듭니다. 언듯 생각해보아도 Managers가 필요하면 Managers를 호출하는것이 Managers내부의 Instance를 호출하는것보다 더 직관적이기 때문에 이러한 실수(?)를 저지를 것 같습니다. 이러한 것을 방지하기 위해서는 Managers의 접근한정자를 public으로 열어두면 안될 것 같다는 생각이 듭니다. 이러한 이해가 맞는지요

두번째로 

만약 Managers의 접근한정자를 public이 아니고 다른 접근한정자로 바꾸어서 다른곳에서의 접근을 제한하고 싶을 때 처음보는 이상한 빨간줄이 생성되었습니다. 조금 찾아보니 namespace에 정의된 클래스는 private가 안된다고 합니다. internal과 public만 가능하다고 하네요. 이 파일에는 namespace가 없는줄 알았는데 숨겨져있거나 컴파일할 때 자동으로 만들어주는 것인가요? 그리고 이것을 막아두는 이유는 무엇인가요?

세번째로 

InputManagers _input = new();

public static InputManagers Input { get { return Instance._input; } }

    static InputManagers _input = new();

    public static InputManagers Input { get { return _input; } }

의 차이를  잘 모르겠습니다. 

inputManagers를 만드신 이유는 input이 발생하였을 때 한번에 해당 input을 처리하기 위함이라고 생각했습니다.  그렇다면 InputManagers는 처음 Managers와 비슷하게 하나의 클래스가 유일성이 보장되어야 할 것 같다는 생각이 듭니다.  이렇게 생각하면 InputManagers 인스턴스를 생성할 때 static으로 호출해야 할것 같다는 생각이 들지만 어차피 위의 버전이나 밑의 버전이나 private으로 다른곳에서 못보게 막아두고 getter를 통해 간접적으로 접근할 것이면 큰 의미가 있나 싶기도 하나 제가 생각 못한 이유가 있는것 같아 질문드립니다.

너무 길고 두서없게 질문한 것 같아서 죄송합니다.

답변 1

답변을 작성해보세요.

0

말씀하신게 아주 틀린 얘기는 아닌데

사람들이 Managers를 직접적으로 new를 이용해서 호출하는 참사(?)가 발생할 수 있다는 생각이 듭니다

이 정도까지 생각을 하기 시작하면 끝도 없습니다.
Managers는 통념상 매니저 클래스라는 것을 프로그래머라면 다들 인지하고 있고 
new Managers를 호출한 사람이 잘못이지 그거까지 신경쓰면서 작업을 할 필요는 없습니다.

public static InputManagers Input { get { return Instance._input; } }

이렇게 만든 이유는 Instance 내부 코드에서 Init()을 해주기 때문에,
언제 어디서든 Input을 호출하면 초기화 코드가 보장해줄 수 있기 때문입니다.
그게 싫다면 어디선가 초기에 Managers.Init() 코드를 넣어줘도 됩니다.

코드 구조는 본인 마음대로 구성하면 되는 것이고
프로젝트가 100이면 100 다 스타일이 다르기 때문에

강의의 세세한 부분에 신경쓸 필요가 전혀 없습니다. (그래서도 안됩니다)