Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 아이템 42. 익명 클래스보다는 람다를 사용하라

## ✔️ 익명 클래스 vs 람다
자바 8 이전에는 익명 클래스를 사용하여 함수형 인터페이스를 구현해야 했지만, 람다를 사용하면 이를 더 간결하게 표현할 수 있다.

> 람다는 코드의 간결성과 가독성을 높이며, 불필요한 보일러플레이트 코드를 줄여준다.

## ✔️ 예제 코드
```java
import java.util.*;
import java.util.function.*;

public class LambdaExample {
public static void main(String[] args) {
// 익명 클래스 사용
Comparator<String> anonymousClassComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};

// 람다 표현식 사용
Comparator<String> lambdaComparator = (s1, s2) -> s1.compareToIgnoreCase(s2);
}
}
```

## ✔️ 정리
- 익명 클래스는 불필요한 코드가 많고 가독성이 떨어진다.
- 람다는 간결하며 가독성이 좋고 유지보수성이 뛰어나다.
- 함수형 인터페이스를 구현할 때는 람다를 사용하라.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 아이템 48. 스트림 병렬화는 주의해서 적용하라

## ✔️ 스트림 병렬화의 장단점
스트림을 병렬로 실행하면 성능이 향상될 수 있지만, 무조건 좋은 것은 아니다. 적절한 상황에서만 병렬화를 적용해야 한다.

> 병렬 스트림은 적절한 데이터 크기와 독립적인 연산에서 효과적이지만, 잘못 사용하면 성능이 저하될 수 있다.

## ✔️ 예제 코드
```java
import java.util.stream.LongStream;

public class ParallelStreamExample {
public static void main(String[] args) {
long start = System.nanoTime();
long sum = LongStream.rangeClosed(1, 10_000_000)
.parallel() // 병렬 스트림 사용
.sum();
long end = System.nanoTime();
System.out.println("Sum: " + sum + " (Time: " + (end - start) / 1_000_000 + "ms)");
}
}
```

## ✔️ 병렬 스트림의 고려 사항
- CPU 코어를 활용하여 연산을 분할하는 경우 성능이 향상될 수 있다.
- 데이터 크기가 작거나 공유 리소스를 사용하는 경우 성능이 저하될 수 있다.
- 병렬 스트림을 사용할 때는 반드시 성능 테스트를 수행해야 한다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# 아이템 52. 다중정의는 신중히 사용하라

## ✔️ 다중정의(오버로딩)의 문제점
메서드 오버로딩은 편리한 기능이지만, 혼란을 초래할 수도 있다. 특히, 인자 타입이 애매할 경우 호출할 메서드를 예측하기 어려울 수 있다.

> 다중정의된 메서드는 호출 시점에 정확한 메서드가 선택되는지 주의 깊게 확인해야 한다.

## ✔️ 예제 코드
```java
import java.util.*;

public class OverloadingExample {
public static void print(List<String> list) {
System.out.println("List<String> version");
}

public static void print(Collection<String> collection) {
System.out.println("Collection<String> version");
}

public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
print(list); // 어떤 메서드가 호출될까? (List<String>이 Collection<String>도 구현하므로 애매해질 수 있음)
}
}
```

## ✔️ 다중정의의 해결책
- 다중정의보다는 메서드 이름을 다르게 정의하는 것이 명확성을 높일 수 있다.
- `varargs`나 제네릭을 활용하여 일관된 메서드를 제공하는 것이 좋다.
- 애매한 다중정의는 피하고, 가독성과 유지보수성을 고려하여 설계해야 한다.