JAVA/자바 이론 / / 2021. 6. 10. 16:11

Java | 7-1 제네릭과 컬렉션

01. 자료구조
02. 자바 컬렉션 프레임워크
03. 컬렉션 인터페이스
04. 컬렉션과 제네릭
05. Vector 클래스
06. ArrayList 클래스
07. Linkedlist 클래스

 

# 자료구조(Data Structure)

- 데이터의 집합을 의미하며 각 원소들 사이의 관계가 논리적으로 정의된 일정한 규칙에 의하여 나열되며 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 조직적, 체계적으로 구분하여 표현한 것

- 자료를 효율적으로 사용하기 위해서 자료의 특성에 따라서 분류하여 구성하고 저장 및 처리하는 모든 작업

 

# 자바 컬렉션 프레임워크

º 자료 구조의 중요성으로, 최근의 프로그래밍 언어 및 개발 환경은 다양한 표준라이브러리를 제공

º 자바 컬렉션 프레임워크

- 자바 컬렉션 클래스 라이브러리는 몇 개의 인터페이스와 실제 구현 클래스, 알고리즘으로 구성되어 있으며 외부에서 일관된 방식으로 접근하게 하는 프레임워크를 제공

- 삭제, 검색, 수정 등의 작업을 효율적으로 할 수 있는 다양한 메소드들을 제공, 효과적으로 데이터를 관리할 수 있음

 

# 컬렉션(collection)

º 컬렉션 : 요소(element)라고 불리는 가변 개수의 객체들의 모음   배열 ←→ 컬렉션

→ 객체들의 컨테이너라고도 함

→ 요소의 개수에 따라 자동으로 컬렉션의 크기가 조절

→ 요소의 삽입과 삭제에 따라 요소들이 자동으로 이동

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

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

 

# 컬렉션 인터페이스

º Collection 인터페이스

- 컬렉션의 각 요소를 저장하고 접근하는 기본적이고 공통적인 기능을 선언

- 요소(element) : 컬렉션에 묶어져 있는 개별 인스턴스

º Set 인터페이스

- 동일한 요소를 가질 수 없도록 하고, 순서가 유지되지 않음(단, TreeSet은 정렬 기능이 추가됨)

º List 인터페이스

- 요소를 일렬로 유지해서 위치에 의해 접근. 위치에 접근한다는 의미는 요소들이 아래 그림처럼 순차적으로 유지되고 각 요소의 접근은 해당 인덱스를 이용해서 접근함을 의미

º Queue 인터페이스

- FIFO(First-In-First-Out) 기능을 정의한 인터페이스

º Map 인터페이스

- Map은 (Key, Value) 쌍으로 데이터를 유지, 해당 Key를 넘겨 주면 Value를 얻을 수 있음

- Key에 의해서 데이터에 접근하므로 중복된 Key는 저장될 수 없음

 

# 컬렉션의 순차 검색을 위한 Iterator

º 컬렉션의 iterator() 메소드 반환타입 : Iterator<E>

º Iterator<E> 인터페이스

- 특정 컬렉션의 요소를 순차적으로 접근할 수 있게 지원해 주는 인터페이스

메소드 설명
boolean hasNext() 다음 반복에서 사용될 요소가 있으면 true 반환
E next() 다음 요소 반환
void remove() 마지막으로 반환된 요소 제거

 

# 컬렉션과 제네릭

- 컬렉션은 제네릭(generics) 기법으로 구현되었다.

- 컬렉션의 요소 : 객체

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

→ <E>, <K>, <V> : 타입 매개 변수, 요소 타입을 일반화한 타입

- 제네릭 클래스 사례

- 제네릭 백터 : Vector<E>

- E에 특징 타입으로 구체화

정수만 다루는 벡터 Vector<Integer>

문자열만 다루는 벡터 Vector<String>

 

# 제네릭의 기본 개념

- JDK 1.5에서 도입(2004년 기점)

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

 

# Vector<E>의 특성

º java.util.Vector

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

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

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

º Vector에 객체 삽입

- 벡터의 중간에 객체 삽입 가능

