초록꼬마의 devlog
article thumbnail

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에 한정해서 설명해보자면..

  1. 해시코드가 같아도(e.g. 3, 3) 반드시 같은 주소값은 아님 ← 만약 내가 생성한 객체가 44억개라면 44억개의 주소값 vs hashCode()의 반환형이 4bytes이기 때문에 43억개 정도의 해시코드만 생성이 가능한 바, 해시코드가 같더라도 다른 객체일 경우가 있음(hash 충돌/collision)
  2. 해시코드가 다르면(e.g. 3, 4) 반드시 다른 주소값임 ← 같은 값에 (나만의) 해시알고리즘(e.g. * 31 - 1)을 적용한다면 같은 값이 나옴 vs 다른 값에 해시알고리즘을 적용한다면 다른 값이 나올 수 밖에 없음
  • 위 예시 코드에서 '미피' 객체는 내용물이 같은데 주소값이 달라서 동일 객체가 아닌 것으로 판단이 되면서 중복 저장이 됨 vs 방지하고 싶다면 equals()와 hashCode()를 오버라이딩해서 사용해야 함
    e.g. Student클래스에 가서 3개 필드의 값이 모두 일치하면 true를 반환하도록 equals() 오버라이딩 + 3개 필드의 값을 더해 문자열로 만들고 그 문자열의 해시코드 값을 만들어서 반환하도록 hashCode() 오버라이딩 등
  • HashSet에 들어있는 모든 요소들 조회하는 방법
  1. 해당 set으로 ArrayList를 만들고, 반복문으로 ArrayList의 원소들을 순회
  2. 해당 set의 Iterator 활용하여 원소들을 순회

 

🌿 Map

  • key(식별자) + value(값) 세트로 추가

 

출처: 학원 강의 자료

  • 제네릭을 쓰려고 할 때 <Key,Value>와 같이 2개 타입 입력해야 함
  • 주요 메서드

출처: 학원 강의 자료

 

🌱 HashMap

  • HashMap에 들어있는 모든 요소들 조회하는 방법
  1. 해당 map으로 keySet을 얻음
  2. 해당 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