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를 사용하는게 좋다.
시간적으로 얼마나 차이가 나는지는 아래 블로그를 보고 이해했다.
거의 두배차이가 나는걸 확인할 수 있다.
오늘의 회고
코딩테스트를 하면서 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 |