Java - 리스트 (List, ArrayList)

Java에서 List를 생성하고 사용하는 방법을 소개합니다. ArrayList는 List를 구현한 클래스이며, 이 글에서 예제로 사용됩니다. ArrayList 외에 List를 구현하는 다른 리스트 클래스도 ArrayList와 사용 방법은 거의 동일할 것입니다.

1. ArrayList 생성

ArrayList는 아래와 같이 ArrayList<Type>으로 생성할 수 있습니다. 오른쪽의 Type은 <>처럼 생략해줄 수 있습니다.

ArrayList<String> myList = new ArrayList<>();

ArrayList는 List를 구현하는 클래스이기 때문에, 아래와 같이 상위 클래스인 List<String>로 객체를 생성할 수 있습니다.

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

List를 생성하면 어떤 요소도 갖고 있지 않기 때문에, 아래와 같이 리스트의 모든 내용을 출력해보면 아무것도 갖고 있지 않습니다.

ArrayList<String> myList = new ArrayList<>();
System.out.println("List: " + myList);  // List: []

Arrays.asList()를 이용하여 요소들을 갖고 있는 리스트 객체를 만들고 생성자의 인자에 전달하면, 리스트를 생성할 때 이 요소들을 모두 추가합니다.

ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));
System.out.println("List: " + myList);  // List: [kiwi, apple, melon, banana]

2. ArrayList.add()

ArrayList.add(obj)는 인자로 전달된 객체를 리스트에 추가합니다. println()에 리스트를 인자로 전달하면, 리스트의 모든 요소를 문자열로 출력합니다.

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

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>();
        myList.add("kiwi");
        myList.add("apple");
        myList.add("melon");
        myList.add("banana");

        System.out.println("List: " + myList);
    }
}

Output:

List: [kiwi, apple, melon, banana]

3. ArrayList.get()

ArrayList.get(index)는 리스트에서 Index에 해당하는 요소를 리턴합니다. 일반적으로 add()로 리스트에 추가되는 순서대로 Index가 정해집니다.

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

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>();
        myList.add("kiwi");
        myList.add("apple");
        myList.add("melon");
        myList.add("banana");

        System.out.println("List: " + myList);
        System.out.println("get(0) : " + myList.get(0));
        System.out.println("get(2) : " + myList.get(2));
    }
}

Output:

List: [kiwi, apple, melon, banana]
get(0) : kiwi
get(2) : melon

만약 아래와 같이 리스트가 갖고 있는 요소들의 크기보다 큰 Index를 요청하면 IndexOutOfBoundsException가 발생합니다.

System.out.println("get(10) : " + myList.get(10));

Output

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 10 out of bounds for length 4
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:359)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at Example.main(Example.java:16)

4. ArrayList.remove()

4.1 ArrayList.remove(index) : Index에 해당하는 요소 제거

ArrayList.remove(index)는 인자로 전달된 Index에 해당하는 요소를 제거합니다. 그리고 제거된 요소를 리턴합니다. 주의할 점은, ArrayList는 이 메소드를 제공하지만, 다른 List는 제공하지 않을 수 있습니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));

        String removed = myList.remove(2);
        System.out.println("removed: " + removed);
        System.out.println("list after remove(2): " + myList.toString());
    }
}

Output:

removed: melon
list after remove(2): [kiwi, apple, banana]

4.1 ArrayList.remove(object) : 인자로 전달된 객체와 동일한 요소를 제거

ArrayList.remove(object)는 인자로 전달된 객체와 동일한 요소를 리스트에서 제거합니다. 삭제에 성공했다면 true를 리턴합니다. ArrayList 뿐만 아니라 모든 List에서 이 메소드를 지원할 것입니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));

        boolean removed = myList.remove("apple");
        System.out.println("removed: " + removed);
        System.out.println("list after remove(2): " + myList.toString());
    }
}

Output:

removed: true
list after remove(2): [kiwi, melon, banana]

5. ArrayList.size()

ArrayList.size()는 현재 리스트의 크기를 리턴합니다. 객체가 추가되거나 제거될 때마다 리스트의 size는 달라집니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));
        System.out.println("size: " + myList.size());

        myList.remove("apple");
        System.out.println("size after remove(): " + myList.size());
    }
}

Output:

size: 4
size after remove(): 3

6. ArrayList.contains()

ArrayList.contains(object)는 인자로 전달한 object와 동일한 객체가 리스트에 있을 때 true, 없을 때 false를 리턴합니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));

        System.out.println("contains('kiwi') : " + myList.contains("kiwi"));
        System.out.println("contains('watermelon') : " + myList.contains("watermelon"));
    }
}

Output:

contains('kiwi') : true
contains('watermelon') : false

7. ArrayList.clear()

ArrayList.clear()는 리스트의 모든 요소들을 제거합니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> myList = new ArrayList<>(Arrays.asList("kiwi", "apple", "melon", "banana"));

        System.out.println("List : " + myList);

        myList.clear();
        System.out.println("List : " + myList);
    }
}

Output:

List : [kiwi, apple, melon, banana]
List : []

8. ArrayList.addAll()