- 공간이 모자라면 자동 늘림, 삽입된 객체 이후의 객체는 뒤로 밀림

º Vector에서 객체 삭제

- 임의의 위치에서 삭제 가능, 삭제 후 뒤의 객체들은 자동 자리 이동

 

# Vector<Integer> 컬렉션 내부 구성

º "정수를 저장하는" Vector로 구체화하여 Vector 객체를 생성하는 예제

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

 

# Vector<E> 클래스의 주요 메소드

메소드 설명
boolean add(E e) 벡터의 맨 뒤에 요소 추가
void add(int index, E element) 지정된 인덱스 위치에 객체 삽입
boolean addAll(Colection<? extends E> c) c가 지정하는 컬렉션의 모든 요소를 벡터의 맨 뒤에 추가
int capacity() 벡터의 현재 용량 반환
void clear() 벡터의 모든 요소 삭제
boolean contains(Object o) 벡터가 지정된 객체를 포함하고 있으면 true 반환
E elementAt(int index) 지정된 인덱스의 요소 반환
E get(int index) 지정된 인덱스의 요소 반환
int indexOf(Object o) 지정된 객체와 같은 첫 번째 요소의 인덱스 반환
없으면 -1 반환
boolean isEmpty() 벡터가 비어있으면 true 반환
E remove(int index) 지정된 인덱스의 요소 삭제
boolean remove(Object o) 지정된 객체와 같은 첫 번째 요소를 벡터에서 삭제
void removeAllElements() 벡터의 모든 요소를 삭제하고 크기를 0으로 만듦
int size() 벡터가 포함하는 요소의 개수 반환
Object[] toArray() 벡터의 모든 요소를 포함하는 배열을 반환

 

# 컬렉션과 자동 박싱/ 언박싱

º JDK 1.5 이전

- 기본 타입 데이터를 Wrapper 클래스를 이용하여 객체로 만들어 사용

Vector<Integer> v = new Vector<Integer>();
v.add(new Integer(4));
v.add(new Character('r'));
v.add(new Double(3.14));

- 컬렉션으로부터 요소를 얻어올 때, Wrapper 클래스로 캐스팅 필요

Integer n = (Integer)v.get(0);
int k = n.intValue();  //k=4

º JDK 1.5부터 자동 박싱/언박싱의 기능 추가

Vector<Integer> v = new Vector<Integer>();
v.add(4);  //4 -> new Integer(4)로 자동 박싱
int k = v.get(0);   //Integer 타입이 int 타입으로 자동 언박싱, k = 4

- 예제 : 정수 값만 다루는 Vector<Integer>

import java.util.Vector;
public class VectorEx {
	public static void main(String[] args) {
    	//정수 값만 다루는 제네릭 벡터 생성
        Vector<Integer> v = new Vector<Integer>();
        
        v.add(5);  //5삽입
        v.add(4);  //4삽입
        v.add(-1);  //-1삽입
        
        //벡터 중간에 삽입하기
        v.add(2,100);  //4와 -1 사이에 정수 100 삽입
        System.out.println("벡터 내의 요소 객체 수 : " + v.size());
        System.out.println("벡터의 현재 용량 : " + v.capacity());
        
        //모든 요소 정수 출력하기
        for(int i=0; i<v.size(); i++) {
        	int n = v.get(i);
            Sysetm.out.println(n);
        }
        
        //벡터 속의 모든 정수 더하기
        int sum = 0;
        for(int i=0; i<v.size(); i++) {
        	int n = v.elementAt(i);
            sum += n;
        }
        System.out.println("벡터에 있는 정수 합 : " + sum);
     }
 }

 

# ArrayList<E>

º ArrayList<E>의 특성

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

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

- ArrayList에 삽입 가능한 것

→ 객체, null

- ArrayList에 객체 삽입/삭제

→ 중간에 객체 삽입 가능

→ 공간이 모자라면 자동 늘림, 삽입된 객체 이후의 객체는 뒤로 밀림

- 벡터와 달리 자동으로 스레드 동기화 지원 않음

