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
'교육 (Today I Learned) > SeSAC' 카테고리의 다른 글
SeSAC 18일차 / 자료 구조(트리), 파일 입출력, 스레드 활용 (0) | 2023.08.10 |
---|---|
SeSAC 17일차 / 자료 구조(집합, 맵) (0) | 2023.08.10 |
SeSAC 15일차 / 자료 구조(리스트) (0) | 2023.08.08 |
SeSAC 14일차 / 자료 구조(리스트) (0) | 2023.08.03 |
SeSAC 13일차 / 자료 구조(배열) (0) | 2023.08.03 |