Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 Collections.replaceAll()과 List.replaceAll() 메서드 완벽 가이드

개요

자바에서 리스트(List) 내부의 값을 일괄적으로 변경해야 할 때 replaceAll() 메서드를 활용할 수 있습니다. 자바에는 두 가지 형태의 replaceAll() 메서드가 존재하며, 하나는 Collections 클래스에, 다른 하나는 List 인터페이스에 정의되어 있습니다. 이름은 같지만 동작 방식과 용도가 서로 다르므로, 두 메서드의 차이를 정확히 이해하는 것이 중요합니다.

1. Collections.replaceAll() 메서드

Collections.replaceAll()은 List 객체와 함께 이전 값(oldValue)과 새 값(newValue)을 나타내는 두 개의 매개변수를 받습니다. 이 메서드는 리스트 전체를 순회하면서 이전 값과 정확히 일치하는 모든 요소를 새 값으로 대체합니다.

메서드 시그니처

public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)

예제

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

public class ReplaceAllExample {
    public static void main(String args[]) {
        List<String> list = new ArrayList<String>();
        list.add("Java");
        list.add("Java Script");
        list.add("HBase");
        list.add("CoffeeScript");
        list.add("TypeScript");
        System.out.println("리스트 내용: " + list);

        Collections.replaceAll(list, "Java", "JAVA");
        System.out.print("치환 후 리스트 내용: \n" + list);
    }
}

실행 결과

리스트 내용: [Java, Java Script, HBase, CoffeeScript, TypeScript]
치환 후 리스트 내용:
[JAVA, Java Script, HBase, CoffeeScript, TypeScript]

위 예제에서 볼 수 있듯이, "Java"와 정확히 일치하는 요소만 "JAVA"로 변경되며, "Java Script"처럼 부분적으로 포함된 문자열은 그대로 유지됩니다. 즉, 이 메서드는 부분 문자열이 아닌 완전 일치(equals) 기준으로 동작합니다.

2. List.replaceAll() 메서드

List.replaceAll()은 특정 연산을 나타내는 UnaryOperator 객체를 매개변수로 받습니다. 이 메서드는 현재 리스트의 모든 요소에 지정된 연산을 적용한 뒤, 기존 값을 그 결과값으로 대체합니다. 자바 8부터 도입된 기능으로, 람다 표현식과 함께 사용하면 코드를 더욱 간결하게 작성할 수 있습니다.

메서드 시그니처

default void replaceAll(UnaryOperator<E> operator)

예제

import java.util.ArrayList;
import java.util.function.UnaryOperator;

class Op implements UnaryOperator<String> {
    public String apply(String str) {
        return str.toUpperCase();
    }
}

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("JavaScript");
        list.add("CoffeeScript");
        list.add("HBase");
        list.add("OpenNLP");
        System.out.println("리스트 내용: " + list);

        list.replaceAll(new Op());
        System.out.println("치환 후 리스트 내용: \n" + list);
    }
}

실행 결과

리스트 내용: [Java, JavaScript, CoffeeScript, HBase, OpenNLP]
치환 후 리스트 내용:
[JAVA, JAVASCRIPT, COFFEESCRIPT, HBASE, OPENNLP]

위 예제에서는 UnaryOperator를 구현한 Op 클래스를 통해 모든 문자열을 대문자로 변환했습니다. 람다 표현식을 사용하면 다음과 같이 한 줄로 더 간단하게 작성할 수도 있습니다.

list.replaceAll(str -> str.toUpperCase());

두 메서드의 차이점 비교

구분Collections.replaceAll()List.replaceAll()
소속java.util.Collections 클래스java.util.List 인터페이스
매개변수리스트, 이전 값, 새 값UnaryOperator 객체
동작 방식특정 값과 일치하는 요소만 치환모든 요소에 연산 적용 후 결과로 치환
반환 타입boolean (치환 성공 여부)void
도입 시기자바 1.4자바 8

마무리

Collections.replaceAll()은 특정 값과 일치하는 요소를 새 값으로 바꿀 때, List.replaceAll()은 모든 요소에 일괄적인 변환 로직을 적용할 때 사용하는 것이 적합합니다. 두 메서드의 특성을 잘 이해하고 상황에 맞게 활용하면 컬렉션 데이터를 훨씬 효율적으로 처리할 수 있습니다.