본문 바로가기
코딩

2022.02.22_12일차_컬렉션

by 흥뷰자 2022. 2. 26.

12일차 학습내용

1. 컬렉션 Collection
2. ArrayList : java.util.ArrayList
3. Vector : java.util.Vector
4. 제네릭 없이 사용 (장점 단점 있다)
5. Iterator<E> : java.util.Iterator (반복자)
6. HashMap<K, V> : java.util.HashMap    
7. Set<E> 인터페이스-> HashSet<E> 구현클래스  
8. Properties


1. 컬렉션 Collection


: JDK에서 많은 자료구조들을 컬렉션으로 만들어 제공, 하는 툴, 틀, 
제네릭이라는 기법으로 구현.
배열과 같은 고정크기의 단점을 극복하기 위해, 다른자료구조의 가변크기의 컨테이너로 만들어짐

(*자료구조: 배열/ stack 방식/ list / wrap ... /linkedlist .. 데이터들이 어떤 방식으로 저장, 관리, 이용되는지... 자바에서 미리 만들어놨기 때문에 매우 편리하게 이용할 수 있다. 사용법을 알아야쥬) 
배열: 여러 데이터를 한번에 정리해서 다루기 편리 but 삽입삭제빈번한데 고정크기이상의 객체 관리 못하는 단점. 중간객체 삭제시 데이터 다 옮겨야
컬렉션: 가변크기로 객체수 입력도 노필요. 
공간크기 염려할 필요도없고, 중간꺼를 빼도 불편한 작업을 내부적으로 자동으로 처리되게 만들어져있다.

1) 컬렉션을 만들기 위한 자바 인터페이스와 클래스 상관관계도

자바 인터페이스와 이를 구현한 클래스 상관관계도


       

 우리가 new해서 쓰는건 아래쪽  
위는 그 부모

[ Collection 상속, 단일 클래스 객체 ]
- Vector, ArrayList : 가변크기의 배열 * (동기화 지원 여부 차이 O,X)
- LinkedList : 노드들이 링크로 연결되는 리스트
- Stack : 스택
- HashSet : 집합
[ Map 상속 ]
- HashMap : 키와 벨류 쌍으로 이루어진 값을 저장하는 컬렉션 *


2) 제네릭 (Generic) 기법 : 

<> 꺽쇠표시된 애들이 이 기법을 사용해서 만듦 jdk 1.5 자바5부터 도입
: 컬렉션은 제네릭 기법으로 만들어짐.
컬렉션 클래스 이름에 <E>, <K>, <V> 등이 포함 -> <E>, <K>, <V> : 타입매개변수 (generic type)
Vector<Integer> --> 정수만 저장하는 자료구조. 가변크기배열벡터
Vector<String> --> 문자열만 저장하는 자료구조. 
Vector<Product> --> Product타입만 저장하는 자료구조. 내가 지정하는 타입으로 
특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 <E> 를 사용. 내부 타입이 알아서 바뀜
단, int, char, double 등 기본타입으로 제네릭 지정 불가. -> 그 기본형에 호환되는 Wrapper"클래스"로 지정해야함
동일하게 작업되어있는 코드에 다양한 데이터타입을 적용할 수 있도록 클래스와 함수들을 "일반화"시켜서 제네릭 함수와 제네릭 클래스를 만들고 그것을 이용해 개발자가 원하는 데이터 타입을 구체화시켜서 함수나 프로그램코드를 틀에서 찍어내듯이 생성하는 기법. 특정된게아님


ex) 제네릭 타입을 가진 클래스 // 제네릭 클래스도 우리가 만들 수 있다. 꺽쇠로 타입 붙여서 만들면 된다. 
class Stack<E> {
        ...
        void push(E element) {...}
        E  pop() {...}
}

Stack<String> s = new Stack <String>(); 객체생성

        void push(String element) {...}  E가 일괄로 내가 지정한 String타입으로 바뀜 
        String pop(){...} 리턴도 문자열로 리턴...


E : element 요소
T : type 
V : value
K : key

다 필요없고 이것만 기억하자요

Vector<Point> v = new Vector<Point>( );

v에 저장 할 수 있는 값은 Point객체만 가능하다~~~

 



2. ArrayList<E> : java.util.ArrayList


가변크기의 배열을 구현, Vector와 거의 동일.
스레드간에 동기화 지원X, 다수의 스레드가 동시에 ArrayList 요소 삽입/삭제시 
데이터 훼손 우려되지만, 멀티 스레드 동기화 시간 소모 없어 Vector보다 속도 빠름.
중간에 빈공간이 생기면 요소 위치 자동 이동시킴.
초기 사이즈 10이나 부족하면 자동으로 늘어남. (그래서 가변크기) 

