본문 바로가기

Java/본격 Java 컬렉션

[Java] ArrayList

Collection<E> 인터페이스
 - List와 Set의 상위인터페이스로 컬렉션의 기본적인 기능들을 모아놓은 인터페이스
 - 제네릭으로 저장할 데이터의 자료형을 지정할 수 있으며, 생략시 Object로 설정됩니다.
 - 주요 메소드
 리턴 / 메소드명 및 설명
 boolean / add(E e) : 지정한 데이터(객체 : e)를 추가
 boolean / addAll(Collection<? extends E> c) : 지정한 컬렉션을 추가합니다.(제네릭 지정시 E와 관련된 데이터를 가진 컬렉션만 가능)
 void / clear() : 컬렉션의 모든 데이터를 삭제
 boolean / contains(Object o) : 컬렉션에 지정한 객체(o)가 존재하는지 여부
 boolean / containsAll(Collection<?> c) : 지정한 컬렉션(c)이 존재하는지 여부
 boolean / equals(Object o) : 동일한 컬렉션인지 여부
 boolean / isEmpty() : 컬렉션이 비어있는지 여부
 Iterator<E> / iterator() : 컬렉션의 iterator를 리턴
 boolean / remove(Object o) : 지정된 객체(o)를 삭제
 boolean / removeAll(Collection<?> c) : 지정된 컬렉션(c)을 삭제
 boolean / retainAll(Collection<?> c) : 지정된 컬렉션(c)에 포함된 객체들만 남기고, 나머지 객체들은 삭제(삭제가 되었다면 true, 아니면 false를 리턴)
 int / size() : 컬렉션에 저장된 객체의 개수를 리턴
 Object[] / toArray() : 컬렉션을 Object배열로 리턴
 <T> T[] / toArray(T[] a) : 제네릭으로 지정된 <T>형 배열(a)에 컬렉션의 데이터를 담아 리턴

List<E> 인터페이스
 - Collection인터페이스를 상속받은 인터페이스로 Collection인터페이스의 메소드들을 자유롭게 사용할 수 있습니다.
  public interface List<E> extends Collection<E>
 - 순서가 있는(저장순서를 유지) 컬렉션으로 데이터의 중복을 허용합니다.
 - 주요 메소드 : Collection인터페이스에서 상속받은 메소드는 제외
 리턴 / 메소드명 및 설명
 void / add(int index, E element) : 지정된 위치(index)에 객체(element)를 추가
 boolean / addAll(int index, Collection<? extends E> c) : 지정된 위치(index)에 컬렉션(c)에 포함된 객체들을 추가
 E / get(int index) : 지정된 위치(index)의 데이터를 리턴
 int / indexOf(Object o) : 지정한 객체(o) 위치를 찾아 인덱스를 리턴(못 찾으면 -1을 리턴)
 int / lastIndexOf(Object o) : 지정한 객체(o)의 위치를 뒤에서부터 찾아 인덱스를 리턴(못 찾으면 -1을 리턴)
 ListIterator<E>/ listIterator() : : ListInterator를 리턴(List 전용)
 E / remove(int index) : 지정된 위치(index)의 객체를 삭제 후, 삭제된 객체 리턴
 E / set(int index, E element) : 지정된 위치(index)에 객체(element)를 저장 - 기존의 객체는 삭제됨
 List<E> / subList(int fromIndex, int toIndex) : 컬렉션에서 fromIndex부터 toIndex - 1까지 잘라내어 List로 리턴

ArrayList<> 클래스
 - 배열과 가장 비슷한 컬렉션으로 기존의 Vector를 개선한 클래스
 - 가장 많이 사용되는 컬렉션으로 Object형 객체들을 저장하는 컬렉션
 - 생성자
  ArrayList() : 크기가 0인 ArrayList를 생성
  ArrayList(collection<? extends E> c) : 지정된 컬렉션(c)를 기반으로 ArrayList를 생성
  ArrayList(int initialCapacity) : initialCapacity를 초기용량으로 하는 ArrayList를 생성
 - 주요 메소드 : Collection과 List 인터페이스에서 상속받은 메소드는 제외
 리턴 / 메소드 및 설명
 void / ensurecapacity(int minCapacity) : ArrayList의 용량을 최소한 minCapacity만큼 유지하도록 함
 void / removeRange(int fromIndex, int toIndex) : formIndex부터 toIndex - 1까지 삭제
 void / trimToSize() : ArrayList의 빈 공간을 삭제

.

.

ArrayList는 컬렉션과 리스트를 상속하므로 위에 있는 메소드들은 모두 사용가능하다

