본문 바로가기
Java/기초

[java 기초] 제네릭과 컬렉션

by Meaning_ 2021. 7. 4.
728x90
반응형

<컬렉션의 개념>

 

- 요소 객체들의 저장소

- 객체들의 컨테이너라고 불림

- 요소의 개수에 따라 크기 자동 조절

- 요소의 삽입,삭제에 따른 요소의 위치 자동 이동

- 고정 크기의 배열을 다루는 어려움 해소

- 다양한 객체들의 삽입,삭제,검색등의 관리 용이

 

<컬렉션과 제네릭>

 

- 컬렉션은 제네릭 기법으로 구현됨

- 컬렉션의 요소는 객체만 가능 (기본적으로 int,char,double등의 기본 타입 사용불가)

- 제네릭은 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법

(<E>,<K>,<V>: 타입 매개변수)

- 제네릭 클래스 사례

-->제네릭 스택 :Stack<E> 

    E에 특정타입으로 구체화 ,E를 제네릭 타입이라고 부름

   정수만 다루는 스택 Stack<Integer>

   문자열만 다루는 스택 Stack<String>

 

<제네릭의 기본 개념>

 

- 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개변수로 클래스나 메소드를 작성하는 기법

- c++의 템플릿과 동일

 

<Vector<E>의 특성>

 

- java.util.Vector

--> <E>에 E대신 요소로 사용할 특정 타입으로 구체화

- 여러 객체들을 삽입,삭제,검색하는 컨테이너 클래스

--> 배열의 길이 제한 극복, 원소의 개수가 넘처나면 자동으로 길이조절

- Vector에 삽입 가능한 것 : 객체,null,기본 타입은 Wrapper객체로 만들어 저장

- Vector에 객체 삽입: 벡터의 맨뒤에 객체 추가, 벡터 중간에 객체 삽입

- Vector에 객체 삭제: 임의의 위치에 있는 객체 삭제 가능, 객체 삭제 후 자동 자리 이동 

 

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

 

- add()를 이용하여 요소 삽입하고, get()을 이용하여 요소 검색

 

 

<벡터에 요소 삽입>

 

- add()메소드를 이용하여 벡터의 끝이나 중간에 요소 삽입 가능

- null도 삽입 가능하다.

- 자동 박싱기능을 활용하여 v.add(5) 이런식으로 삽입 가능 new Integer(5)로 자동 박싱됨

- v.add(2,100);을 사용하여 2번째 인덱스에 즉, 중간에 객체를 삽입할수 있다.

- 만약 벡터에 인덱스가 0번째만 삽입되고 뒤에는 아무것도 없는데 v.add(2,100)을 하게 되면 중간에 빈공간이 생기게 되므로 에러메세지가 뜬다.

 

<벡터의 크기와 용량 알아내기>

 

- int len=v.size();를 통해 벡터에 존재하는 요소 객체의 수를 알아낸다.

- int cap=v.capacity(); 를 통해 벡터의 용량을 알아낼 수 있다.

 

 

<벡터의 요소 알아내기>

 

- get()이나 elementAt()메소드를 이용.

- Intger obj=v.get(1); 벡터의 1번째 Integer 객체를 얻어 낸다.

- int i =obj.intValue();  obj에 있는 정수를 알아낸다. 윗줄 코드에서 1번째 인덱스의 Integer 객체를 obj에 담았으므로

                              obj는 1번째 인덱스의 Integer 객체이다.

 

<벡터에서 요소 삭제>

 

- v.remove(1); 인덱스 1의 위치에 있는 요소를 삭제한다.

 

- int last=v.lastElement(); 마지막에 있는 요소를 삭제

- v.removeAllElements(); 모든 요소를 삭제 

 

<벡터 예제>

<벡터 예제2>

점(x,y)를 표현하는 Point 클래스를 만들고, Point객체만 다루는 벡터를 작성하라.

<컬렉션과 자동 박싱/언박싱>

 

- 컬렉션은 객체들만 다룸, 그래서 기본 타입 데이터를 Wrapper클래스를 이용하여 객체로 만들어 사용

하지만 JDK1.5부터 자동 박싱/언박싱 작동하여 기본 타입 값 사용 가능

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

v.add(4);

int k=v.get(0);

 

- 제네릭의 타입 매개변수를 기본타입으로 구체화 불가능

Vector<int> v-new Vector<int>(); -->오류

 

<ArrayList<E>의 특성>

 

- java.util.ArrayList, 가변 크기 배열을 구현한 클래스

 --> <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화

 

- 벡터와 달리 스레드 동기화 기능이 없음 

-->다수의 스레드가 동시에 ArrayList 에 접근할 때 동기화되지 않음 

 

- ArrayList에 삽입 가능한것: 객체,null,기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장

 

- ArrayList에 객체 삽입/삭제: 리스트의 맨 뒤에 객체 추가, 리스트의 중간에 객체 삽입, 임의의 위치에 있는 객체 삭제가능

 

