Debug & Think

[C#] Dictionary 값 증가: TryGetValue vs TryAdd, 어떤 게 더 좋은 선택일까? 본문

카테고리 없음

[C#] Dictionary 값 증가: TryGetValue vs TryAdd, 어떤 게 더 좋은 선택일까?

J.Note 2025. 6. 1. 23:57

 

 

 

C#에서 Dictionary<TKey, TValue>를 사용할 때, 특정 키의 값을 1씩 증가시키는 패턴은 자주 등장합니다.

이번 글에서는 아래 두 가지 방식이 어떤 차이가 있고, 어떤 상황에서 어떤 방식이 더 좋은지

성능과 가독성 측면에서 비교해보려고 합니다.


Dictionary<string, int> dicTest = new Dictionary<string, int>();

1. 두 가지 코드 패턴

❶ TryGetValue 방식 (한 줄)

dicTest[key] = dicTest.TryGetValue(key, out var count) ? count + 1 : 1;
  • key가 존재하면 기존 값을 가져와 1 증가
  • 없으면 1로 초기화
  • 장점: 한 줄로 처리 가능, 조건이 명확

 

❷ TryAdd + 인덱서 방식 (두 줄)

dicTest.TryAdd(key, 0);
dicTest[key]++;
  • TryAdd는 키가 없을 경우 (key, 0)을 추가
  • 이후 무조건 값을 1 증가시킴
  • 장점: 각 동작이 명확해서 가독성 우수

2. 동작 차이는?

조건 TryGetValue 방식 (TryAdd) + ([ ]++) 방식
키 없음 값 1로 할당 0으로 추가 후 1 증가 → 1
키 존재 기존 값 + 1 기존 값 + 1
최종 결과 항상 1씩 증가 항상 1씩 증가
 

결론: 동작 결과는 두 방식 모두 동일합니다.

 


3.  비교

항목  TryGetValue(key, out var value) TryAdd(key, value)
용도 Key가 존재할 경우 값을 가져올 때 사용 key가 없을 때만 기본값으로 추가할 때
반환값 존재 여부 (bool) + 값 (out)  성공 여부 (bool)
내부 로직 key 탐색 1회 + 값 반환 key 탐색 1회 + 없으면 삽입 (충돌 체크 포함)
성능 매우 빠름 거의 비슷함.(삽입시 추가 비용 존재)
적합한 상황 존재 여부 확인과 값 획득을 동시에 처리하려는 경우 기본값을 보장하면서 삽입하려는 경우
주의사항 key가 없을 땐 결과 확인 필수 이미 존재하면 아무 작업도 안 함

 

 


실무에서는 '무슨 일을 하려는 코드인가'가 더 중요하다

 

다음과 같은 코드들을 보면:

dicTest[key] = value;

처음 보는 사람 입장에서는 이 key가 언제 처음 생겼는지, 값이 초기화된 적은 있는지,

아니면 그냥 언제든 덮어쓰기만 하는 건지 판단하기가 어렵습니다.

이건 단순한 구현 문제라기보다, 코드 흐름을 해석해야 하는 부담을 후속 작업자에게 넘기는 일이 됩니다.

 

특히나 협업 상황에서는, 명확히 아래처럼 분리해 두는 것만으로도 가독성과 의도를 크게 높일 수 있습니다:

dicTest.TryAdd(key, 0);  // 없으면 0으로 초기화
dicTest[key]++;          // 무조건 증가

단순히 동작만 보면 위아래 모두 똑같은 결과지만, 이 코드에서는 "없으면 넣고, 그다음 증가한다" 는 흐름이 명확히 보입니다.

 

 


개인적인 결론

두 방식 모두 동작은 같지만, 의도의 표현력에서 차이가 납니다.

  • TryGetValue는 값이 '이미 있는지 확인하고 가져온다'는 의미에 가깝고,
  • TryAdd는 값이 '없으면 추가한다'는 명확한 의도를 전달합니다.

그래서 저는 “초기화 → 사용”의 명확한 흐름이 중요한 경우에는 `TryAdd` 방식을 선호합니다.
특히 협업 코드에서는 이런 사소한 차이가 코드의 전체 맥락을 더 쉽게 파악하게 해 줍니다.

 

 

마무리하며

사실 이 글은 단순히 "어떤 방식이 더 좋다"는 결론을 내리기보다는,
내 코드가 어떤 의도를 담고 있는지를 더 명확하게 표현하는 게 중요하다는 메시지를 전하고 싶어서 쓰게 됐습니다.

 

여러분은 어떤 방식을 선호하시나요?
실무에서 자주 사용하는 패턴이나 팀 내에서 합의한 스타일이 있다면, 함께 고민해보는 것도 좋을 것 같습니다.