[Unity] Dictionary TryGetValue 메서드 활용하기 (ContainsKey와 차이점)

2024. 5. 21. 20:02·Record/TIL
반응형

2줄 요약은 [ 두 메서드의 차이 ] 부분으로 바로 내려서 보세요!

 

TryGetValue

이 메소드는 사전에 특정 키가 존재하는지 확인하고, 해당 키가 존재할 경우 그 값을 가져오는 데 사용된다.

이렇게 하면 키가 존재하지 않을 때 발생할 수 있는 예외를 피할 수 있다.

TryGetValue()는 Dictionary에 키가 있는지 여부를 나타내는 부울 값을 반환하고, 키와 연결된 값을 출력한다.

 

> TryGetValue 메서드 사용 코드

Dictionary<string, int> exam = new Dictionary<string, int>();
Console.Write("키를 입력하세요: ");
string input = Console.ReadLine();

exam.Add("a", 1);
exam.Add("b", 2);
exam.Add("c", 3);

foreach (var item in exam)
{
    Console.Write(item);
}
Console.WriteLine();

if (exam.TryGetValue(input, out int _))
{
    Console.Write("딕셔너리에 키가 있음");
}
else
{
    Console.Write("딕셔너리에 키가 없음");
}

 

여기서 _로 int값을 선언한 이유는 키가 존재하면 true를 반환하고, 값은 무시하기위해 사용했다. 

_는 C# 7.0부터 도입된 "디스카드"라고 불리는 특별한 식별자로, 값을 무시할 때 사용된다고 한다.

 

현재는 ContainsKey와 비교하기위해 값을 쓰지않았지만 만약 int num을 넣고 콘솔창을 수정하면,

if (exam.TryGetValue(input, out int num))
{
    Console.Write($"딕셔너리에 키가 있으며, 키 값은 {num}이다.");
}
else
{
    Console.Write("딕셔너리에 키가 없음");
}

이렇게 키의 값을 출력할 수 있다.

 

키가 존재하지 않으면 TryGetValue는 false를 반환해서 else문이 실행된다.

 

 

ContainsKey

정 키가 사전에 존재하는지 여부를 확인할 때 사용됩니다. 이 메소드는 키의 존재를 확인할 때 사용된다.

ContainsKey()는 Dictionary에 키가 있는지 여부를 나타내는 부울 값을 반환한다. 

그러나 키와 연결된 값을 출력하지 않는다.

 

> ContainsKey 메서드 사용 코드

Dictionary<string, int> exam = new Dictionary<string, int>();
Console.Write("키를 입력하세요: ");
string input = Console.ReadLine();

exam.Add("a", 1);
exam.Add("b", 2);
exam.Add("c", 3);

foreach (var item in exam)
{
    Console.Write(item);
}
Console.WriteLine();

if (exam.ContainsKey(input))
{
    Console.Write("딕셔너리에 키가 있음");
}
else
{
    Console.Write("딕셔너리에 키가 없음");
}

 

만약 위와 똑같이 값도 받아오고 싶으면 딕셔너리에 키값으로 접근해서 가져오면 된다.

if (exam.ContainsKey(input))
{
    int num = exam[input];
    Console.WriteLine($"딕셔너리에 키가 있으며, 키 값은 {num}이다.");
}
else
{
    Console.WriteLine("딕셔너리에 키가 없음");
}

 

 

두 메서드의 차이

사실 두 메서드는 키가 존재하는지 여부만 판단하려면 똑같은 기능을 한다고 말할 수 있다.

코드를 실행시켜보면 둘이 똑같은 값을 출력하는 것을 알 수 있다.

 

 

하지만 두개의 메서드는 키를 확인한 후 키 값을 사용하는데에 있어서 큰 차이가 있다.

  • TryGetValue(): 키의 존재 여부를 확인하면서, 동시에 해당 키에 매핑된 값을 얻고자 할 때 사용한다.
  • ContainsKey(): 키가 사전에 존재하는지만 확인하고, 해당 값은 필요 없는 경우 사용한다. 

키가 존재하는지만 확인하고 싶을때는 ContainsKey를 사용하는게 효율적이고,

키의 존재를 확인하고 키 값을 가져오고 싶을때는  TryGetValue를 사용하는게 효율적이다.

 

>>

 

 그 이유는 ContainsKey를 사용해서 키의 존재를 확인하고 값을 가져올때 이미 키를 확인하기 위해 딕셔너리에 접근해서 확인한 후, 값을 가져오기위해 딕셔너리에 한번 더 접근해야해서 시간낭비가 생긴다.

