관리 메뉴

나만을 위한 블로그

[JAVA] ArrayList 사용법 정리 본문

JAVA

[JAVA] ArrayList 사용법 정리

참깨빵위에참깨빵 2020. 10. 24. 20:47
728x90
반응형

안드로이드 앱을 만들다 보면 자주 사용하게 되는 것 중 하나가 ArrayList라는 것이다.

이번 포스팅에선 ArrayList라는 것의 간단한 사용법을 적어보려고 한다.

먼저 ArrayList란 무엇일까? 이 단어 자체는 Array와 List로 나눌 수 있다.

 

Array = 집합체(모음, 무리), (메모리) 배열, 배열하다

List = 목록, 명단, 일람표, (특정 순서로) 열거하다

 

어떤 것에 담긴 것들의 명단, 어떤 것을 열거해놓은 것, 배열의 목록 등등 여러 뜻이라고 유추해볼 수 있다.

다음은 구글에선 뭐라고 나오는지 확인하자. 아래는 구글에 ArrayList를 검색한 결과를 요약한 것들이다.

 

  • ArrayList는 동적 크기의 요소 모음을 저장하는 데 사용된다. 크기가 고정된 배열과 달리, ArrayList는 새 요소가 추가될 때 자동으로 크기를 늘린다. 자바의 컬렉션 프레임워크의 일부고 List 인터페이스의 구현체다.
  • ArrayList는 내부적으로 배열을 사용해 요소를 저장한다. 배열과 마찬가지로 인덱스로 요소를 검색할 수 있다.
  • ArrayList는 크기를 조정할 수 있는 배열이다.

 

대부분 위와 같은 내용들이 공통적으로 나타난다.

즉, ArrayList는 크기를 조정할 수 있는 배열이라는 의미로 자바에서 사용되고 있다는 걸 알 수 있다.

배열과 ArrayList의 차이는 배열은 크기가 고정되어 있지만 ArrayList는 크기를 내가 원하는 대로 늘리고 줄일 수 있단 것이다.

그럼 이 ArrayList의 사용법은 어떤 것이 있을까?

 

먼저 ArrayList를 선언해야 한다. 선언은 아래와 같이 하면 된다.

 

import java.util.ArrayList;

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

이 한 줄만으로 ArrayList를 만들 수 있다. 물론 아직 안에 값을 넣지 않아서 지금은 안에 값이 없는 상태다.

그런데 만약 아래와 같은 경우가 있다면 ArrayList를 어떻게 선언해야 할까?

 

- String만 있는 ArrayList를 사용하고 싶은 거라서, String 값만 들어올 수 있는 ArrayList를 만들고 싶다.

 

위처럼 선언한 ArrayList에는 String, int, byte 등 다양한 자료형이 다 들어갈 수 있다.

이 때 ArrayList에 String만 들어오게 하려면 어떻게 하면 될까?

간단하다. 좌항의 ArrayList 옆에 하나만 추가해주면 된다. 우항에도 추가해도 되지만 굳이 그럴 필요는 없다. 넣어도 회색으로 변하면서 없어도 된다고 표시되니 직접 해보자.

 

import java.util.ArrayList;

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

<String>이 추가된 게 보인다. 이게 뭐하는 놈일까?

그 전에 이 ArrayList에 값을 추가해보자. ArrayList에 값을 추가하려면 add()를 쓰면 된다.

 

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add(1);
        list.add(5.0f);
    }
}

티스토리 문자열과 정수, 소수를 각각 add()로 추가했다. 그런데 1과 5.0f가 있는 add() 아래에 빨간 줄이 생겼다.

무슨 에러가 발생했는지 확인하니 이클립스에선 아래와 같은 문구가 나온다.

 

- The method add(int, String) in the type ArrayList<String> is not applicable for the arguments (int)

 

이 문구를 번역해 보면 "ArrayList<String> 유형의 add (int, String) 메소드는 인수 (int)에 적용할 수 없습니다." 라는 의미로 번역된다.

인텔리제이에선 아래와 같은 간단한 내용이 출력된다.

ArrayList에서 요구하는 값의 자료형은 String인데 들어온 건 int라는 뜻이다. 즉 String으로 바꿔서 넣으라고 말하는 것이다.

왜 이런 결과가 나오냐면, ArrayList 뒤에 추가한 <String>은 제네릭이라고 하는 것이다.

 

제네릭은 JDK 1.5 이후부터 도입된 개념으로, 지네릭(스), 제네릭(스)라고도 불리며 컴파일 시 타입 안전성을 제공하는 것이다.

제네릭은 영어로 generic이라고 쓰기 때문에, generic이 가진 '일반적인'이란 뜻대로 어딘가에 들어가는 값의 타입을 하나로 일반화하는 기능을 한다.

즉, <String>이 붙은 ArrayList에는 String 값만 들어갈 수 있도록 해서 다른 자료형의 값들이 들어오지 못하게 하고, 만약 개발자가 별도로 선언했다면 위처럼 에러 문구나 빨간 줄을 만들어서 타입에 안 맞는 값이 들어왔다고 알려준다.

제네릭 안에는 String, 클래스명, 기본형의 래퍼 클래스(Integer, Double, Boolean, Float 등)가 들어갈 수 있으며, int나 boolean은 사용할 수 없다.

