2021.11.19(금)
🌿 Set
- 담고자 하는 값(value)만 저장 + index 개념 없는 바, 저장하고 꺼낼 때 순서 유지x + 새로 넣는 값과 기존 값 비교해서, 중복 값 허용x
- 똑같은 요소는 넣을 수 없는 + 순서 없는 커다란 바구니
null도 중복을 허용하지 않음 → 1개의 null만 저장됨
- 원하는 순서대로 뽑아내기 어려움
- 특징이 조금 다르지만, 사용하는 방법은 list와 똑같음
- 사용 예시: 중복 체크해야 할 때 e.g. 웹사이트 방문자 수, 회원 가입 시 같은 사람은 중복되면 안 될 때 등
🌱 HashSet
- HashSet의 특징: 값이 추가될 때마다 equals() 메소드와 hashcode()로 비교 후, 둘 다 결과가 true일 경우 동일 객체로 판단
- equals(): 현재 객체의 주소값을 비교해서 결과 반환 -> 반환형 = boolean(같으면 true)
- hashCode(): 현재 객체의 주소값을 해싱해서 10진수로 반환 -> 반환형 = int(4bytes 크기의 기본자료형, -21억~21억 정도 총 43억개 정수 표현 가능)
// Student 객체만 담을 수 있는, 'stds'라는 이름의, HashSet(Set) 만들기
HashSet<Student> stds = new HashSet<>();
stds.add(new Student("판다", 2, 87));
stds.add(new Student("미피", 3, 92));
stds.add(new Student("곰돌", 5, 95));
stds.add(new Student("해피", 4, 85));
stds.add(new Student("미피", 3, 92)); // new로 생성되어 heap영역의 주소값 다름 -> equals() 및 hashCode()를 통해 다른 객체로 판단됨
System.out.println(stds);
// 저장 순서 유지 안 됨 + 2개의 미피 객체가 동일 객체로 판단되지 않았기 때문에 중복 저장되어있음(두번째 미피 객체도stds 바구니에 들어가있음)
hash알고리즘이 쓰이는 곳은 많지만, Java에 한정해서 설명해보자면..
- 해시코드가 같아도(e.g. 3, 3) 반드시 같은 주소값은 아님 ← 만약 내가 생성한 객체가 44억개라면 44억개의 주소값 vs hashCode()의 반환형이 4bytes이기 때문에 43억개 정도의 해시코드만 생성이 가능한 바, 해시코드가 같더라도 다른 객체일 경우가 있음(hash 충돌/collision)
- 해시코드가 다르면(e.g. 3, 4) 반드시 다른 주소값임 ← 같은 값에 (나만의) 해시알고리즘(e.g. * 31 - 1)을 적용한다면 같은 값이 나옴 vs 다른 값에 해시알고리즘을 적용한다면 다른 값이 나올 수 밖에 없음
- 위 예시 코드에서 '미피' 객체는 내용물이 같은데 주소값이 달라서 동일 객체가 아닌 것으로 판단이 되면서 중복 저장이 됨 vs 방지하고 싶다면 equals()와 hashCode()를 오버라이딩해서 사용해야 함
e.g. Student클래스에 가서 3개 필드의 값이 모두 일치하면 true를 반환하도록 equals() 오버라이딩 + 3개 필드의 값을 더해 문자열로 만들고 그 문자열의 해시코드 값을 만들어서 반환하도록 hashCode() 오버라이딩 등 - HashSet에 들어있는 모든 요소들 조회하는 방법
- 해당 set으로 ArrayList를 만들고, 반복문으로 ArrayList의 원소들을 순회
- 해당 set의 Iterator 활용하여 원소들을 순회
🌿 Map
- key(식별자) + value(값) 세트로 추가
- 제네릭을 쓰려고 할 때 <Key,Value>와 같이 2개 타입 입력해야 함
- 주요 메서드
🌱 HashMap
- HashMap에 들어있는 모든 요소들 조회하는 방법
- 해당 map으로 keySet을 얻음
- 해당 map으로 entrySet(e.g.
Set<Entry<String, Burger>>
)을 얻음
→ 각 set의 Iterator 활용하여 원소들을 순회
🌱 Properties
- Map계열 → key+value 세트로 저장 + 단, key와 value 모두 String형을 다룸
- 표현법:
Properties 이름 = new Properties();
- Properties의 용도 = 파일 입/출력을 위해 e.g. key+value 세트 파일로 기록, 파일로부터 읽어오는 용도 등
- .properties 확장자 파일 = 자주 변경되지 않는/고정해두는 설정 파일, 해당 프로그램이 기본적으로 가져야할 정보(옵션 정보, DB 연결 정보, 국제화/다국어 정보 등) 담는 파일 → key와 value가 = 기호로 연결되어 있는 텍스트 파일, ISO 8859-1 문자셋으로 저장됨
- .xml 확장자 파일 = 다양한 프로그래밍 언어 간 호환성이 좋음
- 주요 메서드
📗 소감
- 우아, Java 문법 보충 수업이 마무리되었고, 다음 주부터는 데이터베이스와 Java를 연결하는 JDBC를 배운다고 한다. 1달 전 개강했을 때와 비교하면 정말 많은 것을 배웠고, 새로운 많은 작은 프로그램들을 만들어보았다
- 하지만, 아직 Java의 정석 책을 보면, 학원 수업에서 다루지 않은 내용이 많고, 학원 수업에서 다뤘더라도 책 내용만큼 깊이 생각/연습해보지 않은 부분이 많은 것 같다. 과정 전체에서 결국 Java가 가장 중요하다고 하니 계속 복습+반복하면서 Java 언어를 더 잘 알고 활용할 수 있도록 하자!
- 어제와 오늘 배운 Collections의 세부 구현체들도 하나씩 다 공부해 보라고 하셨으니, 이것도 to-do 리스트에 추가!
📗 homework: Java 전반 복습 (+인터페이스, 객체배열 숙제)
- "인터페이스" 실습 파일 위치: 09 Polymorphism > src > com > kh > practice > chap02_abstractAndInterface
'back-end dev > Java' 카테고리의 다른 글
IntelliJ IDEA *.iml 파일 (0) | 2022.08.05 |
---|---|
IntelliJ IDEA 설치(Mac OS) 및 환경 설정 (0) | 2022.08.02 |
[KH정보교육원] 28일차_(Array)List (0) | 2021.11.19 |
[KH정보교육원] 27일차_Wrapper클래스, Input/Output (0) | 2021.11.17 |
[KH정보교육원] 26일차_String클래스 실습 (1) | 2021.11.16 |