그러면 간단하게 기본적인 ArrayList를 실습해보자

import java.util.*;

class ArrayListEx1{
	public static void main(String[] args) {
		ArrayList list1 = new ArrayList(10);
		// 10개의 공간을 가진 ArrayList를 생성
		list1.add(new Integer(5));
		list1.add(new Integer(4));
		list1.add(new Integer(2));
		list1.add(new Integer(0));
		list1.add(new Integer(1));
		list1.add(new Integer(3));
		// list1에 데이터(객체)를 추가

		ArrayList list2 = new ArrayList(list1.subList(1, 4));
		// list1.subList(1, 4) : list1을 1 부터 (4 - 1)까지 잘라냄
		// 잘라낸 List를 이용하여 ArrayList인 list2를 생성
		print(list1, list2);
		// list1 : [5, 4, 2, 0, 1, 3]
		// list2 : [4, 2, 0]

		Collections.sort(list1);
		Collections.sort(list2);
		// list1과 list2를 오름차순 정렬 시킴
		print(list1, list2);
		// list1 : [0, 1, 2, 3, 4, 5]
		// list2 : [0, 2, 4]
		

		System.out.println("list1.containsAll(list2) : " + list1.containsAll(list2)); // true
		// list1 안에 list2의 모든 데이터가 들어있는지 여부

		list2.add("B");
		list2.add("C");
		// list2의 가장 뒤에 문자열 "B"와 "C"를 추가
		list2.add(3, "A");
		// list2의 3번 인덱스 자리에 "A"를 삼입(원래의 데이터는 뒤로 밀림)
		print(list1, list2);
		// list1 : [0, 1, 2, 3, 4, 5]
		// list2 : [0, 2, 4, A, B, C]

		list2.set(3, "AA");
		// list2의 3번 인덱스 자리의 데이터를 "AA"로 변경
		print(list1, list2);
		// list1 : [0, 1, 2, 3, 4, 5]
		// list2 : [0, 2, 4, AA, B, C]

		System.out.println("list1.retainAll(list2) : " + list1.retainAll(list2)); // true
		// list1에서 list2의 데이터와 같은 데이터들만 남기고 삭제
		print(list1, list2);
		// list1 : [0, 2, 4]
		// list2 : [0, 2, 4, AA, B, C]

		for (int i = list2.size() - 1; i >= 0 ; i-- ){
			// i에 list2의 마지막 인덱스번호부터 0번까지 돌면서 삭제를 실행
			// 삭제는 거꾸로 돌면서 작업해야 효열적임
			if (list1.contains(list2.get(i))){
				// list2에서 i인덱스에 해당하는 데이터가 list1에 있으면
				list2.remove(i);
				// list2의 i인덱스 데이터를 삭제
			}
		} // removeAll()메소드를 구현한 for문
		print(list1, list2);
		// list1 : [0, 2, 4]
		// list2 : [AA, B, C]

	}

	public static void print(ArrayList list1, ArrayList list2){
		System.out.println("list1 : " + list1);
		System.out.println("list2 : " + list2);
		System.out.println();
	}
}

.

.

import java.util.*;

class ArrayListEx2{
	public static void main(String[] args) {
		final int LIMIT = 10;
		String src = "0123456789abcdefghijABCDEFGHIJ!@#$%^&*()ZZZ";
		int len = src.length();

		// src의 문자열들을 LIMIT를 개수로 잘라내어 list에 저장한 후 출력
		List list1 = new ArrayList(len / LIMIT + 5);
		List list2 = new ArrayList(len / LIMIT + 5);

		for (int i = 0; i < len; i += LIMIT ){
			if (i + LIMIT < len){
				list1.add(src.substring(i, i + LIMIT));
			} else{
				list1.add(src.substring(i));
			}	
		}

		for (int i = 0 ; i < list1.size() ; i++){
		System.out.println(list1.get(i));
		}

		// list1을 코딩하기위해 Brainstorming
		list2.add(src.substring(0, 10));
		list2.add(src.substring(10, 20));
		list2.add(src.substring(20, 30));
		list2.add(src.substring(30, 40));
		list2.add(src.substring(40, len));
		System.out.println(list2);
	}
}
728x90
반응형

'Java > 본격 Java 컬렉션' 카테고리의 다른 글

[Java] Stack - Queue  (0) 2020.07.03
[Java] LinkedList  (0) 2020.07.03
[Java] 컬렉션 프레임워크(Collection Framework)  (0) 2020.07.03
[Java] 제네릭(Generic) 심화  (0) 2020.07.03
[Java] 제네릭 메소드  (0) 2020.07.03