교육 (Today I Learned)/SeSAC

SeSAC 16일차 / 자료 구조(집합, 맵)

Bay Im 2023. 8. 8. 00:31
 SeSAC 16일차(2023-08-07)
자료 구조(집합, 맵)


 

집합(Set)

 

(hast) Set

  • 중복 항목이 존재하지 않는 컬렉션
  • Set 인터페이스를 상속
  • 데이터에 접근 속도가 빠르다

 

  • 해시 테이블을 사용한 자료구조
    • 해시 함수를 통해 데이터의 저장 위치를 참조
    • 동일 항목은 같은 위치에 참조되기 때문에 중복 항목이 없다
    • 배열, 리스트와 다르게 저장 순서를 기억하지 않는다

 

  • LinkedHashSet
    • 연결 방식을 활용하여 항목의 입력 순서를 기억
  • TreeSet
    • 트리 구조를 활용하여 항목이 정렬된다
    • 접근 속도는 HashSet보다 떨어지지만 LinkedHashSet 보다 빠르다

 

 

 

  • Set 생성과 추가
    • HashSet은 입력 순서를 유지하지 않음
    • add() 메소드를 활용하여 항목 추가 (기존 중복 항목이 있으면 false 반환)

 

ex)

// HashSet은 입력 순서가 유지되지 않음

Set<String> set1 = new HashSet();

 

set1.add(”자바”);

set1.add(”기초”);

set1.add(”자료구조”);

set1.add(”해시셋”);

set1.add(”기초”);

 

for(String s : set1):

sout(s + “ ”);

⇒ 자료구조 해시셋 자바 기초 출력

 

sout(set1.size()); ⇒ 4 출력

 

 

// LinkedHashSet은 입력 순서 유지

Set<String> set2 = new LinkedHashSet();

 

 

 

  • Set 중복 제거
    • Set은 중복 항목을 제거하는데 유용하다 (HashSet은 순서가 기억되지 않음)

 

ex)

순서와 중복이 있는 list를 set으로 중복 제거

 

// 중복은 제거되고 순서는 섞여서 나온다

Set<String> hashSet = new HastSet(list);

 

// 해시셋을 리스트로 재변환

List<String> rlist = new ArrayList<String>(hashSet);

sout(rlist.toString());

 

 

  • LinkedHashSet: 입력의 순서를 유지시킨다.
  • TreeSet 데이터를 정렬 시킨다.

 

ex)

// 순서가 유지되고 중복 제거 (연결 해시셋)

Set<String> lhSet = new LinkedHashSet<String>(list);

 

// 순서가 정렬되고 중복 제거 (트리 해시셋)

Set<String> trSet = new TreeSet<String>(list);

 

 

 

 

 

맵(Map)

 

  • Map<K, V>
    • 키, 값에 대한 2개의 타입으로 제네릭이 정의되는 Map<Key, Value> 인터페이스
    • 키 - 값 매핑 구조를 가지고 있다.

 

 

 

  • (hash) Map
    • 해시 테이블을 사용한 키-값 구조
      • 키는 중복 불가능이며 순서를 기억하지 않는다.
    • 순서가 있는 Map
      • LinkedHashMap
      • TreeMap

 

 

 

  • Map 생성과 put
    • Map 인터페이스를 상속받는 클래스를 인스턴스로 초기화
    • put(key, value) 메소드를 통해 키-값 쌍을 맵에 입력

 

ex)

// 키의 중복과 순서가 없는 hash

Map<String, Integer> hashMap = new HashMap();

 

hashMap.put(”자바”, 100);

hashMap.put(”자료구조”, 50);

 

sout(hashMap.toString());

⇒ {자료구조=50, 자바=100}

 

 

 

  • 다양한 Map 구조
    • hash: 키의 순서와 중복이 없다
    • linkedhash: 키의 중복이 없지만 입력 순서 유지
    • tree: 키의 중복이 없고 순서 정렬

 

ex)

// 키의 중복이 없고 순서가 유지되는 linkedhash

Map<String, Integer> lhMap = new LinkedHashMap();

lhMap.put(”자바”, 100);

 

// 키의 중복이 없고 순서가 정렬되는 tree

Map<String, Integer> treeMap = new TreeMap();

treeMap.put(”자료구조”, 50);

 

 

 

  • Map 접근, 수정
    • get(key) 메소드를 통해 키값으로 value 값에 접근
    • put(key, value) 메소드에 기존에 있던 키값에 다른 value를 넣어 수정 (replace(key, value) 메소드도 동일 역할)

 

ex)

// 키값을 통해 맵에서 value 항목 가져오기

int v1 = hashMap.get(”자바”);

sout(v1); ⇒ 100 출력

 

// 키값을 통해 맵의 value 바꾸기

hashMap.put(”자바”, 50);

treeMap.replace(”자료구조”, 100);

 

 

 

  • Map 반복 접근
    • keySet() 메소드를 통해 key 값을 Set 구조로 가져와 for-each 구현
    • Map의 forEach() 메소드를 활용하여 for-each 구현
      • (key 변수, value 변수) → {code}

 

ex)

// keySet() 활용 for-each 구현

for (String k: hashMap.keySet()) {

    sout(”키: “ + k);

    sout(”값: “ + hashMap.get(k));

}

 

// forEach() 활용 for-each 구현

hashMap.forEach((String k, Integer v)-> {

    sout(”키: “ + k);

    sout(”값: “ + v);

});

 

 

 

  • Object 업캐스팅 활용
    • Map 구조에는 상황에 따라 다른 타입의 value가 입력되야할 수 있다. (키는 하나의 타입으로 고정되어야 한다(String))
    • 모든 클래스는 Object로 업캐스팅 가능
    • 접근하여 사용하기 위해선 다운캐스팅 필요

 

ex)

// Object 타입(업캐스팅) 활용

Map<String, Object> hashMap = new HashMap();

 

// 모든 타입을 value로 입력 가능

hashMap.put(”이름”, “김땡땡”);

hashMap.put(”번호”, 24);

 

// 또다른 자료구조도 가능

List<String> sjList = new ArrayList();

sjList.add(”파이썬”);

sjLIst.add(”sql”);

 

hashMap.put(”기존과목”, sjList);

 

// 직접만든 클래스 타입도 가능

Subject subject = new Subject(1, “자바”);

hashMap.put(”수강과목”, subject);

 

// 접근하면 다운캐스팅하여 사용

Subject mySj = (Subject) hashMap.get(”수강과목”);

sout(mySj.getName());

 

 

 

 

 

오늘의 실습 코드

https://github.com/yubin-im/SeSAC/tree/e935e9ffa733c85e016433d0591f32d645433382/20230807