[Java] 컬렉션 프레임워크 - ArrayList
Collection
컬렉션 프레임워크란?
자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다. 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.
컬렉션 프레임워크는 java.util 패키지에 포함되며 크게 List 인터페이스 , Set 인터페이스 , Map 인터페이스로 주요인터페이스를 정의할 수 있다. List와 Set은 최상위 클래스인 Collection을 상속하고 Map은 Collection을 상속하지 않는다.
각각은 여러 종류를 가지는데 예를 들어 List의 종류에는 LinkedList, Vector, ArrayList 등이 있다.
배열이 아닌 컬렉션을 사용하는 이유
우리는 이전에 배열이라는 것을 배웠다. 배열은 같은 자료형의 값들의 모임인데, 배열은 선언할 때 배열크기를 미리 선언했어야 했다. 선언할 때 정해진 배열의 크기를 초과해서는 배열에 값을 넣을 수 없고, 선언 이후에는 배열의 크기를 변경할 수 없으므로 배열은 처음 선언할 때 가능한 큰 크기로 선언을 하다보니 메모리 낭비가 생길 수 있다. 그러다 보니 크기를 알지 못하는 경우 선언하기가 어려운데 컬렉션은 이 단점을 말끔히 해결해 준다.
그리고 같은 자료형만 저장이 가능하다는 것도 배열을 사용함에 있어 불편한 점이 될 수 있을 것인데 이러한 점도 컬렉션에서 보완이 가능하다.
컬렉션의 장점
1. 배열과 달리 저장하는 크기의 제약이 없다. 컬렉션을 처음 선언할 때 크기를 지정해도 되고 안해도 가능하고, 만약 지정한 크기를 초과하더라도 자동으로 크기가 증가된다.
2. 추가, 삭제, 정렬 등의 기능처리가 간단하다.
3. 컬렉션의 값으로는 여러 타입을 저장 가능하다. 이때 기본자료형은 Wrapper클래스로써 객체(자료형 : Object)만 저장이 된다.
List : 순서를 유지하며 저장되고 중복저장 가능
ArrayList
list 인터페이스에는 LinkedList, Vector 등의 클래스가 있지만 여기서는 ArrayList만 다루려고 한다. (이유는 내가 프로젝트에서 사용할 거라서 정리하는 차원으로 글을 적는 거기 때문!ㅎㅎ)
ArrayList는 인덱스로 값을 관리하며 순서가 유지되며 객체만 저장이 된다.
1. ArrayList 선언 및 내용 추가
- 크기지정하지 않고 선언하였고 add 메소드를 이용하여 마지막위치 또는 원하는 인덱스에 값을 추가하였다.
- ArrayList는 객체(Object)만 저장되므로 alist.add(999) 는 AutuBoxing에 의해 int --> Integer로 WrapperClass로 변형되어 alist에 객체로 들어간다.
- 아래 코드를 살펴보면 alist에 들어가는 자료형을 제한을 두지 않았기 때문에 다양한 타입의 값을 추가할 수 있다.
import com.kh.chapr01_list.part02_list.model.vo.Music;
//1. ArrayList선언 - 자료형 제한X / 크기 제한X
ArrayList alist = new ArrayList();
//2. ArrayList에 값 추가
alist.add("파멸");
alist.add(999);
alist.add(new Music("내 손을 잡아","아이유"));
alist.add(1, 1515); //--> 원하는 인덱스에 값 추가 가능
2. ArrayList 원하는 인덱스의 값 추출
- get(index) : ArrayList에서 해당 index의 값 추출
for(int i=0; i < a1.size(); i++) { //size() : 배열의 length와 같이 데이터의 크기 반환
System.out.println("인덱스 "+i+"번째 a1값 : "+a1.get(i));
}
3. ArrayList 기타 메소드
//1. 0번째 인덱스의 값을 전달받은 값으로 변경
alist.set(0, "HOPE");
//2. 입력된 인덱스의 값 삭제
alist.remove(1);
//3. 포함여부
System.out.println( alist.contains("HOPE") ); // ==> true
//4. 해당 값의 인덱스 반환
System.out.println( alist.indexOf(1515) ); // ==> 999
2-1. ArrayList 에서 객체 삭제하기
위에서는 인덱스를 이용해서 삭제를 했는데 Object를 이용해서 값을 삭제할 수도 있다.
그래서 아래와 같이 삭제를 하려고 remove했는데 삭제가 안됐다. 왜 그럴까??
alist.remove(new Music("내 손을 잡아", "아이유")); //-> 삭제안됨 -> hashcode,equals 오버라이딩해줘야 함
현재 equals()와 hashCode()는 모든 클래스의 부모클래스인 최상위클래스 Object의 메소드이다.
Object의 메소드에서는 equals()와 hashCode()모두 주소값이 같아야 true가 되는 즉 동등객체의 여부를 판단해주는 메소드이다.
하지만 우리가 원하는 거는 주소값과 상관없이 값이 같으면 true를 반환해주는 동일객체의 여부를 판단해주는 메소드이다.
따라서 Music클래스에 equals()와 hashCode()를 오버라이딩을 해줘야 삭제가 된다!!
이에 관련된 자세한 사항은 아래 글에서 확인해 볼 수 있다.
[Java] 상속(Inheritance)
1. 상속이란? 부모 클래스(상위클래스)의 변수와 메소드를 자식 클래스(하위클래스)가 물려받아 사용할 수 있게 해준다. 여기서 부모클래스를 superclass, 자식클래스를 subclass라 부른다. 1) 표현 :
hwangpenguin.tistory.com
3. 여러 타입의 값이 담긴 ArrayList에서 원하는 타입만 출력하고 싶을때
for each문을 활용하여 ArrayList의 객체인 alist의 값들(값은 Object타입) 중 String타입만 출력하고자한다.
for each문을 통해 모든 값을 검사하면서 if문을 통해 String으로 변환이 가능한지 확인하고
변환이 된다면 String으로 변환하여 출력한다.
for( Object ob : alist) { //alist의 타입은 Object이다.
if( ob instanceOf String ) {
System.out.println( (String)ob )
//또는 System.out.println( String.valueOf(ob) )
}
}
출처 및 참고:
1. 컬렉션프레임워크란? http://tcpschool.com/java/java_collectionFramework_concept
2. 컬렉션 프레임워크 구분 사진 https://devbox.tistory.com/entry/Java-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC