[JAVA] Map & Set | HashMap & HashSet | 변수와 객체 선언 방식

jiyoon·2026년 2월 14일

1. Set(셋)과 Map(맵)

Set(셋): 중복을 허용하지 않는 집합 자료구조

  • 키 없이 값만 저장되고 같은 값은 한 번만 저장된다
  • 구현에 따라 다르지만 순서는 보통 보장하지 않는다.
  • 예: {1, 2, 3} (여기에 2를 또 넣어도 그대로)

Map(맵): Key(키)와 Value(값)를 한 쌍으로 저장하는 자료구조

  • key는 중복 불가, value는 중복 가능하다.
  • 저장할 땐 key + value를 한 쌍(엔트리)으로 저장하지만, value는 항상 key를 통해서만 접근 가능하다.
    (Entry = 어떤 자료구조 안에 들어있는 하나의 항목(항목 하나))

예:

{
  "apple": 1000,
  "banana": 1500
}

2. HashSet과 HashMap

해시셋과 해시맵은 각각 셋과 맵의 구현 방식 중 하나로, 내부적으로 해시 테이블을 사용한다.
따라서 검색, 추가, 삭제가 빠르다.

HashSet은 내부적으로 HashMap을 사용해서 구현된다.
(이때 해시맵의 value 자리에는 의미 없는 더미 객체 사용)
"Set의 값 = HashMap의 key"


3. 변수 타입은 인터페이스로, 객체 생성은 구현체로

변수 타입은 인터페이스로, 객체 생성은 구현체로 하는 것이 좋다.

// 권장 방식
Map<String, Integer> map = new HashMap<>();
Set<String> set = new HashSet<>();

// ❌ 비권장 방식
HashMap<String, Integer> map = new HashMap<>();
HashSet<String> set = new HashSet<>();
  • 구현체를 바꿔도 코드 수정을 최소화할 수 있다. (구현에 의존하지 않는 설계)
  • 코드 간에 결합도를 낮출 수 있다. 아래의 예시를 보면 전자는 무조건 HashMap만 받을 수 있는데, 후자는 HashMap, TreeMap, LinkedHashMap 등 다른 여러 구현체를 받을 수 있어 훨씬 유연하다.
public void process(HashMap<String, Integer> map)
public void process(Map<String, Integer> map)
  • 객체지향 SOLID 원칙 중 의존 역전 원칙 DIP에 부합한다. (구체적인 것에 의존하지 말고 추상적인 것에 의존하라)
  • 해당 구현체의 고유 기능을 써야 할 때나 지역 변수에서만 잠깐 쓰는 경우엔 변수 타입을 구현체로 선언해도 상관없다.


0개의 댓글