유니티 C# 자료구조 Dictionary (딕셔너리)



C#에는 많은 자료 구조가 있지만, 상황별로 가장

적절한 자료구조를 쓰는 것이 중요하다.

오늘은 게임 개발에서 유용하게 쓰일 수 있는

C# 자료구조 Dictionary에 대해 알아보고

이 자료구조가 왜 유용하지에 대해 알아보겠다.








먼저 여러 자료구조들의 추가, 검색, 삭제, 인덱스 접근에

대한 시간복잡도를 나타내는 표이다. 보시다시피 딕셔너리는

추가, 검색, 삭제 부분에서 상수시간의 시간복잡도를 보인다.

이것만 보아도 딕셔너리의 효율성을 짐작할 수 있다.




간단하게 딕셔너리의 사용법에 대해 알아보도록 하자.

먼저 Dictionary(딕셔너리)는 사용자가 원하는 대로 키를

설정할 수 있는 자료구조이다.  또한 이 키값으로 int뿐만아니라

문자열이나 다양한 변수형을 넣을 수 있다는 점이다.


 인터넷에 좋은 예제가 있어 실습겸 작성해보았다.




01. 아이템 클래스




02. Dictionary (딕셔너리) 선언 그리고 추가 , 검색




03. Dictionary(딕셔너리) 출력 , 삭제, 비우기




딕셔너리는 헤시 테이블과 상당히 유사하지만

헤시 테이블은 자료형에 대한 정의가 없다.

딕셔너리는 자료형을 명확하게 설정하기 때문에

속도면에서 딕셔너리가 좋은 성능을 보인다. (박싱 / 언박싱)

따라서 헤시 테이블 보다는 딕셔너리가 더욱 좋은 경우가 많다.




상황에 맞는 적절한 자료구조의 사용은

게임을 만드는 데 있어 성능향상을 가져오는

상당히 중요한 부분이기 때문에 많은 공부가

필요한 부분이 되겠다. 다음 포스팅은

헤시 테이블이 딕셔너리보다 느린 이유

박싱/언박싱에 대해 알아보도록 하겠다.


유니티 C# 싱글턴 오브젝트


게임 내에서 클래스 인스턴스들은 여러개 생성된다.

몬스터, 아이템만 봐도 하나의 씬에 여러개 존재 할 수 있다.


하지만 게임 매니저, 스코어, 오디오, 저장 등을

관리하는 몇몇 클래스들은 유일한 독립체로 존재해야 한다.




하나의 클래스 인스턴스만 존재하게 되며 그보다

많은 인스턴스를 만들지 않는다. 하나보다 많은

인스턴스를 가지는 것은 모순적인 부분이 발생하거나

오브젝트의 역할을 망가뜨리고 쓸모없어질 수도 있다.

이런 종류의 오브젝트를 싱글턴이라 부른다.


싱글턴은 대게 여러 씬에 걸쳐 지속적으로 유지되는 오브젝트이다.




싱글턴 기본 요소

항상 메모리에 클래스 인스턴스가 하나만 존재해야 한다.


tip!

이처럼 씬 간 유지되는 오브젝트는 자식 없는 빈 게임오브젝트처럼

동작에 필요한 기본 컴포넌트로만 구성해 가볍게 만들어진다.

씬을 전환할 때 중요한 필수 데이터만 살아남도록 하는 전략이다.







위 클래스 인스턴스는 이제 씬이 전환되어도 사라지지 않는다.

하지만 게임의 씬이 순차적으로 진행되리라 보장되진 않는다.

따라서 이 매니저클래스가 생성된 씬으로 다시 오게 된다면

매니저 클래스 인스턴스가 두개가 생기게 되고, 문제가 발생한다.


싱글턴으로 만들어주자.







유일한 인스턴스(싱글턴)일 뿐만 아니라 모든 인스턴스에

공유가되는 변수가 되었다. 이 변수는 get 멤버만을

가지고 있는 읽기 전용 프로퍼티를 통해 외부에서 접근 가능하다.




tip!

Awake()와 Start()

Awake()는 항상 오브젝트 생성 시에 호출된다.

Start()는 게임오브젝트가 활성화되는 첫번째 프레임에

호출된다. 만약 게임오브젝트가 비활성화된 씬에서

시작되었다면 오브젝트가 활성화되어 있더라도

Start()는 호출되지 않는다.

호출 순서 Awake() -> Start()




트랜스폼 컴포넌트를 변수에 캐싱하려면

Start()보다는 Awake()를 쓰는 것이 좋다.

일반적으로 Start() 이벤트가 일어날 때엔

오브젝트에 대한 모든 지역 참조들이

이미 할당되어 유효하다고 가정된다.




C# 프로퍼티


프로퍼티(Property)는 속성이라는 의미를 지니고 있다.

멤버 변수를 속성이라고도 하는데 정보 은닉을 위해

private로 선언을 하면 get, set 메소드를 구현해야 한다.

이를 편리하게 해주는 것이 C#의 프로퍼티이다.




C# 프로퍼티는 간단하고 유연성있게 전용 필드의

값을 읽거나 쓰는 메커니즘을 제공한다.


1. set 접근자의 value키워드는 set 접근자가 할당하는 값을

정의하는 하나의 예약어이다. 따라서 set 안에서만 유효하다.

2. set 접근자만을 구현하면 쓰기 전용 , get 접근자만을 구현하면

읽기 전용이다. private으로도 구현 가능하다.

3. get , set, 내에서 각종 조건을 걸어줄 수도,

혹은 사전 조건, 사후 조건을 프로퍼티 내에서 구현할 수도 있다.

4. 주의 사항!

변수와 프로퍼티의 이름은 같아야 하고 대 소문자로 구분한다.




자동으로 구현된 프로퍼티

1. get , set 접근자 안에 아무것도 안쓰는 경우 프로퍼티 자체를 사용한다.

2. private로 접근 지정을 해줄 수 있어 유연하게 사용가능하다.


+ Recent posts