목차
자바 개발자들은 항상 코드를 더 깔끔하고 효율적이며 유지보수가 용이하게 만들어주는 라이브러리를 찾고 있습니다.
구글 구아바(Google Guava)는 일반적인 프로그래밍 작업을 간소화해주는 풍부한 유틸리티 세트를 제공하여 그 중에서도 돋보이는 라이브러리입니다.
구아바(Guava) 는 많은 기능을 제공하지만, 그 중 일부는 특히 놀라운 기능으로 자바 프로그래밍 경험을 크게 향상시킬 수 있습니다.
모든 자바 개발자가 알아야 할 10가지 구아바 기능을 소개합니다.
1. BiMap: 양방향 맵
BiMap은 키뿐만 아니라 값의 고유성도 보장하는 양방향 맵입니다. 이 양방향 맵을 사용하면 키를 값에, 값을 키에 쉽게 매핑할 수 있으며, 고유한 역 매핑을 보장합니다.
예제:
BiMap<String, Integer> userId = HashBiMap.create();
userId.put("Alice", 1);
userId.put("Bob", 2);
System.out.println(userId.get("Alice")); // 출력: 1
System.out.println(userId.inverse().get(2)); // 출력: Bob
2. Range: 단순 비교를 넘어서
Range 클래스는 그 표현력과 유용성 덕분에 여전히 우리의 목록에 포함되어 있습니다. 이는 Comparable 타입의 범위를 다룰 때 없어서는 안 될 도구입니다.
Range<Integer> validGrades = Range.closed(1, 100);
System.out.println(validGrades.contains(70)); // true
System.out.println(validGrades.contains(0)); // false
3. Table: 2차원 맵
Table 컬렉션은 아주 유용한 기능입니다. 왜냐하면, 두 개의 키를 사용하여 값을 고유하게 식별할 수 있습니다. 이를 두 개의 키를 가진 Map이라고 생각해보세요 :)
Table<String, String, Integer> universityCourseSeats = HashBasedTable.create();
universityCourseSeats.put("Computer Science", "CS101", 30);
universityCourseSeats.put("Mathematics", "MA101", 25);
System.out.println(universityCourseSeats.get("Computer Science", "CS101")); // 출력: 30
4. TypeToken: 복잡한 제네릭 안전하게 다루기
자바의 제네릭은 런타임에 타입 소거로 인해 까다로워질 수 있습니다. Guava의 TypeToken 클래스는 컴파일러에 의해 소거된 후에도 제네릭 타입을 안전하게 다룰 수 있게 해줍니다. 이를 통해 동적으로 제네릭 타입에 접근하고 조작할 수 있습니다.
TypeToken<List<String>> typeToken = new TypeToken<List<String>>() {};
Type type = typeToken.getType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) type;
System.out.println(pType.getActualTypeArguments()[0]); // 출력: class java.lang.String
}
5. EventBus: 이벤트 처리 간소화
Guava의 EventBus는 이벤트 생산자와 소비자를 분리하여 이벤트 관리와 처리를 간소화하는 간단하면서도 강력한 퍼블리시-구독 이벤트 시스템입니다. EventBus를 사용하면 리스너가 처리하고자 하는 이벤트 유형을 구독하고, 생산자는 이벤트를 버스에 게시하여 적절한 구독자에게 이벤트를 전달합니다.
// 이벤트 타입 정의
class CustomEvent {
private final String message;
public CustomEvent(String message) {
this.message = message;
}
// Getter
public String getMessage() {
return message;
}
}
// 구독자 정의
class EventListener {
@Subscribe
public void handle(CustomEvent event) {
System.out.println("Received event: " + event.getMessage());
}
}
// 사용 예제
EventBus eventBus = new EventBus();
EventListener listener = new EventListener();
// 구독자 등록
eventBus.register(listener);
// 이벤트 게시
eventBus.post(new CustomEvent("Hello Guava EventBus!"));
6. Multimap - 하나의 키에 여러 값을 다루기
자바의 표준 Map 인터페이스는 키당 하나의 값만 허용하여 제한적일 수 있습니다.
구아바의 Multimap 인터페이스는 하나의 키에 여러 값을 연결할 수 있어, 중복이 예상되는 데이터 컬렉션을 다루기 쉽게 만듭니다.
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class MultimapExample {
public static void main(String[] args) {
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("Fruit", "Apple");
multimap.put("Fruit", "Banana");
multimap.put("Fruit", "Cherry");
multimap.put("Vegetable", "Carrot");
System.out.println(multimap);
}
}
// 출력
// {Fruit=[Apple, Banana, Cherry], Vegetable=[Carrot]}
7. Ordering - 고급 정렬을 쉽게
자바에서 정렬은 때때로 번거로울 수 있으며, 특히 사용자 정의 정렬 로직이 필요할 때 더욱 그렇습니다.
구아바의 Ordering 클래스는 유창한 API를 제공하여 복잡한 정렬 규칙을 쉽게 만들 수 있습니다.
import com.google.common.collect.Ordering;
import java.util.Arrays;
import java.util.List;
public class OrderingExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve");
Ordering<String> byLength = Ordering.natural().onResultOf(String::length);
List<String> sortedNames = byLength.sortedCopy(names);
System.out.println(sortedNames);
}
}
// 출력
// [Eve, John, Jane, Adam]
8. CharMatcher - 문자열 조작을 쉽게
구아바의 CharMatcher 클래스는 특정 기준에 따라 문자를 다듬고, 축소하며, 제거하는 강력한 문자열 조작 유틸리티를 제공합니다.
import com.google.common.base.CharMatcher;
public class CharMatcherExample {
public static void main(String[] args) {
String input = " Hello, Guava! ";
String result = CharMatcher.whitespace().trimAndCollapseFrom(input, ' ');
System.out.println(result); // 출력: "Hello, Guava!"
result = CharMatcher.javaDigit().removeFrom("abc123xyz");
System.out.println(result); // 출력: "abcxyz"
}
}
9. Maps.uniqueIndex - 컬렉션에서 맵 생성
컬렉션에서 맵을 생성하는 것은 종종 상용구 코드를 작성하는 것을 수반합니다.
구아바의 Maps.uniqueIndex 메서드는 지정된 함수에 따라 컬렉션에서 맵을 생성하는 과정을 간소화합니다.
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
public class UniqueIndexExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Adam", "Eve");
Map<Character, String> nameMap = Maps.uniqueIndex(names, name -> name.charAt(0));
System.out.println(nameMap);
}
}
// 출력: {J=John, J=Jane, A=Adam, E=Eve}
10. Lists.partition - 리스트를 서브리스트로 나누기
큰 리스트를 다루는 것은 특히 그것을 청크 단위로 처리해야 할 때 어려울 수 있습니다.
구아바의 Lists.partition 메서드는 리스트를 더 작은 서브리스트로 나누어 큰 데이터셋을 관리하고 처리하기 쉽게 만듭니다.
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Arrays;
public class PartitionExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<List<Integer>> partitions = Lists.partition(numbers, 3);
for (List<Integer> partition : partitions) {
System.out.println(partition);
}
}
}
// 출력
// [1, 2, 3]
// [4, 5, 6]
// [7, 8, 9]
구아바는 자바 개발자들에게 복잡한 작업을 단순화하고 코드 가독성을 향상시키는 다양한 유틸리티를 제공하는 귀중한 도구로 계속 자리매김하고 있습니다. 이 기능들을 프로젝트에 통합함으로써 더 깔끔하고 효율적이며 유지보수가 용이한 코드를 작성하세요 ! :)
읽어주셔서 감사합니다! 😊
개발 관련 궁금증이나 고민이 있으신가요?
아래 링크를 통해 저에게 바로 문의해 주세요! 쉽고 빠르게 도움 드리겠습니다.
'Development > Code' 카테고리의 다른 글
Java 21의 레코드 패턴으로 클린 코드 작성하기 (0) | 2024.07.01 |
---|---|
자바 개발자를 위한: 개발 시간을 단축시킬 6가지 Lombok 기능 (0) | 2024.06.29 |
알아두면 좋은 Spring Boot 기능 10가지 (0) | 2024.06.28 |
Spring Boot의 성능을 향상시키는 10가지 방법 (0) | 2024.06.28 |
Spring Boot에서 자신만의 Rule Engine (룰 엔진) 구현하기 (0) | 2024.06.27 |