so 배열에서의 OutOfBoundException오류는 발생하지 않음

1) 주요메서드 : 배열이 아니기 때문에 메서드 따로 써야 합니다.
boolean add(E elem) : 맨 뒤에 데이터 추가
void    add(int idx, E ele) : idx위치에 elem 추가
boolean addAll(Collection <? extends E> c) : 컬렉션c의 모든 요소를 맨 뒤에 추가
E    get(int idx) : idx위치의 요소 리턴
E   set(int idx, E elem) : idx위치의 요소를 elem로 변경하고, 변경전 요소를 리턴
void   clear : 모든 요소 삭제
E   remove(int idx) : idx위치 요소 삭제. 하면서 리턴도 해줌
boolean remove(Object o) : o와 동일한 요소 삭제
boolean contain(Object o) : o를 포함하고 있으면 true 리턴
int     idxOf(Object o) : o가 저장된 인덱스번호 리턴, 없으면 -1
boolean isEmpty() : 저장된 요소가 없으면 true
Object[] toArray() : 모든 요소를 포함한 배열 리턴

2) 객체 생성과 데이터 저장, 열거

ArrayList 기존 배열
#1. 생성
ArrayList<String> arr = new ArrayList<String>( );
ArrayList<타입> 변수명 = new ArrayList<타입>;
#1. 생성
int[] arr = new int[2];
타입[] 변수명 = new 타입[방크기];
ArrayList 변수명 = new ArrayList ( ); 제네릭 생략 가능. 
타입을 Integer, String 으로 입력해야 
사용하려면 패키지 임포트해야함. import java.util.ArrayList;
변수타입 생략 불가능
int, String 표기가 다름
따로 임포트할 필요 없음
#2. 데이터 저장
arr.add("사과");  // 하나씩
#2. 데이터 저장 
arr[idx] = 100; 
add()메서드는 어떠한 형태의 데이터형태도 수용 가능, 그 말은 ()괄호안에 들어오는 매개변수의 데이터 타입이 Object여야 한다는 말.(모든 데이터타입의 조상) 자동으로 Object타입으로 저장되니까 그 결과를 변수에 담으려면 변수 타입도 Object으로 하거나, 그 값 자체를 String이나 int타입으로 형변환해야 오류가 나지 않아. get()든 뭐든 다른 메서드 마찬가지.  
#3. 데이터 사용
for (int i = 0; i < arr.size( ); i++({     // 여러개
    System.out.print(arr.get(i));
}
#3. 데이터 사용
for (int i = 0; i < arr.length; i++({     // 여러개
     System.out.print(arr[i]);
}

형변환하는 건 옛날방식. 제네릭 타입의 안정성이 떨어지는 문제를 해결하기위해 컬렉션 프레임웤이 제네릭이라는 문법적 수단을 채택한 것.

그래서 #1.처럼 <타입>을 지정해주는 것이 바람직해용.

처음 생성할 때 <String>을 꺽쇠(제네릭)로 명시했기 때문에 해당 영역에 들어오는 데이터는 내부적으로 Object가 아닌 <String>타입으로 자동으로 인식하게 됩니다~~~~



3. Vector : java.util.Vector


가변적 배열 구조, 동기화 지원(속도가 느릴수. 스레드 많을때)

11:34 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Vector.html

1) 벡터 생성


Vector<타입매개변수> 변수명 = new Vector<타입매개변수>();

2) 주요메서드
boolean add(E elem) : 맨 뒤에 추가
void    add(int idx, E elem) : idx위치에 elem 추가
void    clear() 
E    get(int idx)
E   elementAt(int idx)
void    clear()
E    remove(int idx)
boolean remove(Object o) : o랑 같은거 삭제
E    set(int idx, E elem)
int    size() : 저장된 요소의 개수 리턴  // 캐퍼시티로 반복문돌리면안됨
int    capacity() : 저장공간 크기 리턴
Object[] toArray() : 배열로 만들어 리턴
int    indexOf(Object o) : o의 인덱스번호 리턴
boolean isEmpty() : 요소가 없으면 true

11:45 VecTest01

11:51 우리가 만든 클래스 타입으로 제네릭 만들기 VecTest0210

 

여기서 기억할 한가지는 

List list = new ArrayList( );
list = new Vector( ); 
list = new Strack( );

부모타입(List 인터페이스) 변수에는 그것을 구현(상속받아 메서드 오버라이드)한 클래스는 뭐든 올 수 있다는 것입니다.
Vector클래도 ArrayList클래스도 모두 List 인터페이스 하위에 오는 것이죵
다형성. 호환을 위해 느슨하게 짠거쥬~ 





4. 제네릭 없이 사용 (장점 단점 있다)

 

위에서 ArrayList 변수명 = new ArrayList ( ); 처럼 제네릭 생략 가능하다고 했습니다.

타입을 지정하지 않으면 자동으로 Object로 저장됩니다. 즉 ,이 경우 모든 타입이 들어올 수 있게 되는데요. 

코드 활용성을 높이는 장점이될 수도 있지만. 

이때 꺼내서 생성한 객체의 변수나 메서드를 온전히 쓰려면 다시 Integer나 String 그에 맞는 타입으로 다시 담아야 한다는 점... (형변환 문제) 잊으면 안되겠어요~ 



5. Iterator<E> : java.util.Iterator (반복자)


: Vector, ArrayList, LinkedList, HashSet... 요소가 순서대로 저장된 컬렉션에서

요소를 순차적으로 검색할 때 사용하면 편함.

 

import필요~

우리가 생성해서 쓰는게 아니라 기존에 있는 컬렉션 객체에서 하나 얻어다 쓰는거에용. 

Iterator - 컬렉션 백터 내부요소꺼내기
Iterator2 - 전체 요소에 접근해서 [김피카츄, 이꼬북이, 최아이언, 박라이츄] key만 출력&amp;amp;amp;nbsp;

 

* 참고) keySet() 메서드  vs. entrySet() 메서드 

entrySet [김피카츄 = 100, 이꼬북이 = 100, 최아이언 = 90, 박라이츄 = 80] 세트로 출력


1)  주요 메서드
boolean hashNext() : 다음에 방문할 요소가 있으면 true
E   next()  : 다음요소 리턴
void   remove()  : 마지막으로 리턴된 요소 제거



