JAVA

다섯번 째, 컬렉션프레임 워크란?(List, Set, Map, Iterator)

seung_ho_choi.s 2022. 11. 18. 01:41
728x90

개요: 필자가 컬렉션프레임 워크 강의를 들으면서 너무 어렵고 헷갈리고 해서 정리하는 개념으로 쓰는 글이다.

 

구글링과 강의내용을 토대로 정리를 해보겠다.

 

컬렉션프레임 워크란?  -(집합, 틀, 작업) - 직합의 틀로 만들어 잡업하는 것 

배열을 사용하다 보면은 크기가 고정적이라 비효율적인 문제가 생긴다. 자바는 이러한 문제점을 바탕으로 

흔히 알려져있는 자료구조를 토대로 객체나 데이터를 효율적으로 관리하는것을 만들어 놓았다. 

 

- 프로그램 구현에 필요한 자료구조를 구현해 놓은 라이브러리다.

- 여러 인터페이스와 구현 클래스 사용 방법을 이해해야 한다. 

- 최적화된 알고리즘을 사용할 수 있다.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2Fbdy438%2FbtqEjPZKIY0%2Fe5Wm8ZJmdRNza4tKBzaK6k%2Fimg.png

자료화면은 다음과 같다. 

List 인터페이스

- 순서가 있는 자료 구조

- 중복이 허용된다.

-이것에 대한 클래스는 ArrayList, Vectior, LinkedList, Stack, Queue 등이 있다.

List 인터페이스는 우리에게 익숙하다. 그러기 때문에 간단하게 정리하고 넘어가겠다. 

 

Set 인터페이스

- 순서가 정해져 있지 않은 자료구조 

- 중복을 허용하지 않은 자료구조 

- get()메서드가 허용되지 않는다.

- 아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용한다. 

- 저장된 순서와 출력순서는 다를 수 있다. 

- 이것에 대한 구현 클래스는 HashSet, TreeSet이 있다. 

 

HashSet

- 순서를 예측 할 수 없다. 

HashSet을 코딩을 통해 정확히 알아보자 

저렇게 String타입으로 선언한 후 add를 통해 넣어주면 List 같으면 최승호, 김용현, 문홍욱, 문홍욱 이렇게 출력결과가 

나와야하는데 Hash로 받았으므로 최승호 문홍욱 김용현 즉 중복 되는 것은 지우고 순서와 상관없이

다음과 같이 출력결과가 나온거다. 

 

다음은 HashSet String이 아닌 Member 타입으로 받았을 때 생기는 일다. 자료사진에 안나와있지만

MemberHashSet 클래스에는 HashSet<Member> hashSet=new HashSet<Member>(); 이렇게 적혀있다. 

Member 타입으로 받았을 때 String 타입이랑 받았을 때랑 똑같이 나올줄 알았는데 순서빼고 중복이 허용되는 것으로

나왔다. 왜냐하면 String 타입에는 중복이 허용되지 않는 그런 코딩있는데 객체 타입은 없어서 따로 오버라이딩을 받아야 한다. 

오버라이딩을 통해 equals와 hashCode 불러오고 MemberId 기준으로 다음과 같이 작성하면은 출력결과가 

장유성회원님의 아이디는 3입니다를 제외하고 나머지가 순서대로 출력이 된다. 

(이해가 안되는 점이 Hash면은 순서와 상관없이 출력이 되야되는데 저 오버라이딩을 쓰면은 순서대로 출력이 된다.

이점은 공부해서 한 번 보완해보겠다. 아직 100 프로 이해한게 아니라서 ,,, ㅜ )

 

TreeSet

- 중복을 허용하지 않으며 오름차순 또는 내림차순으로 객체를 정렬해야 한다. 

- 내부적으로 이진 검색 트리로 구현되어 있음

- 객체 비교를 위해 Comparable, Comparator 인터페이스를 구현 해야 한다.

String타입으로 정의를 하면 기본적으로 순서가 정렬이(오름차순) 되고, 중복 허용이 안뜨게 출력이된다.

