이론/자바 기초

java 그게 뭐야? 17.HashSet, Iterator, HashMap, 빠른 for문

달거북씨 2022. 3. 20. 03:01

총 10일짜리 자바수업 중 9일차에 해당하는 내용

거의 끝부분인데 다 이해했냐고 묻는다면 비밀!!!

확실한 건 국비수업 들을 때 이해에 도움은 된다 하핳

 

16. 컬렉션 내용에서 이어진다.

2022.03.19 - [이론/자바 기초] - JAVA 그게 뭐야? 16. 컬렉션프레임워크, ArrayList, <>Generic제네릭

 

JAVA 그게 뭐야? 16. 컬렉션프레임워크, ArrayList, <>Generic제네릭

1. 컬렉션 프레임 워크(Collection FrameWork) 많은 데이터(객체)들을 효과적으로 관리할 수 있는 표준화된 프로그래밍 방식 다수의 데이터(객체)를 편리하게 다룰 수 있는 클래스 및 인터페이스의 집

turtlemoon.tistory.com

 


 

1. HashSet

HashSet hash = new HashSet();

Set 인터페이스를 수현한 대표적인 컬렉션 클래스

순서x, 중복x

 

1) 저장된 값들은 인덱스가 없기 때문에 순서가 없다.

2) 값의 유무 검사에 특화되어 있는 자료구조

3) 해시코드로 유무검사가 진행되고 속도가 상대적으로 좋다(주소값으로 비교)

4) HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.

    같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.(중복되지 않기 때문에)

 

 

생성자

HashSet()

HashSet(Collection c)

 

 

주요 메소드

boolean add(Object o) : 요소 추가

boolean remove(Object o) : 요소 제거

boolean contains(Object o) : 요소 포함 여부를 알려줌

 

 

HashSet? ArrayList?

Set은 검사의 목적이 있기 때문에 데이터의 순서를 관리할 필요가 없고, 데이터 크기에 상관없이 검색에 걸리는 시간이 매우 짧다. 반면 ArrayList는 데이터의 index를 관리해야 하기 때문에 상대적으로 시간이 오래 걸린다.

즉, 기능적 차이가 없다면 HashSet 사용

 

 

***HashSet에 객체를 추가할 때 주의할 점!

boolean add(Object o) 메소드는 저장할 객체의 equals()와 hashCode()를 호출한다. 따라서 우리가 만든 클래스의 객체를 HashSet에 저장할 때, 반드시 equals()와 hashCode()를 재정의한 후 추가(add)해야 한다.

 

만약 equals()와 hashCode()가 오버라이딩 되어있지 않을 경우, 객체의 주소값으로 기존에 같은 객체가 있는지 확인한 후 저장하기 때문에 중복된 값을 넣을 수가 없다.

(객체를 구별하는 기준은 iv. 따라서 HashSet에서 iv가 중복되면 안됨)

 

 

예제

중복이 안되기 때문에 중복값을 제외하고 fruitSet에 저장됨 / 순서도 없음

 


 

2. Iterator

컬렉션에 저장된 데이터를 읽기 위해서 사용되는 인터페이스

 

 

Iterator 사용 이유

1) Iterator는 컬렉션마다 저장된 요소를 읽어오는 방법을 표준화시킨 것.
    List나 Set 같은 경우 서로 읽어오는 방법이나 메소드가 다르기 때문에 만약 List가 Set으로 바뀔 경우 읽어오는 방법도

    바껴야 한다. 하지만 Iterator를 사용할 경우, 컬렉션을 바꿔도 읽어오는 방법은 바꾸지 않아도 된다.

2) 순서가 없는 객체에 순서를 부여하거나, 순서가 있어도 Iterator 방식으로 데이터를 읽어올 때 사용

 

 

Iterator 사용 방법

컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용한다.

 

ArrayList arrList = new ArrayList();
Iterator it = arrList.iterator();		// Iterator 객체 반환

*** Iterator는 '1회용'이기 때문에 순서를 다 돌면 다시 새로운 Iterator 객체를 얻어야 한다.

 

 

Iterator 메소드

boolean hasNext() : 읽어올 데이터가 남았는지 확인하여 true, false 반환

Object next() : 다음에 오는 데이터를 읽어오며 값을 가져온다. 따라서 next()를 호출하기 전 hasNext()를 호출하여 읽어올 데이터가 있는지 확인해야 한다.

 

 

예제 (HashSet 예제에서 이어짐 - Iterator 사용하기)

 

 

예제 (ArrayList 사용하기)

▶️ ArrayList(Collection c) > set을 매개변수로 컬렉션 타입에 넘기면(ArrayList(set)) ArrayList로 반환해준다.

 


 

실습1

 

 

실습2(Generic에 담을 객체를 직접 생성해서 Hashset 사용하기)

Student 클래스
HashSet 사용
equals()와 hashCode() 재정의

 


 

3. HashMap

HashMap map = new HashMap();

데이터를 key와 value 한쌍으로 저장하며 검색의 목적을 가지고 있다.

순서x, 중복x(value는 중복가능)

key value
fly 날다
walk 걷다
run 뛰다
run 작동하다

entry(한 쌍)

fly - 날다, walk - 걷다, run - (뛰다 > 작동하다로 수정됨)

 

1) key에 중복된 값을 넣으면 value가 최근 값으로 수정되고 중복되지 않은 값을 넣으면 새롭게 추가된다.

2) value는 수정이 가능하다.

3) Map에는 iterator()가 없기 때문에 keySet(), entrySet(), values()를 호출해 값을 가져온다.

 

 

생성자

HashMap()

HashMap(Map m) : Map을 HashMap으로 변환

 

 

주요 메소드

Object get(Object key) : key 값을 통해 value 값 가져오기

Object put(Object key, Object value) : 데이터 추가 또는 value 값 수정

Set entrySet() : Map에 저장된 데이터 한 쌍씩 모두 읽어오기

Set keySet() : Map에 저장된 key값 모두 가져오기

Collection values() : Map에 지정된 모든 value 값 가져오기

 

 

HashMap의 iterator()

Map map = new HashMap();

                  ...

map.entrySet().iterator   // map.entrySet()은 iterator의 객체

                     ↓

Set eSet = map.entrySet();

Iterator it = eSet.iterator();

 

 

예제

 

 

실습 (저번 시간보다 쉬운 회원가입 폼 만들기)

 


 

4. 빠른 for문(forEach문, 향상된 for문)

for(자료형 변수명 : 컬렉션 or 배열){
	// 컬렉션이나 배열에서 요소를 하나씩 꺼내오면서 반복
}

단순하게 모든 값들을 순회할 때 사용하는 것이 좋다.

순서가 중요한 경우에는 (몇 번째에 어떤 요소가 있는지 알 필요가 있는 경우) 기존의 for문을 사용한다.

 

 

예제

 


 

실습

 

 

 

728x90