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 |