개요
자바에서 리스트(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()은 모든 요소에 일괄적인 변환 로직을 적용할 때 사용하는 것이 적합합니다. 두 메서드의 특성을 잘 이해하고 상황에 맞게 활용하면 컬렉션 데이터를 훨씬 효율적으로 처리할 수 있습니다.