Collection 클래스와 Vector, ArrayList 클래스
1. Collection 클래스(컬렉션 프레임워크)
각각의 데이터들을 효율적으로 저장하고 운용하기 위해 사용되는 Collection 클래스(컬렉션 클래스, 컬렉션 프레임워크)는 자료구조를 구현하고 있는 클래스로 java.util 패키지를 통해 제공 받는다.
대표적으로...
- 배열
- 다수개의 요소를 저장할 수 있고, 인덱스(번호, 첨자)에 의해 손쉬운 접근 방식을 제공한다.
- 크기가 고정되어 있어 데이터의 중간 삽입과 중간 삭제에 비효율적이다.
- 리스트(List)
- 배열에서 불편했던 데이터의 중간 삽입과 중간 삭제가 최적화된 구조다.
- 참조값으로 저장하고 검색하기 때문에 검색 속도가 다소 느리다.
- Set
- Set 타입의 저장방법을 구현한 클래스로 HashSet, TreeSet 이 존재한다.
- 데이터 저장 시 중복을 허용하지 않는다.
- Map
- 데이터들을 저장할 때 key와 value로 짝지어서 저장하는 특징이 있다.
- value가 저장될 실제 데이터, key값이 검색을 위한 키워드 등으로 사용된다.
- 가장 많이 사용되는 HashTable, HashMap등이 있다.
- Vector
- ArrayList
클래스가 존재하며 이중에서 동일한 기능을 제공하는 Vector와 ArrayList를 알아볼 것이다.
2. Vector과 ArrayList
두 개의 클래스는 동일한 기능을 제공한다. 배열과 같이 인덱스를 기반으로 데이터에 접근하며, set과 달리 데이터의 중복을 허용한다. 또한 입력된 데이터의 순서를 유지한다.
import java.util.ArrayList;
import java.util.Vector;
java.util 패키지를 통해 제공 받기에 사용 시 위와 같이 최상단에 import를 해야한다.
대표적인 동적 배열 구조로 가장 많이 사용되는 ArrayList 가 있다.
여기서 동적이란? 프로그램 중간에도 구성이 바뀌거나 새로 생기는 것을 뜻하며 반대로 프로그램 시작 이전에 모든 것이 결정되고 사용되는 뜻의 정적이란 단어와 함께 알아두면 좋을 것이다.
Vector v = new Vector();
ArrayList a = new ArrayList();
Vector와 ArrayList는 쓰레드 동기화의 지연여부, 크기의 제약없이 데이터를 저장한다. 쉽게 말해 동적으로 크기를 확장할 수 있어 선언 시 크기를 지정해야 하는 배열과 차이점이 있다.
3. 값 저장 .add()
Vector v = new Vector();
ArrayList a = new ArrayList();
v.add(10);
v.add(20);
v.add(30);
a.add(10);
a.add(20);
a.add(30);
Vector와 ArrayList에 값을 저장하는 첫번째 방법으로 .add(); 메소드가 있다. 이때 add 메소드의 매개변수는 Object 타입으로, 이 둘은 모두 10, 20, 30이 저장된 Integer 객체의 참조값이 저장된다.
또한 아래와 같이 인덱스를 지정해주면, 기존값들을 뒤로 밀고 중간에 값을 삽입한다는 특징이 있다.
a.add(2, 300); // add는 기존값들을 뒤로 밀고 중간에 삽입
System.out.println("\nArray add");
for(int i=0; i<a.size(); i++)
System.out.printf("a[%d] = %d\t", i, a.get(i));
값을 출력하는 get에 관련해서는 밑에서 다룬다.
기존에 삽입되어 있던 a[2] = 30; 자리에 30 대신 새로 지정한 300의 값이 들어왔고, 그에 따라 기존값은 a[3]으로 밀려났다.
4. 기존 값을 지우고 대입하는 .set()
값을 저장하는 두번째 방법으로 .set(); 메소드가 있다. set()은 기존값을 지우고 대입한다.
v.set(2, 100); // set은 기존값을 지우고 대입
System.out.println("\nVector set");
for(int i = 0; i<v.size(); i++) {
System.out.printf("v[%d] = %d\t", i, v.get(i));
}
기존에 삽입되어있던 v[2] = 30; 자리에 있는 값은 사라지고, 새로 지정한 100값이 들어온 모습을 확인할 수 있다.
5. 값 호출 .get() 과 강제캐스팅
Vector v = new Vector();
v.add(10);
v.add(20);
v.add(30);
int b = (Integer)v.get(0);
값을 호출하기 위해서는 .get() 메소드를 사용한다. 이때 add를 통해 저장된 값은 Object 형태이기 때문에 특정 자료형의 형태로 출력하기 위해서는 캐스팅 연산이 필요하다.
for문을 이용해 Vector v 객체의 값을 출력해보면...
for(int i = 0; i < v.size(); i++) {
b = (Integer)v.get(i);
System.out.printf("v[%d] = %d\n", i, b);
}
.add() 를 수행한 만큼 자료형의 크기가 동적으로 늘어난 상태이기 때문에 전체 값을 출력하기 위해 for문의 조건으로 v.size()를 사용해도 무리 없다.
ArrayList a = new ArrayList();
a.add(10);
a.add(20);
a.add(30);
for(int i = 0; i < a.size(); i++) {
//b = (Integer)a.get(i);
System.out.printf("a[%d] = %d\t", i, a.get(i));
// v.get(i) 또는 a.get(i)를 %d에 적용할 때는 강제캐스팅이 필요없음
}
만약 printf 문을 통해 %d로 integer형을 출력하게끔 하면 강제 캐스팅 없이 a.get(i) 을 사용해도 된다.
6. 값의 위치를 반환하는 indexOf()
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
리스트 자료형에 삽입된 데이터 값의 위치(인덱스값)을 반환받기 위해서는 list.indexOf(값); 메소드를 사용한다.
int idx = list.indexOf(20); // 숫자(인덱스)로 반환하기에 int 변수로 받아도 됨
System.out.println("ArrayList 내부의 20의 위치 : " + idx);
System.out.println("ArrayList 내부의 10의 위치 : " + list.indexOf(10));
System.out.println("ArrayList 내부의 20의 위치 : " + list.indexOf(20));
System.out.println("ArrayList 내부의 30의 위치 : " + list.indexOf(30));
System.out.println("ArrayList 내부의 50의 위치 : " + list.indexOf(50));
반환값은 인덱스값 즉, int형인 숫자이므로 int 형의 변수로 받을 수 있다.
또한 위치하지 않는다면 -1 을 반환한다.
7. 값의 저장 유무를 반환하는 contains()
값의 저장 유무를 boolean값으로 반환받기 위해서는 .contains() 메소드를 사용한다.
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
System.out.printf("20의 저장 유무 : %b\n", list.contains(20));
System.out.printf("50의 저장 유무 : %b\n", list.contains(50));
값이 존재할 경우 true, 존재하지 않을 경우 false 를 출력한다.
'Backend > Java' 카테고리의 다른 글
[JAVA] HashSet, HashMap, Hashtable 그리고 Iterator (0) | 2024.10.18 |
---|---|
[JAVA] 제네릭(Generic) (0) | 2024.10.17 |
[JAVA] Object 클래스 속 toString()과 equals() 오버라이딩 (0) | 2024.10.16 |
[JAVA] 상속 객체 형변환(TypeCasting)과 사용 (0) | 2024.10.16 |
[JAVA] 상속(extends)과 super, 오버라이딩(overriding) (0) | 2024.10.15 |