변수의 초기화 시기

변수의 초기화 순서

  1. 선언의 일부로 할당된 값이 먼저 설정됩니다.
  2. 값은 인스펙터의 모든 항목에 의해 재정의됩니다.
  3. 값은 Awake의 모든 항목에 의해 재정의됩니다.
  4. 값은 Start에 의해 재정의됩니다.
  5. 값은 스크립트에서 나중에 설정되는 값으로 재정의됩니다.

 

Start는 다른 스크립트의 값에 액세스할 때 안전한 첫 번째 지점입니다.

 

테스트

위 변수의 초기화 순서에 따라 번호를 매기고, 순서대로 테스트를 진행해봅니다.

 

1번 테스트

위 처럼 firstInitVar의 선언 부분에서 변수에 값 3을 대입해주면, 당연히 Log값에는3이찍히게 됩니다.

 

1, 2번 테스트

위 처럼 (1)코드에서 값을 대입해주고, (2)인스펙터에서 값을 설정해주면 인스펙터에서 설정된 값이 제일 마지막에 초기화되어 값이 설정됩니다.

 

1,2,3번 테스트

Awake가 초기화 순서의 3번째에 해당되기 때문에 가장 마지막에 초기화된 10의 값이 Log에 찍히는 것을 확인할 수 있습니다. 

 

 

1,2,3,4번 테스트

Start메소드가 변수 초기화 순서에서 4번째에 해당하기 때문에 값이 20으로 출력되는 것을 확인할 수 있습니다. (물론, 유니티 스크립트 라이프사이클에서 Awake뒤에 동작하기 때문이기도 합니다.)

 

 

1,2,3,4,5번

4번째인 Start까지 호출되어 initializationVar 변수의 값이 20으로초기화됩니다. 그리고 5번째 순서에 의해서 값이 30으로 바뀐것을 확인할 수 있습니다. (Update가 Start뒤에 호출됩니다.)

 

인스펙터 값 대입에 따른 리스트 초기화

1. 리스트를 public으로 선언

이 부분에서 이상한 점을 느끼실 수 있을 겁니다. List객체를 생성하지 않았음에도(new를 호출하지 않았음에도) 불구하고 값이 출력됩니다. 선언된 List를 다른 것은 아무것도 건드리지 않고, 접근제한자만 public에서 private으로 바꾸어 보곘습니다. 

 

 

2. private으로 List선언

NullReference에러가 났습니다. 위에서 public으로 리스트를 선언해주었을 때 되었던 인스펙터에서 자동으로 객체가 생성되어 할당되기 때문입니다. 그러나 priavate으로 선언해주었을 때는 인스펙터의 변수 초기화 과정에 들어가지 않기 때문에 리스트가 초기화 되지 않았는데 리스트에 접근해서 값을 Add하려고 하니까 에러가 난 것입니다.

 

 

3. private List에 SerializeField 붙이기

SerializeField를 붙이게되면 public과 마찬가지로 인스펙터에서 보이기 때문에 변수초기화 2번에 해당되어, List에 객체가 할당된 것을 알 수 있습니다. 

 

 

https://forum.unity.com/threads/when-do-you-and-when-dont-you-initialize-variables-in-script.370533/