본문 바로가기
프로그래밍 언어/Java 프로그래밍

컬렉션 프레임워크(1) List 인터페이스- ArrayList

by Hyeon_ 2021. 11. 30.

컬렉션 프레임워크(Collection Framework)

  • 컬렉션(Collection)
    • 사전적 의미로 요소(객체)를 수집해 저장한 것
  • 프레임워크(Framework) = 라이브러리(기능) + 프로그래밍 방식
    • 표준화, 정형화된 체계적인 프로그래밍 방식
    • 미리 정해진 방식대로 프로그램을 작성
    • 누가 작성하든 프로그램이 표준화되기 때문에 프로그램 유지보수하기 쉬워짐

컬렉션 프레임워크(Collection Framework)

  • 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 양식
    • 많은 양의 데이터를 저장, 삭제, 검색, 비교, 정렬 작업 등을 편리하게 쉽게 수행
  • 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리
  • 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용
  • 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화 되어 있기 때문에 사용법 편하고 재사용성이 높은 코드 작성 가능
  • 프로그래머의 프로그래밍 부담을 많이 덜어줌
  • java.util.* 패키지에 포함

자바 컬렉션

  • 객체를 수집해서 저장하는 역할

프레임워크

  • 사용법을 미리 정해 놓은 라이브러리

컬렉션 클래스

  • 다수의 데이터를 저장할 수 있는 클래스
  • ArrayList, LinkedList, Vector, HashSet, TreeSet

컬렉션 프레임워크의 주요 인터페이스

  • 인터페이스: List / Set / Map
  • List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스 Collection이 추가로 정의됨
  • Map은 List / Set과 전혀 다른 형태로 컬렉션을 다루기 때문에 가은 상속 계층에 포함되지 못함

컬렉션 프레임워크 특징

  • List, Set, Map 인터페이스 이름이 클래스 이름에 포함되어 있음
  • 이름만으로도 클래스의 특징을 쉽게 알 수 있음
  • Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임워크가 만들어지기 이전부터 존재했기 때문에 컬렉션 프레임워크 명명법을 따르지 않음
  • Vector나 Hashtable 등 기존 컬렉션 클래스들은 이전에 작성된 프로그램들과 호환을 위해 설계를 변경해서 남겨둠
  • 가능하면 새로 추가된 ArrayList와 HashMap 사용 추천

List 인터페이스의 특징 및 주요 메서드

  • 특징
    • 순서가 있는 집합
    • 인덱스로 관리
    • 중복해서 객체 저장 가능
  • 구현 클래스
    • ArrayList
    • LinkedList
    • Vector
  • 주요 메서드
    • add( ) / get( ) / isEmpty( ) / size( ) / remove( ) / clear( )

ArrayList: List 인터페이스의 구현 클래스

  • 크기가 가변적으로 변하는 선형 리스트
  • 배열과 유사: 순차 리스트, 인덱스 사용
  • 배열과 차이점
    • 배열: 크기 고정
    • ArrayList: 객체 추가 가능. 저장용량 초과 시 자동으로 저장 용량 증가
  • 단점
    • 데이터를 읽어오고 저장하는데는 효율적이나 용량을 변경해야 할 경우엔느 배열을 생성한 후 기존 배열로부터 새로운 배열로 복사해야 하기 때문에 비효율적
    • 따라서 처음에 인스턴스 생성할 때 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성하는 것이 좋음

ArrayList 사용법

  1. 제네릭(Generic)을 사용하지 않을 경우
    • 강제 형변환 이루어짐
List list = new ArrayList();
list.add("abc");
String str = (String)list.get(0);
  1. 제네릭(Generic)을 사용하는 경우
    • 타입 변환 안해도 됨
List<String> list = new ArrayList<String>();
list.add("abc");
String str = list.get(0);
  • 객체 추가: 인덱스 0부터 차례로 저장
  • 객체 제거
    • 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 이동
    • 따라서 빈번한 객체 삭제와 삽입이 일어나는 경우 ArrayList를 사용하지 않는 것이 좋음 => LinkedList 사용
ArrayListEx1.java
package list;

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

public class ArrayListEx1 {
    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("포함 여부 확인");
        System.out.println(list.contains(300));
        System.out.println(list.contains("자바"));

        System.out.println("리스트에서 데이터 삭제");
        System.out.println(list.remove(1));
        System.out.println(list.remove("자바 프로그래밍"));

        System.out.println("리스트 내용 출력");
        for(int i = 0; i<list.size(); i++){
            System.out.println(i + " : "+list.get(i));
        }
    }
}
ArrayListEx2.java - 제네릭 타입 사용
package list;

import java.util.ArrayList;

public class ArrayListEx2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();

        list.add("Java");
        list.add("JDBC");
        list.add("Servlet/JSP");

        System.out.println("전체 내용 출력");
        for(int i = 0; i<list.size(); i++){
            System.out.println(i + " : "+list.get(i));
        }

        // 값만 가져올 때 사용하는 방법
        System.out.println("전체 내용 출력2");
        for(String item : list) {
            System.out.println(item);
        }

        // 세 번째 요소와 요소의 길이 출력
        System.out.println("세 번째 요소  "+list.get(2));
        System.out.println("세 번째 요소의 길이  "+list.get(2).length());
    }
}
[OUTPUT]
전체 내용 출력
0 : Java
1 : JDBC
2 : Servlet/JSP
전체 내용 출력2
Java
JDBC
Servlet/JSP
세 번째 요소  Servlet/JSP
세 번째 요소의 길이  11