→ 다수 스레드가 동시에 ArrayList에 접근할 때 동기화시키지 않음

→ 개발자가 스레드 동기화 코드 작성

 

# ArrayList<String> 컬렉션의 내부 구성

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

 

# ArrayList<E> 클래스의 주요 메소드

메소드 설명
boolean add(E e) ArrayList의 맨 뒤에 요소 추가
void add(int index, E element) 지정된 인덱스에 지정된 객체를 삽입
boolean addAll(Collection<? extends E> c c가 지정하는 컬렉션의 모든 요소를 ArrayList의 맨 뒤에 추가
void clear() ArrayList의 모든 요소 삭제
boolean contains(Object o) ArrayList가 지정된 객체를 포함하고 있으면 true 반환
E elementAt(int index) 지정된 인덱스의 요소 반환
E get(int index) 지정된 인덱스의 요소 반환
int indexOf(Object o) 지정된 객체와 같은 첫 번째 요소의 인덱스 반환
없으면 -1 반환
boolean isEmpty() ArrayList가 비어있으면 true 반환
E remove(int index) 지정된 인덱스의 요소 삭제
boolean remove(Object o) 지정된 객체와 같은 첫 번째 요소를 ArrayList에서 삭제
int size() ArrayList가 포함하는 요소의 개수 반환
Object[] toArray() ArrayList의 모든 요소를 포함하는 배열을 반환

 

# 컬렉셔의 순차 검색을 위한 Iterator

º Iterator<E> 인터페이스

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

→ 리스트 구조의 컬렉션에서 요소의 순차 검색을 위한 메소드 포함

- Iterator<E> 인터페이스 메소드

메소드 설명
boolean hasNext() 다음 반복에서 사용될 요소가 있으면 true 반환
E next() 다음 요소 반환
void remove() 마지막으로 반환된 요소 제거

- iterator() 메소드

→ iterator()를 호출하면 Iterator 객체 반환

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

Vector<Integer> v = new Vector<Integer>();
Iterator<integer> it = v.iterator();
while(it.hasNext()) {   //모든 요소 방문
	int n = it.next();  //다음 요소 리턴
    ...
}

 

# LinkedList<E>

º LinkedList<E>의 특성

- java.util.LinkedList

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

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

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

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

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

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

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

 

# LinkedList<E> 클래스

º Queue 인터페이스, List 인터페이스를 구현한 클래스

- 첫 번째 요소와 마지막 요소는 서로 연결

- 맨 뒤에 추가하는 경우를 제외하고 추가 작업 시에도 성능이 우수

 

# LinkedList<String>의 내부 구성

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

 

# LinkedList<E> 클래스의 주요 매소드

메소드 설명
boolean add(E e) LinkedList의 맨 뒤에 요소 추가
void add(int index, E element) 지정된 인덱스에 지정된 객체를 삽입
boolean addAll(Collection<? extends E> c) c가 지정하는 컬렉션의 모든 요소를 LinkedList의 맨 뒤에
추가
void addFirst(E e) LinkedList의 맨 앞에 요소 추가
void addLast(E e) LinkedList의 맨 뒤에 요소 추가
Boolean contains(Object o) 지정된 요소가 포함되어 있는지 확인
Iterator<E> descendingIterator() 역순으로 Iterator을 사용함
E get(int index) 지정한 곳에 있는 요소를 반환
E getFirst() 리스트의 첫째 요소 반환
E getLast() 리스트의 마지막 요소 반환
E remove() 리스트의 첫째 요소를 반환하고 리스트에서 제거
E remove(int index) 리스트의 특정 위치의 요소를 반환하고 리스트에서 제거

'JAVA > 자바 이론' 카테고리의 다른 글

Java | 8 입출력 스트림  (0) 2021.06.12
Java | Lab7-2 제네릭과 컬렉션  (0) 2021.06.12
Java | 6 패키지  (0) 2021.06.06
Java | 5-2 상속과 다형성  (0) 2021.05.25
Java | 5-1 상속과 다형성  (0) 2021.05.25
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유