Kim VamPa

[Java]ArrayList란?(기본사용방법) 본문

공부/자바

[Java]ArrayList란?(기본사용방법)

Kim VamPa 2020. 5. 6. 11:37
728x90
반응형

개인 공부 후 자료를 남기기 위한 목적이기에 내용 상에 오류가 있을 수 있습니다.


목표

  • ArrayList 기본 동작 방식을 이해합니다.
  • ArrayList API 기본 사용방법을 공부합니다.

 

목차

1. ArrayList란?

2. ArrayList 기본 사용 방법

 

 

 

1. ArrayList란?

List를 만들 때 내부적으로 배열을 사용하는 것

  ArrayList는 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스입니다. 해당 클래스는 List계열의 컬렉션 클래스 이기 때문에 요소의 저장 순서가 유지된다는 것과 같은 요소의 중복 저장을 허용한다는 특징을 가지고 있습니다. 그에 더해 ArrayList만이 가지고 있는 가장 큰 특징은 내부적으로 배열을 사용하기 때문에 Index를 가진다는 점입니다.

 

 Index가 있음으로써 내부의 데이터를 가져오기가 매우 쉽다는 장점이 있습니다. 예를들면 우리는 도서관에 갔습니다. "abcd"라는 책을 찾기 위해서 우리는 도서관에서 일일이 모든 책을 확인해야 할 것입니다. 하지만 책에 코드 번호가 있으면 우리는 해당 비슷한 코드가 모인 책장만 찾으로써 빠르게 자신이 원하는 책을 찾을 수 있습니다. 

 

 내부적으로 배열을 사용한다는 것은 장점이기도 하지만 단점도 있습니다. 요소의 추가 및 삭제 작업에 걸리는 시간이 매우 길어진다는 점입니다. 그 이유는 배열은 크기를 변경할 수 없는 인스턴스 이기때문에 , 크기를 늘리기 위해선 더 큰 새로운 배열을 생성하고 기존의 요소들을 복사해야 하는 복잡한 과정을 거치기 때문입니다. 크기를 줄일 경우도 ArrayList가 가변적이기 때문에 줄어든 만큼의 배열로 크기가 변경되어야 합니다. 따라서 크기를 늘릴 때와 마찬가지로 새로운 배열을 생성해서 기존의 요소들을 옮겨야 합니다. 

 

 

2. ArrayList 기본 사용 방법

 Java언어의 경우 Collection framework라는 자체 라이브러리로 인해 ArrayList DataStructure를 기본적으로 내장하고 있기 때문에 우리가 직접 구현할 필요는 없습니다. 따라서 Java에서 제공하는 ArrayList API 기본적인 사용방법에 대해 알아보겠습니다. 기본적인 사용방법으로서 생성, 추가, 삭제, 가져오기, 크기, 반복을 실습을 통해서 공부해보겠습니다.

 

생성

ArrayList 참조변수명 = new ArrayList();

ArrayList<데이터타입> 참조변수명 = new ArrayList<데이터타입>();

 

 기본적인 사용방법은 "ArrayList 참조변수명 = new ArrayList(); "입니다. ArrayList를 인스턴스화 시키고 ArrayList타입의 참조변수명에 인스턴스 주소를 저장시킨 식입니다. 이 방식을 사용한다면 ArrayList 요소에 모든 데이터 타입을 담을 수 있습니다. (배열은 한 가지 타입만 담을 수 있음)왜냐하면 Object타입의 배열을 해당 라이브러리는 내부적으로 사용하고 있기 때문입니다. 

 

 하지만 Object타입이기 때문에 데이터를 꺼내서 출력을 하기 위해선 출력시키고자 하는 데이터 타입으로 형 변환을 한번 더 거쳐야 하는 불편함이 있습니다. 그런데 만약 명확히 한 타입만 사용해도 될 경우에는 제너릭을 사용해서 ArrayList를 선언합니다. 이럴 경우 제너릭을 통해서 안에 담길 데이터 타입이 지정되어서 이후 ArrayList에서 요소의 데이터를 사용할 때 굳이 형변환의 과정을 안 거쳐도 되기 때문에 해당 방식을 더 많이 사용합니다.

 

그림 1
그림 2

 

 

추가

참조변수명.add(집어 넣을 데이터);

 

 자신이 선언한 "ArrayList 참조변수명.add(집어 넣을 데이터)"를 사용한다면 요소가 추가됩니다.

 

참조변수명.add(인덱스번호, 집어 넣을 데이터);

 

 해당 방식 또한 요소를 추가하는 것인데 위의 방식과 차이점은 집어넣을 데이터를 특정 순서를 지정해서 추가한다는 점입니다. 기존의 방식을 사용할 경우 arraylist 제일 마지막 요소에 데이터가 추가됩니다. 하지만 해당 방식의 메서드를 사용할 경우 지정한 인덱스 요소에 원하는 데이터를 집어넣을 수 있습니다.

 