그렇기때문에 키의 값까지 가져와야하는 상황이라면 단일접근으로 끝낼 수 있는  TryGetValue를 사용하는게 좋다.

 

 

시간적으로 얼마나 차이가 나는지는 아래 블로그를 보고 이해했다.

거의 두배차이가 나는걸 확인할 수 있다.

 

Unity Dictionary ContainsKey 와 TryGetValue 비교

Dictionary ContainKey vs TryGetValue Dictionary에 원하는 Key에 값이 있는지 확인할 떄 2개의 함수를 사용합니다. 해당 두 기능을 비교하여 어떤 함수가 더욱 빠른지 그리고 왜 빠른지에 대해서 알아보도록

game-dev.tistory.com

 

 

오늘의 회고

코딩테스트를 하면서 ContainsKey를 사용하고 만약 true라면 접근해서 변수에 할당하는 형식으로 자주했었는데 이런 차이가 있는줄 몰랐다. 그냥 자주 사용했는데 이렇게 효율적인 메서드를 알게되어 뿌듯하고 앞으로도 효율적이게 코드를 짤 수 있도록 노력해야겠다.

using System;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "MonsterQuestData", menuName = "ScriptableObjects/MonsterQuestDataSO", order = 1)]
public class MonsterQuestDataSO : QuestDataSO
{
    public string MonsterName;
    public int QuestContentID;
    public string QuestContent;
    public string QuestContentNum;

    private static Dictionary<int, string> questContents = new Dictionary<int, string>
    {
        { 1, "소탕" }
    };

    private static Dictionary<int, int> questContentNumbers = new Dictionary<int, int>
    {
        { 1, 50 }
    };

    public void QuestContentLoad()
    {
        if (questContents.TryGetValue(QuestContentID, out string content))
        {
            QuestContent = content;
        }

        if (questContentNumbers.TryGetValue(QuestContentID, out int contentNum))
        {
            QuestContentNum = contentNum.ToString();
        }
    }

    public override string GetQuestContent()
    {
        QuestContentLoad();
        return $"Quest {QuestNum} - {QuestName} (최소 레벨 {QuestRequiredLevel})\n" +
                      $"{GetNPCName()}의 {MonsterName}: {QuestContentNum}마리 {QuestContent}";
    }
}

 

내가 사용했던 부분은 QuestContentLoad() 인데 되게 코드가 짧아지면서 불필요한 접근을 하지않는다니.. 역시 공부는 하면할수록 신기한 것 같다.

사실 기본적으로 TryGetValue를 사용하는 것 같은데 왜 나는 처음 ContainsKey를 먼저 알게됐는지.. ㅎㅎㅎ

둘다 많이 사용할 것 같고 자료구조에 대해서도 자세하게 공부했다! 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Record > TIL' 카테고리의 다른 글

[Unity] 고전 게임 기반 팀프로젝트 마무리 (똥피하기게임)  (0) 2024.05.23
[Unity] Unity Image에 동영상 넣기  (0) 2024.05.22
[Unity] Unity Toggle 사용하기  (0) 2024.05.20
[Unity] 유니티 Json으로 로그인 시스템 구현하기(읽고 쓰기가능한 경로)  (2) 2024.05.17
[Unity] 결합도와 응집도  (4) 2024.05.16
'Record/TIL' 카테고리의 다른 글
  • [Unity] 고전 게임 기반 팀프로젝트 마무리 (똥피하기게임)
  • [Unity] Unity Image에 동영상 넣기
  • [Unity] Unity Toggle 사용하기
  • [Unity] 유니티 Json으로 로그인 시스템 구현하기(읽고 쓰기가능한 경로)
석영
석영
관심 분야는 AR, VR, 게임이고 유니티 공부 중 입니다. (정보처리기사,컴퓨터그래픽스운용기능사 취득)
반응형
석영
유석영의 개발공부
석영
전체
오늘
어제
  • 분류 전체보기
    • Unity
      • Project
      • Tip
      • Assets
    • Record
      • TIL
      • Game
    • Language
      • C#
      • Node.js
      • HTML, JS
    • Study
      • Linear Algebra

인기 글

최근 글

hELLO· Designed By정상우.v4.5.2
석영
[Unity] Dictionary TryGetValue 메서드 활용하기 (ContainsKey와 차이점)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.