근데 만약 순서를 내림차순으로 변경하고 싶으면 Comparator 인터페이스를 이용해야 한다. 작성법은 다음과 같고 

무조건 new MyCompare() - (작성한 클래스)로 작성을 해야한다. 왜냐하면 String 타입에 기본적으로 Comparable 인터페이스가 있어서 추가로 정렬하고 싶으면 Comparator 인터페이스를 적용시켜야 된다.  

 

HashSet과 마찬가지로 Member 타입으로 작성시 기본적으로 정의가 안되어 있어 오버라이딩을통해 재정의를 해준다. 

둘 중 하나는 반드시 정의를 해줘야 된다. 안해주면 오류뜬다..  무조건 implements<타입을 쓸 클래스 이름> 필수!!! 

 

Map 인터페이스

- 키(key), 값(value)의 쌍으로 이루어진 자료구조이다. 

- 순서는 없고 키(key)는 유일성을 가지고, value(값)의 중복은 허용이 가능하다. 

 

HashMap

-중복과 순서가 허용이 되지 않으며 Null이 올 수 있다. 

-아주 빠른 자료구조를 가지고 있다. 

- 정렬이 불가능함, 순서 보장X

다음은 예시 코딩이다. 여기서 우리는 key를 MemberId 즉 Integer 타입으로 하였고 Value를  Member 타입으로 선언했다. <이때 여기서 나오는 우리가 모르는 단어>

put(key,value) - 데이터 삽입을 뜻한다.

containKey(key) - key의 값이 보유하고 있는지를 뜻한다. 

keySet() - 키의 값을 출력 

TreeMap

-삽입 삭제가 굉장히 느리다.

- 삽입 순서를 보장한다.

- Map이지만 유일하게 정렬이 가능하다. 

이 친구도 강의를 들었는데 위와 동일했고 다만 다른 점은 기본적으로 오름차순으로 정렬되므로 다르게 정렬하고 싶으면은 앞서 말한 Compartor을 적용시켜 작성하면 된다. 즉 애는 Integer 타입으로 받아서 해결하면 된다.

예시는 아래와 같다. 

의문점이 분명히 HashMap인데도 불구하고 왜 순서가 정렬이 될까 곰곰히 생각을 해봤는데 String 타입과 다르게 

Integer 타입은 Object에서 순서와 중복 해결을 해주는 무언가의 코딩이 있기 때문에 가능한거 같다 이부분에 대해서도 

자세히 공부해야되는데 할게 너무 많다... 

 

Iterator 

- Collection의 개체를 순회하는 인터페이스이다. 

정의 방법은 다음과 같이 해주면 된다. 

Iterator <타입> iterator명= 컬렉션.iterator(); 

메서드는 다음과 같다

- hasNext() - 다음번에 가져올 값이 있는지 여부를 확인해준다. 있으면 true 반환한다. 

- next() - get과 동일하게 값을 반환시켜준다. 

- remove() - next()에서 가져왔던 값을 삭제, 반드시 next() 후에 사용해야한다. 

 

이것의 장점은 모든 컬렉션 사용이 가능하고 솔직히 list에서는 그냥하면 되지만 나머지는 get의 사용이 

불가능해서 이것을 사용하는거 같다. 직접해봤는데 무슨 이유가 있어 그냥 iterator 사용하는게 훨씬 좋다. 

 

느낀점: 지난 3~4일을 걸쳐 컬렉션프레임워크에 대한 간략한 개념 정리가 끝났다. 아직 다 완성된게 아니다.. 

직접 코딩도 다시 해보고 할게 정말 많다. 이제 겨우 건물을 지을 땅이 만들어졌을뿐 이젠 건물을 세워야 된다. 

너무 어렵고 헷갈린다. 구글링을 해본 결과 내가 쓴것보다 아직 더 많은 내용이 있다. 하.... 벡엔드 개발자가 되기 

정말 어렵구나 그래도 열심히 해보자  

728x90