6. HashMap<K, V> : java.util.HashMap    <12:44


: 키(key)와 값(value)의 쌍으로 구성되는 요소들을 다룬다.
K = key로 사용할 데이터 타입. 사용자가 지정함, 인덱스번호가 아니라 이름을 지정
V = 값으로 사용할 데이터 타입
데이터 저장시, key와 값을 받아 key를 이용하여 해시함수를 실행,
해시함수가 리턴하는 위치에 키와 값을 저장하는 형태,
반대로 데이터를 불러올 때 키를 이용하여 꺼내오는데, 
키를 이용하요 동일한 해시함수를 실행하여 값이 저장된 위치를 알아내어 값을 리턴한다. 

/// 보따리에 순서없이 저장된 느낌
-> index없다 => key(사용자 정의 인덱스값)로 꺼냄
-> index 중복X => key값이 중복되면 안된다. 유일한 키값

삽입삭제 시간 매우 빠름. vector array대비
검색은 더빠름.

12:53 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html

1) 객체 생성
HashMap< key제네릭타입, value제네릭타입> 변수명 = new HashMap<key제네릭, value제네릭> ();
HashMap< key제네릭타입, value제네릭타입> 변수명 = new HashMap<> ();


2) 주요 메서드
V    put(K key, V value)  : key value 쌍으로 요소 하나 추가 ///////// add 아님
V   get(K key) : key를 주고 값꺼내기
V   remove(K key) : key에 해당하는 key, value 세트 삭제
int    size()
void   clear()
Set<K>  keySet() : 키들만 모아서 Set타입으로 리턴
boolean containsKey(Object key)  : key를 포함하면 true
boolean containsValue(Object value) : value를 포함하면 true

HashTest01


영한사전만들기 HashTest02

<2:51 제네릭 타입 생략하고 만들기HashTest03

<3:00 엔트리셋HashTest05

 



7. Set<E> 인터페이스-> HashSet<E> 구현클래스  <3:15


: 순서가 없고, 중복 요소가 없는 컬렉션. 동일한 값 저장 불가



8. Properties

: K, V 형태로 데이터 저장
주로 어플리케이션의 환경 설정과 관련된 정보를 .properties확장자의 파일에 저장해놓고
해당 파일을 자바 코드로 불러올 때 사용하는 자바 클래스이다.








컬렉션 Collection
2. ArrayList : java.util.ArrayList
3. Vector : java.util.Vector
4. 제네릭 없이 사용 (장점 단점 있다)
5. Iterator<E> : java.util.Iterator (반복자)
6. HashMap<K, V> : java.util.HashMap    
7. Set<E> 인터페이스-> HashSet<E> 구현클래스  
8. Properties









 

댓글