안드로이드 앱 개발을 공부하다보면 리사이클러뷰나 서버와 네트워크 통신하는 기능 구현 시 아주 지겹게 나온다.

 

본론으로 돌아와서, ArrayList안에 값을 마저 넣어보겠다. 5개만 넣어보자.

 

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
    }
}

이렇게 add()를 사용하려면 인자로 넣고자 하는 값을 넣어주면 된다. 단, ArrayList에 제네릭으로 타입을 지정해줬다면 그것에 맞는 값만 넣도록 주의해야 한다.

 

그런데 이렇게 일일이 하나의 값만 넣어줘야 하는 걸까? 일일이 하기 귀찮은데 리스트 하나를 통으로 add할 수는 없는 걸까?

당연히 가능하다. 바로 addAll()이라는 메서드를 쓰면 된다.

 

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        
        list2.add("비주얼 스튜디오 코드");
        list2.add("인텔리제이");
        list2.add("이클립스");
        
        list.addAll(list2);
        System.out.println(list);
    }
}

 

list라는 ArrayList의 마지막에 list2 안에 있는 값들을 add()한 순서대로 list 안에 넣는다.

list에 addAll()한 결과는 아래와 같다.

 

 

앞에서 값을 넣어봤으니 이제 이것을 출력해서 안에 값이 제대로 들어있는지 확인해보자.

출력은 어떻게 하면 될까? 그냥 println() 치면 되지 않을까? 한번 해보자.

 

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        System.out.println(list);
    }
}

이렇게 한 후 실행시켜 보면 아래와 같이 ArrayList 안의 값들이 출력된다.

그런데 이건 ArrayList의 "모든" 값들을 "한번에" 출력하는 방법이다.

내가 원하는 건 ArrayList 안의 안드로이드라는 문자열이라고 할 때, 이 하나의 값만 꺼내려면 어떻게 해야 할까?

 

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        System.out.println(list.get(2));
    }
}

 

get()이란 메서드를 써서 해당 값이 있는 위치를 정수값 인자로 넘기면 된다.

이렇게 하고 실행하면 안드로이드만 콘솔에 나오는 것을 볼 수 있다.

 

이것 말고도 반복문을 통해서도 값을 출력할 수 있다. 아래는 for와 while문을 통해서 사용하는 방법들을 포함한 ArrayList 내부 값 출력 방법이다.

 

import java.util.ArrayList;
import java.util.Iterator;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        for (int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
        System.out.println("================================");

        // for-each
        System.out.println("for-each\n");
        for (String content : list)
        {
            System.out.println(content);
        }
        System.out.println("================================");

        // while
        System.out.println("while\n");
        Iterator iterator = list.iterator();
        while (iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
    }
}

 

위 코드들은 모두 같은 결과를 출력한다. for-each를 사용할 때는 안의 값이 문자열이기 때문에 소괄호 안의 좌항에 String 변수를 선언해줘야 한다. while은 아래에 노란 줄이 생기며 for문으로 바꿀 수 있다는 안내 문구가 나오는데, 이것을 클릭하면 while문이 for-each문으로 바뀐다.

 

다음은 ArrayList 안에 든 값 중 내가 원하는 값이 있는지 검색하는 방법이다.

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        System.out.println(list.contains("안드로이드"));
        System.out.println(list.contains(1));
    }
}

첫번째 println()은 true를 리턴하고, 2번째 println은 false를 리턴한다.

이런 결과가 나오는 이유는, ArrayList.contains()는 개발자가 입력한 값이 ArrayList 안에 존재한다면 true를 리턴하고 없다면 false를 리턴한다.

그래서 "안드로이드"를 넣으면 ArrayList 안에 안드로이드란 문자열이 있으니 true를 리턴하는 것이고, 숫자 1은 ArrayList 안에 없으니 false를 리턴하는 것이다.

이것과 if문을 합쳐서 쓴다면 어떤 값이 있을 때 어떠한 처리를 하고, 없다면 그에 맞는 별도의 처리를 하도록 로직을 짤 수도 있다.

 

다음은 ArrayList의 크기를 구하는 방법이다. 값을 넣고 빼고 할 뿐 아니라 ArrayList의 값이 몇 개인지 알아야 하는 경우도 있다. 이럴 땐 아래와 같이 하면 된다.

 

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        System.out.println("list의 크기 = " + list.size());
    }
}

 

이 코드의 실행 결과는 아래와 같다.

 

이제 삭제도 해보자. 안드로이드라는 값을 ArrayList에서 삭제하고, 나머지 값들도 전부 없애려면 아래처럼 하면 된다.

 

import java.util.ArrayList;

public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> list = new ArrayList<>();
        list.add("티스토리");
        list.add("자바");
        list.add("안드로이드");
        list.add("PHP");
        list.add("코틀린");
        System.out.println(list);
        list.remove(2);     // 2번 위치(인덱스)에 있는 값을 ArrayList에서 삭제한다
        System.out.println();
        System.out.println(list);
        list.clear();             // ArrayList에 있는 모든 값을 삭제한다
        System.out.println();
        System.out.println(list);
    }
}

실행하면 아래와 같은 결과가 나온다.

 

 

안드로이드가 지워진 ArrayList의 내용물이 2번째로 나오고, 값이 사라진 ArrayList의 내용물을 출력한 것이 3번째 줄에 나오는 걸 볼 수 있다.

반응형
Comments