그림3

 

그림 4

 

삭제

참조변수명.remove(인덱스 번호)

 지정한 인덱스 번호의 요소 데이터를 제거합니다. 

 

그림 5

 

그림 6

 

데이터 가져오기

참조변수명.get(인덱스 번호);

 지정한 인덱스 번호에 있는 데이터를 반환합니다.

 

그림 7

 

그림 8

 

크기

참조변수명.size();

 해당 ArrayList크기를 반환합니다.

 

그림 9

 

그림 10

 

반복

아래의 3가지 방법을 통해서 반복 작업을 실행할 수 있습니다.

(1) iterator 인터페이스를 통한 반복

(2) for과 콜론을 통한 반복

(3) for기본 사용법을 통한 반복 

 

(1) iterator 인터페이스를 통한 반복

 iterator에 대해 간략히 설명하면 자바의 컬렉션 프레임웍은 컬렉션에 저장된 요소를 읽어오는 방법을 Iterator 인터페이스로 표준화하였습니다. List와 Set 인터페이스의 공통적인 부분만 모은 Collection 인터페이스는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의하여 각 요소에 접근 할 수 있습니다. 그렇기 때문에 Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator()메소드를 사용할 수 있습니다.

 

 설명하기 앞서 iteraotr 인터페이스의 기본적인 메소드 3개를 소개하고자 합니다.

메소드 설명
boolean hasNext()  해당 iteration이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 flase를 반환합니다.
E next() iteration의 다음 요소를 반환합니다.
default void remove() 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거합니다.

 iterator 인터페이스를 통한 반복문에서는 "hasNext()"와 "next()"만 있으면 되지만 "remove()"메소드 또한 사용해보도록 하겠습니다.  

 

		Iterator it = array1.iterator();

		while(it.hasNext()) {
			int value = (int)it.next();
			if(value == 30) {
				it.remove();
			}
			System.out.println(value);
		}

  "Iterator it = array1.iterator()"는 ArrayList 인스턴스인 array1을 iterator()메소드를 사용하여 Iteraot을 반환하도록 하여 Iterator 타입의 참조 변수 it에 주소를 저장합니다. while을 통해 반복을 진행하는데 it.hasNext()이 다음요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 flase를 반환하기 때문에 마지막 요소가 없게 되면 while반복문을 벗어나게 됩니다. 

 "int value = (int)it.next()" 에서 it.next()는 iterator의 다음 요소를 반환하는데 System.out.println()을 통해 출력되도록 하기 위해서 int 타입의 변수로 형변환을 시켜주었습니다. 

 "if(value == 30){ it.remove();}"에서 it.remove()메소드는 iterator의 해당 요소의 데이터를 삭제하는 하는 것입니다. 따라서 요소의 값이 30일 때 해당 요소를 삭제하라는 의미입니다.

 

 위의 명령어에서는 iterator 변수를 int로 한번 형 변환시켜주었습니다. 하지만 해당 과정을 없이 선언부에서 제너릭을 사용한다면 iterator()메소드를 사용할 때 iteraotr 타입이 반환되는 것이 아니라 제너릭을 통해 지정한 타입이 반환하게 됩니다. 명령어는 다음과 같습니다.

 

		Iterator<Integer> it = array1.iterator<Integer>();

		while(it.hasNext()) {
			System.out.println(it.hasNext()+"");
		}

 

 

(2) for과 콜론을 통한 반복

		for(int value : array1) {
			System.out.println(value);
		}

 콜론(:)은 왼쪽에 있는 변수에 오른쪽에 있는 것의 각 원소의 값이 대입된다는 것을 뜻합니다. 따라서 while 반복 명령문에서  int value : array1 의 의미는 List인스턴스인 array1 요소 값을 int타입의 value 변수에 반복문에 의해 순차적으로 대입시킨다는 의미입니다.

 

 

(3) for 기본 사용법을 통한 반복

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

 해당 명령문은 일반적인 for반복문을 통한 반복입니다. array1.size()는 ArrayList 인스턴스의 크기를 반환하기 때문에 ArrayList길이만큼만 반복이 진행됩니다. 

 

그림 11

 

그림 12

 

 

Reference

 

Date

  • 2020.05.06 작성

 

 

 

 

728x90
반응형

'공부 > 자바' 카테고리의 다른 글

[Java] Arrays.toString()  (0) 2021.05.15
[Java][1]LinkedList란?  (0) 2020.05.11
[Java]컬렉션 프레임웍(Collection Framework)란?  (0) 2020.05.05
[Java]다형성(polymorphism)이란?  (0) 2020.04.24
[Spring] JDBC란? Connection pool이란?  (0) 2020.04.03
Comments