본문 바로가기

Algorithm/자료구조

List 인터페이스 - ArrayList

List 인터페이스

특징

  • 순서가 있는 집합
  • 인덱스로 관리
  • 중복하여 객체 저장 가능

구현 클래스

  • ArrayList
  • LinkedList
  • Vector

주요 메서드

  • add() / get() / isEmpty() / size() / remove() / clear()

 

ArrayList

  • List 인터페이스의 구현 클래스
  • 크기가 가변적으로 변하는 선형리스트
  • 배열과 유사 (순차리스트, 인덱스 사용)

ArrayList와 배열의 차이점

  • 배열은 크기가 고정되어 있음
  • ArrayList는 객체 추가 가능 존재 -> 크기가 가변적으로 변함 (저장 용량 초과 시 자동으로 저장 용량 증가)

ArrayList의 단점

  • 데이터를 읽어오고 저장하는데 효율적
  • 용량을 변경해야 할 때는 새로운 배열을 생성 후 기존 배열로부터 새로운 배열로 복사 -> 상당히 비효율적
  • 처음에 인스턴스 생성할 때 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋음

ArrayList 사용법

(1) 제네릭을 사용하지 않을 경우

List list = new ArrayList();
list.add(“abc”);
String str = (String)list.get(0);

-> 강제 타입 변환 필요

 

(2) 제네릭을 사용하는 경우

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

-> 강제 타입 변환 안 해도 됨

 

ArrayList의 객체 추가/제거

객체 추가

 : 인덱스 0부터 차례로 저장

 

객체 제거

 : 제거하고자 하는 바로 뒤 인덱스부터 마지막 인덱스까지의 값을 모두 앞으로 1씩 이동

 : 빈번한 객체 삭제와 삽입이 일어나는 경우 ArrayList를 사용하는 것이 바람직하지 않음 -> LinkedList 사용 권장

 

활용 예제 - 1

package list;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

// 제네릭 타입이 아닌 경우
public class ArrayListEx01 {
	public static void main(String[] args) {
		List list = new ArrayList(5);
		
		list.add(100);
		list.add(2.55);
		list.add(300);
		list.add(9.9);
		list.add("자바 프로그래밍");
		list.add(1, "데이터베이스"); // 위치 지정하여 값 추가
		
		System.out.println("리스트 내용 출력");
		for(int i=0; i<list.size(); i++) {
			System.out.println(i + ":" + list.get(i));
		}
		
        // 포함 여부 확인
		System.out.println("\n포함 여부 확인");
		System.out.println(list.contains(300)); //true
		System.out.println(list.contains("자바")); //false
		
        // 특정 위치의 요소 삭제
		System.out.println("\n리스트에서 데이터 삭제");
		System.out.println(list.remove(1));
		System.out.println(list.remove("자바 프로그래밍"));
		
		System.out.println("\n리스트 내용 출력");
		for(int i=0; i<list.size(); i++) {
			System.out.println(i + ":" + list.get(i));
		}
	}
}

활용 예제 - 2

package list;

import java.util.ArrayList;
import java.util.List;

public class ArrayListEx02 {
	public static void main(String[] args) {
		// 제네릭 String 타입
		List<String> list = new ArrayList<String>();
		
		list.add("Java");
		list.add("JDBC");
		list.add("Servelt/JSP");
		list.add("대한민국 만세");
		
		System.out.println("\n전체 내용 출력");
		for (int i=0; i<list.size(); i++) {
			System.out.println(i + " : " + list.get(i));
		}
		
		System.out.println("\n전체 내용 출력2");
		for (String item : list) {
			System.out.println(item);
		}
		
		// 세 번째 요소와 요소의 길이 출력
		System.out.println("\n세 번째 요소 : " + list.get(2));
		System.out.println("\n세 번째 요소 길이 : " + list.get(2).length()); // 글자 수
		
		// 네 번째 요소와 요소의 길이 출력
		System.out.println("\n네 번째 요소 : " + list.get(3));
		System.out.println("\n네 번째 요소 길이 : " + list.get(3).length()); // 글자 수
		
		// 특정 위치에 삽입
		list.add(2, "Database");
		
		// 총 객체 수 출력
		System.out.println("\n총 객체 수 : " + list.size());
		
		// 전체 내용 출럭3
		System.out.println("\n전체 내용 출력3");
		for (String item : list) {
			System.out.println(item);
		}
		
		// 특정 요소 제거
		list.remove("JDBC");
		
		// 특정 요소 포함 여부
		System.out.println("\nJava 포함 여부 : " + list.contains("Java"));
	}
}

활용 예제 - 3

package list;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ArrayListEx03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<String> lst = new ArrayList<String>(4);
		
		for (int i=0; i<4; i++) {
			String str = sc.nextLine();
			lst.add(str);
		}
		
		String maxVal = null;
		int maxLen = lst.get(0).length();
		for (int i=0; i<lst.size(); i++) {
			if(lst.get(i).length() > maxLen) {
				maxLen = lst.get(i).length();
				maxVal = lst.get(i);
			}
		}
		
		System.out.println("단어 리스트 : " + lst);
		System.out.println("가장 긴 단어 : " + maxLen);
		System.out.println("가장 긴 단어의 길이 : " + maxVal);
	}
}

활용 예제 - 4

package list;

import java.util.ArrayList;

public class ArrayListEmployeeMain {

	public static void main(String[] args) {
		ArrayList<Employee> lst = new ArrayList<Employee>(5);
		
		Employee e1 = new Employee(100, "김사원", 3000.55);
		Employee e2 = new Employee(101, "박대리", 4000.55);
		Employee e3 = new Employee(102, "최과장", 5000.55);
		
		lst.add(e1);
		lst.add(e2);
		lst.add(e3);
		
		System.out.println(lst.size()); // 3
		
		// 출력하는 다양한 방법
		System.out.println(lst);
		
		System.out.println();
		
		for (int i=0; i<lst.size(); i++) {
			Employee emp = lst.get(i);
			System.out.println(emp);
		}
		
		System.out.println();
		
		for (int i=0; i<lst.size(); i++) {
			System.out.println(lst.get(i));
		}
	}

}