ArrayList.addAll(list)는 인자로 전달된 list의 모든 요소를 리스트에 추가합니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> marvel = new ArrayList<>(Arrays.asList("Iron Man", "Hulk", "Captain America"));
        System.out.println("marvel: " + marvel);

        ArrayList<String> movies = new ArrayList<>();
        movies.add("Guardians Of Galaxy");
        System.out.println("movies: " + movies);

        movies.addAll(marvel);
        System.out.println("movies: " + movies.toString());
    }
}

Output:

marvel: [Iron Man, Hulk, Captain America]
movies: [Guardians Of Galaxy]
movies: [Guardians Of Galaxy, Iron Man, Hulk, Captain America]

9. ArrayList.removeAll()

ArrayList.removeAll(list)는 인자로 전달된 list의 모든 요소를 리스트에서 삭제합니다. 겹치지 않는 요소들은 삭제되지 않고 리스트에 남아있게 됩니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> marvel = new ArrayList<>(Arrays.asList("Iron Man", "Hulk", "Captain America"));
        System.out.println("marvel: " + marvel);

        ArrayList<String> movies = new ArrayList<>(Arrays.asList("Guardians Of Galaxy", "Hulk"));
        System.out.println("movies: " + movies);

        movies.removeAll(marvel);
        System.out.println("movies after removeAll(marvel): " + movies.toString());
    }
}

Output:

marvel: [Iron Man, Hulk, Captain America]
movies: [Guardians Of Galaxy, Hulk]
movies after removeAll(marvel): [Guardians Of Galaxy]

10. ArrayList.removeIf()

ArrayList.removeIf(Predicate<? super E> var)는 Predicate가 true로 판단하는 요소들을 삭제합니다. Predicate는 함수형 인터페이스로, 인자 1개를 받고 boolean을 리턴합니다.

아래 예제를 보시면, 리스트에서 3으로 나눈 나머지가 0인 요소들은 모두 삭제합니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
        System.out.println("numbers: " + numbers.toString());

        numbers.removeIf(n -> (n % 3 == 0));
        System.out.println("numbers after removeIf(): " + numbers.toString());
    }
}

Output:

numbers: [1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers after removeIf(): [1, 2, 4, 5, 7, 8]

11. ArrayList.retainAll()

ArrayList.retainAll(list)는 인자로 전달된 list의 요소들과 겹치는 요소들을 리스트에 남기고, 겹치지 않는 요소들은 삭제합니다. 즉, A와 B 리스트의 교집합입니다.

import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>(Arrays.asList("apple", "grape", "banana", "kiwi"));
        ArrayList<String> list2 = new ArrayList<>(Arrays.asList("apple", "kiwi", "melon"));

        list1.retainAll(list2);

        System.out.println("list1: " + list1);
        System.out.println("list2: " + list2);
    }
}

Output:

list1: [apple, kiwi]
list2: [apple, kiwi, melon]

12. ArrayList.forEach()

ArrayList.forEach(Consumer)는 인자로 Consumer를 받으며, 모든 요소를 순회하면서 Consumer로 전달합니다. 처리할 요소들은 Consumer 안에 구현하시면 됩니다.

Consumer는 1개의 인자를 받고 리턴 값이 없는 함수형 인터페이스입니다.

아래와 같이 forEach를 이용하여 모든 요소를 출력하는 코드를 구현할 수 있습니다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Consumer;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>(Arrays.asList("apple", "grape", "banana", "kiwi"));

        Consumer<String> lambda= item -> System.out.println("item : " + item);
        list1.forEach(lambda);

        // list1.forEach(item -> System.out.println("item : " + item));
    }
}

Output:

item : apple
item : grape
item : banana
item : kiwi

13. ArrayList.indexOf(), lastIndexOf()

indexOf(object), lastIndexOf(object)는 인자로 전달된 객체가 ArrayList에 존재할 때, 그 Index를 리턴합니다.

두개 메소드의 차이점은 탐색 순서인데, 중복 요소가 리스트에 있을 때 두 메소드의 리턴 결과는 달라질 수 있습니다. 중복 요소가 없다면 같은 값을 리턴합니다.

  • indexOf() : 리스트의 낮은 Index에서 높은 Index 순서로 탐색하며, 먼저 찾은 요소의 Index를 리턴
  • lastIndexOf() : 리스트의 높은 Index에서 낮은 Index 순서로 탐색하며, 먼저 찾은 요소의 Index를 리턴
import java.util.ArrayList;
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>(Arrays.asList("apple", "grape", "banana", "kiwi", "apple"));

        System.out.println("indexOf(apple) : " + list.indexOf("apple"));
        System.out.println("indexOf(kiwi) : " + list.indexOf("kiwi"));

        System.out.println("lastIndexOf(apple) : " + list.lastIndexOf("apple"));
        System.out.println("lastIndexOf(kiwi) : " + list.lastIndexOf("kiwi"));
    }
}

Output:

indexOf(apple) : 0
indexOf(kiwi) : 3
lastIndexOf(apple) : 4
lastIndexOf(kiwi) : 3
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha