java.util.function.UnaryOperator 인터페이스는 람다 표현식(lambda expression)의 할당 대상으로 사용할 수 있는 함수형 인터페이스로, 하나의 피연산자에 대해 연산을 수행하고 입력과 동일한 타입의 결과를 반환합니다. 이 인터페이스를 직접 구현하면 개발자가 원하는 형태의 사용자 정의 단항 연산자를 자유롭게 만들 수 있습니다.
List 인터페이스의 replaceAll() 메서드는 UnaryOperator 객체를 매개변수로 받아, 현재 리스트의 모든 요소에 해당 연산을 일괄 적용한 후 기존 값을 그 결과값으로 대체합니다. 즉, 반복문 없이도 리스트 전체를 한 번에 변환할 수 있는 편리한 방법입니다.
다음 예제에서는 UnaryOperator 인터페이스를 구현하여 사용자 정의 단항 연산자 객체를 생성하고, 이를 replaceAll() 메서드의 인수로 전달해 리스트의 모든 문자열을 대문자로 변환하는 과정을 살펴봅니다.
예제 코드
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("Contents of the list: "+list);
list.replaceAll(new Op());
System.out.println("Contents of the list after replace operation: \n"+list);
}
}실행 결과
Contents of the list: [Java, JavaScript, CoffeeScript, HBase, OpenNLP] Contents of the list after replace operation: [JAVA, JAVASCRIPT, COFFEESCRIPT, HBASE, OPENNLP]
동작 방식 설명
위 예제의 핵심은 Op 클래스입니다. 이 클래스는 UnaryOperator<String>을 구현하며, apply() 메서드 안에서 str.toUpperCase()를 호출해 전달받은 문자열을 대문자로 변환합니다.
list.replaceAll(new Op())가 호출되면 리스트의 각 요소("Java", "JavaScript" 등)가 순서대로 apply() 메서드에 전달되고, 반환된 대문자 문자열이 원래 값과 교체됩니다. 실행 결과를 보면 리스트의 모든 요소가 [JAVA, JAVASCRIPT, COFFEESCRIPT, HBASE, OPENNLP]로 변환된 것을 확인할 수 있습니다.
참고로, 별도의 클래스를 만들지 않고 람다 표현식을 사용해 list.replaceAll(str -> str.toUpperCase());와 같이 더 간결하게 작성할 수도 있습니다.