<ArrayList에 요소 삽입>

 

ArrayList <String> a=new ArrayList<String>(7);

 

a.add("Hello");

a.add(2,"Sahni"); --> 요소 중간 삽입도 가능하다.

 

<ArrayList의 크기 알아내기>

 

int len=a.size(); ArrayList 에 들어있는 요소의 개수 

 

- 벡터와는 다르게 현재 용량을 리턴하는 (capacity) 메소드는 없다.

 

<ArrayList내 요소 알아내기>

 

String str=a.get(1); 인덱스 1의 위치에 있는 원소 리턴 

 

- get()이나 elementAt()메소드를 이용하여 알아냄

 

<ArrayList에서 요소 삭제>

 

a.remove(1); 인덱스 1의 위치에 있는 요소 삭제

a.clear(); ArrayList의 모든 요소 삭제 

 

<ArrayList 예제>

 

이름을 4개 입력받아 ArrayList에 저장하고 모두 출력한 후 제일 긴 이름을 출력하라

 

 

<Iterator<E> 인터페이스>

 

- 컬렉션의 순차검색을 위함

- Vector<E>,ArrayList<E>,LinkedList<E>가 상속받는 인터페이스

 

메소드 설명
boolean hasNext() 방문할 요소가 남아있으면 true 리턴
E next() 다음 요소 리턴
void remove() 마지막으로 리턴된 요소 제거 

 

- iterator() 메소드:Iterator 객체 반환

- Iterator 갹체를 이용하여 인덱스 없이 순차적 검색 가능

 

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

Iterator <Integer> it=v.iterator();

while(it.hasNext()){//모든 요소 방문

 int n= it.next()//다음 줄 리턴

}

 

<HashMap<K,V>>

 

- 키와 값의 쌍으로 구성되는 요소를 다루는 컬렉션

- java.util.HashMap

- K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입

- 키는 해시맵에 삽입되는 위치 결정에 사용

- 값을 검색하기 위해서는 반드시 키 이용

- 요소 삽입: put()메소드, 요소 검색:get()메소드

- 요소의 삽입,삭제 시간이 매우 빠르다 (요소 검색 시간은 더 빠르다)

 

HashMap<String,String> map= new HashMap<String,String>();

 

<HashMap 요소 삽입>

 

map.put("love","사랑");

 

 

<'키'로 '값'읽기>

 

String kor=h.get("love"); //사랑

해시맵에 없는 문자열을 get하면 null을 반환

 

<키로 요소 삭제>

 

map.remove("love");

 

<요소 개수>

 

int n= h.size(); 

 

<HashMap예제>

 

(영어,한글) 단어를 쌍으로 해시맵에 저장하고 영어로 한글을 검색하는 프로그램을 작성하라. "exit"이 입력되면 프로그램을 종료한다.

 

 

<LinkedList<E>의 특성>

 

- java.util.LinkedList

- E에 요소로 사용할 타입 지정하여 구체화

- List 인터페이스를 구현한 컬렉션 클래스

- Vector,ArrayList 클래스와 매우 유사하게 작동

- 요소 객체들은 양방향으로 연결되어 관리됨

- 요소 객체는 맨 앞, 맨 뒤에 추가가능

- 요소 객체는 인덱스를 이용하여 중간에 삽입 가능

- 맨 앞이나 맨뒤에 요소를 추가하거나 삭제할 수 있어 스택이나 큐로 사용가능 

- 인덱스 이용하여 요소에 접근 가능

 

LinkedList<String> I= new LinkedList<String>();

 

<Collections 클래스>

 

- java.util패키지에 포함

- 컬렉션에 대해 연산을 수행하고 결과로 컬렉션 리턴

- 모든 메소드는 static 타입

- 주요 메서드

sort() : 컬렉션에 포함된 요소들을 sorting

reverse(): 요소의 순서를 반대로

max(),min(): 요소들의 최대,최솟값을 찾아냄

binarySearch():특정 값 검색 

 

<제네릭과 배열>

 

- 제너릭 클래스 또는 인터페이스의 배열을 허용하지 않음

- 제네릭 타입의 배열도 허용되지 않음

 T[] a=new T[10];

- 앞 예제에서는 Object 타입으로 배열 생성 후 실제 사용할 때 타입 캐스팅

return (T)stck[tos]; //타입 매개변수 T타입으로 캐스팅

- 타입 매개변수의 배열에 레퍼런스는 허용

 

 

728x90
반응형

'Java > 기초' 카테고리의 다른 글

[java 기초] 입출력 스트림과 파일 입출력  (0) 2021.07.05
[java기초] 기본패키지  (0) 2021.07.05
[java기초] 제네릭 프로그래밍  (0) 2021.07.02
[java기초] 모듈과 기본패키지  (0) 2021.07.02
[java기초] 패키지  (0) 2021.07.02

댓글