본문 바로가기

코딩/JAVA 공부

[JAVA] 가변 리스트, 불변 리스트 / 리스트에서 반복문 사용하기

리스트를 두 가지로 나누자면 가변리스트와 불변리스트로 나눌 수 있다.

가변리스트는 리스트 안에 아이템을 추가, 수정, 제거가 가능한 리스트이다.

불변리스트는 반대로 리스트 안에 아이템 추가, 수정, 제거가 불가하다.

 

Java8 까진 불변 리스트를 만들기 위해선 가변 리스트를 먼저 만들고 Collections 클래스의 unmodifiableList() 메서드를 사용해 변환이 필요했다.

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

animals.add("Dog");
animals.add("Cat");
animals.add("Bat");
animals = Collections.unmodifiableList(snimals);

// animals --> 불변 리스트

Java8에서부터 두 가지 방법으로 불변리스트를 생성할 수 있게 되었다.

1. Arrays 클래스의 정적 메서드 asList() 사용

List<String> animals = Arrays.asList("Dog", "Cat", "Bat");

2. Stream 활용하기

List<String> animals = Stream
    .of("Dog", "Cat", "Bat")
    .collect(collectingAndThen(toList(). Collections::unmodifiableList));

Java9에서는 List 클래스에서 불변 리스트를 생성할 수 있는 메서드가 추가되었다

List<String> animal = List.of("Dog", "Cat", "Bat");

 

위에서 설명한 불변 리스트들은 아이템의 변경이 불가해 반복문 사용 시 안정적(?)이다.

 

 

리스트에서 반복문을 사용할 때 총 세 가징 방법이 있다.

1. for문 사용

List<String> animals = List.of("Dog", "Cat", "Bat");

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

2. for each 문 사용

List<String> animals = List.of("Dog", "Cat", "Bat");

for(String animal : animals) {
    System.out.println(animal);
}

3. Iterator 사용

List<String> animals = List.of("Dog", "Cat", "Bat");
Iterator<String> iterator = animals.iterator();

while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

 

만약 리스트 아이템 중 "at"로 끝나는 단어는 삭제하는 알고리즘을 진행한다고 하자.

먼저 리스트의 아이템을 변경해야 하므로 불변 리스트는 사용 불가하다.

또 for문을 사용한다면 반복문이 도는 도중에 리스트가 변하게 되므로 원하는 결과값을 얻을 수 없게 된다.

따라서 Iterator를 사용해야 한다!

List<String> animals = List.of("Dog", "Cat", "Bat");
List<String> animalsAl = new ArrayList(animals);
Iterator<String> iterator = animalsAl.iterator();

while(iterator.hasNext()) {
    iterator.remove();
}