C#의 기초 문법 부분은 다른 언어와 크게 다르지 않아서 빠르게 넘겼고(generic은 c++의 템플릿과 동일), ref와 out에 대한 복습과 hash set에 대한 간단한 구조만 돌아보는 것으로 한다.
ref와 out은 매개변수로 사용되면서 c++에서는 포인터 혹은 참조자로 받아서 값의 복사가 아닌 참조로 직접 변경하고자 할 때 사용했었는데 c#에서는 out이라는 기능을 따로 마련해둔 느낌이다.
ref는 c++처럼 함수 밖에서 준비한 변수를 전달해서 값을 읽거나 변경할 수 있도록 했지만 c++ 에서는 딱히 초기화를 하지 않아도 넘겨줄 수 있었던 반면 ref는 반드시 초기화를 해야 한다(debug 모드던 release 모드던).
반대로 out은 초기화를 하지 않아도 되지만 함수 내에서 값을 지정해줘야만 한다.
ref -> 밖에서 초기화 한 후 전달 / out -> 밖에서 선언 후 전달, 함수 내에서 반드시 값 지정
객체나 구조체를 전달할 때에는 이를 잘 활용해야만 할 듯(객체, 구조체를 값의 복사로 전달하면 너무 느리니까)
이어서 hash set에 대한 간단한 얘기를 해보자면 dictionary가 키-값 구조로 저장한다고 했는데 hash set도 내부로 들어가면 dictionary와 동일한 구조로 동작한다, 조금 차이가 있는 점이 키가 따로 있다는 점?
hash set은 들어온 값에 대해 hash를 돌려서 얻은 값을 테이블에서 찾고, 없으면 그대로 저장 / 있다면 들어온 해쉬의 원본과 비교해 충돌 판정을 한번 더 내린다. 내부적으로 {hash val, val} 식으로 저장
hash set에 데이터를 넣는다 -> hash를 돌리고 이 값을 테이블에서 찾아본다 -> 없으면 저장, 있으면 val을 서로 비교해서 같으면 저장x, 다르면 연결 리스트 형태로 저장
dictionary는 {hash val, key, val}로 저장해서 hash set의 작업 중 key 값으로 비교 판정을 내리는 것이 테이블 검색 뒤로 넘어와서 한 단계가 무조건 추가되는 그런 느낌이다.
실제로 많은 객체의 추가/삭제가 이루어지는 테스트 코드를 돌려보았을 때 어느정도 차이가 나는 것을 확인했다.
(10만 개 정도에 약 2~30ms 정도)
대략 정리하자면 hash set은 값만 저장하면서 충돌이 많지 않을 것으로 예상되는 경우에 사용하고, dictionary는 id와 같이 key값이 유일한 경우 빠르게 찾기 위해서 사용하니까.. 왠만하면 hash set을 사용할 수 있으면 얘를 활용하는 쪽으로 고민을 해봐야겠다.(그래도 게임의 경우에는 id도 그렇고 키가 유일한 경우가 많으니 dictionary를 더 활용하게 될 것으로 예상되긴 한다)
'[내일배움캠프 Unity 9기]' 카테고리의 다른 글
| 04/16 TIL - C++ 생성자와는 다른 초기화 (0) | 2025.04.16 |
|---|---|
| 04/15 TIL - Func와 Action (0) | 2025.04.15 |
| 04/11 TIL - C#의 가비지 컬렉터 (0) | 2025.04.11 |
| 04/10 TIL (0) | 2025.04.10 |
| 04/09 TIL(?) (0) | 2025.04.09 |