Hayden's Archive

[자바/Java] Collection API 본문

Study/Java & Kotlin

[자바/Java] Collection API

_hayden 2020. 4. 19. 01:31

 Collection 

Collection API -> 이걸 알고 나면 배열을 할 필요가 없다. 그걸 할 필요가 없는 컬렉션! // 배열을 안함~~!

API 문서에서 java.util - Collection

Collection API : 객체들을 저장하는 특징을 다룸. 정확히 말하면 자바에는 자료구조 같은 게 없음. 컬렉션이 그 역할을 한다. 객체를 저장하는 특징을 다루므로 모든 객체를 다 정리하기엔 복잡. 특징을 다루므로 부모의 특징을 정리.

부모 : 계층 구조가 올라간 애들. 컬렉션 API는 부모의 특징! -> 결론적으로 인터페이스를 다루는 게 핵심.

가장 원시적인 방법으로 자료(객체)를 저장. -> 중복이 있는 게 원시적 / 순서가 없는 게 원시적. -> 중복 되고 순서 없다. -> 프로그램에서 원시적이다 아니다를 구분하는 것은 ordered임.

특징을 보려면 Collection API에서 Tree 메뉴에서 인터페이스를 본다. Interface Hierarchy

Collection의 계보도를 따라내려가면 자식으로 Set과 List가 있음.

Set은 Collection 다음으로 원시적인 저장법. Collection보다 더 나음. 중복 안됨. (Set을 가리키는 중요한 키워드 -> Unique)

List는 시작점과 끝점을 가지면서 환원형으로 자료를 저장. 배열과 같다.(차이점 : 배열은 클래스가 없지만 List는 클래스가 있다) 내부적으로 인덱스로 관리된다.

Hierarchy 인터페이스 트리에서 Map을 보면 Set이나 List처럼 Collection의 하위 자식 아님

(Set이나 List는 어느 정도는 Collection의 계보를 잇는다. Map은 아님.)

Map은 Collection에서 볼 수 없는 특징을 가짐. 독자적인 노선. => 이런 개념이 있어야 설계 개념으로 연결될 수 있음.

Map은 key-value 쌍으로 자료를 저장 보통 키를 찾고 키에 연결된 값을 찾는 게 일반적인 방법.

레벨이 올라가면 Map이 굉장히 중요해짐.

Vector는 동기화 처리를 완벽하게 함. 동시접속 절대로 안됨. 안정성 최고! 그런데 너무 무겁고 속도가 느림. 현업에서 쓸 일 없음.

Vector 코드 보면 syncronized 모두 다 있음.

Jdk 1.2일 때는 ArrayList를 제공함.(처음부터 제공했던 건 아님.) -> 99% 똑같음. 동기화 처리가 하나도 다 안 되어 있음. syncronized를 다 걷어냄. 내가 필요한 function만 직접 동기화 처리 syncronized를 구현할 수 있음.(보통 특수할 때만 쓴다.)

Hashtable 동기화처리가 너무 되어 있어서 옛날 방식. 하지만 자식으로 Properties가 있어서 중요함. Hashtable이 Vector 개념이고 / HashMap이 ArrayList 개념.

Properties는 Map임. Map이니까 자료를 key, value를 연결해서 쌍으로 저장한다. value는 주로 object! Properties의 key, value 둘 다 무조건 String! Object가 아니라 String으로 저장!(중요!) => Properties는 Map 중에서 값이 String으로 저장됨!

컬렉션API를 알아야 하는 이유 : 어떻게 담겼는지 알아야 뽑아낼 수가 있음.

Set, List 둘 다 Collection의 하위. 그래서 범용적으로 같이 쓰는 메소드가 대부분임. Set.add(), List.add() Vector.add() // Map은 add 아님. 다른 갈래

공부할 때 Hierarchy에서 상위 하위 이런 거 잘 볼 것.

API - java.util - HashSet 클래스 add랑 remove 보면 특정한 위치에 추가하거나 삭제하는 거 없음.

API - java.util - ArrayList 클래스 add랑 remove 보면 특정한 위치에 추가하거나 삭제하는 거 있음. 인자값으로 index가 있는 것은 순서가 있는 것.

Collection 굉장히 많이 쓴다.

 

 Map 

끝을 모른다, 순서가 없다 // 아무것도 없을 때까지 -> while로 뽑아냄.

for문은 마지막을 알 수 있을 때 Map방식과 Set방식으로 저장되었을 때는 for문을 못 쓴다. 몇번 돌지 모르니까!

for로 뽑아낼 때는 List계열 while로 뽑아낼 때는 Set/Map계열

List계열과 Map계열이 Set계열보다 더 자주 쓰임. Map에 있는 데이터로 뽑을 때 value부터 접근하는 경우는 거의 없음 key들을 뽑고 루핑 돌려서 각각 value를 뽑아냄

API 한번 더 살펴보기

java.util -> Interfaces -> Set Set하면 기억해야 하는 단어가 유니크! API에서는 no duplicate elements라고 말하고 있음.

Set에서 객체를 핸들링하는 메소드 add, remove, CRUD에서 가져오는 건 iterator(가져오는 프로세싱을 제공!) 사이즈를 해서 for를 쓰지 않고 iterator라는 프로세싱을 제공... for과 iterator 매커니즘은 다르다.

iterator로 핸들링하면 key만 받아서 value만 뽑아냄

그럼 Update는 어떻게? 방법 1. 찾아서 지우고 다시 넣기 방법 2. 오버라이트된다 = 업데이트 => 덮어쓰는지 아닌지 직접 테스트

isEmpty 많이 활용

size => 모든 컬렉션에 다 들어있음. 공통적

toArray() -> Set에 들어있는 걸 모두 배열로 바꿔서

인덱스가 없다. 순서를 가지면서 저장되지 않는 매커니즘이다.

=================

List -> Set과 부모는 같은데 완전히 다른 식으로 저장. 가장 대표적인 단어 ordered

역시 CRUD 찾아보기

function, 메소드가 많다 -> 굉장히 자주 쓰는 애들! (ex : String, ArrayList... 특히 String 많이 씀)

index 있고,,, remove 리턴 타입 중요(인덱스가 있는 리무브, 인덱스가 없는 리무브(삭제 됐냐 안 됏냐)

가져오는 것. get =>인덱스로 가져옴

수정하는 것 set

iterator

isEmpty

==> List는 CRUD가 완벽 ==> Set은 핸들링하는데 쓰는 게 아님. 중간에 과도기적 단계로 쓰임. Object elemetn를 핸들링하는데 쓰지는 않음. 리스트가 훨씬 좋음.

=========================

Map은 List와 Set과 달리 독자적임. 같은 계보 아님.

Map

Dictionary each key can map to at most one value. 핵심 워딩.

추가 -> put 제거 -> remove (인덱스 없고 객체 안 들어감. key가 들어감!) 받아오는 메소드 -> get(키로 받아옴)

수정하는 게 따로 없다. put을 add로만 생각하면 안 된다. 키가 없을 때는 추가인데, 키가 있을 때는 update도 된다.

entrySet은 개인적으로 볼 것.

Map이 가지고 있는 가장 매력적인 것 contatinsKey -> 이런 걸 써야 함. 이걸 쓰면 while문 돌려서 키가 있는지 없는지 쓸 필요 없다. 리턴 타입 불리언. 있다 없다

keySet 키 받아와서...

get과 keySet 차이 get은 키를 알 때 쓰는 것 / keySet 키부터 받아와야 할 때(while문에서 키들을 쫙 받아와서)

이런식으로 API를 볼 수 있어야 한다.