오늘은 Java의 스트림(Stream)과 컬렉션(List) 처리 방식, 정규식 활용, 그리고 리스트(ArrayList vs LinkedList)의 차이에 대해 깊이 학습했다.
이론만이 아니라 직접 문제를 풀면서 IntStream, matches(), StringBuilder.append() 같은 실용적인 방법을 비교하며 체감했다.
IntStream vs Stream<Integer>int[] 또는 List<Integer>에서 합계를 구할 때 어떤 방식이 더 효율적인가? IntStream을 사용하면 sum() 같은 연산을 바로 사용할 수 있고, Stream<Integer>는 mapToInt()로 변환이 필요하다. List<Integer>에서 sum()을 구할 때 mapToInt()를 추가해야 해서 IntStream이 더 직관적이었다. int sum1 = Arrays.stream(arr).sum(); // IntStream 사용 (바로 연산 가능)
int sum2 = list.stream().mapToInt(Integer::intValue).sum(); // Stream<Integer> 변환 필요
🔹 결론: int[]를 다룰 때는 IntStream을 선호하는 것이 좋다.
IntStream.iterate() vs IntStream.range()for 문 없이 규칙적인 숫자 스트림을 생성하는 가장 효과적인 방법은?range()는 특정 범위만 반복할 때, iterate()는 규칙적인 숫자 증가가 필요할 때 사용.k의 배수를 만들 때 IntStream.iterate(k, i -> i + k) 방식이 깔끔했다.IntStream.iterate(k, i -> i + k).limit(n / k).toArray(); // k의 배수 생성
🔹 결론: range()는 범위 반복에, iterate()는 특정 규칙 적용에 유용하다.
String.valueOf() vs StringBuilder.append()String.valueOf()와 StringBuilder.append() 중 어느 것이 나을까?String.valueOf()는 변환이 간편하지만, 여러 번 문자열을 변경해야 할 경우 StringBuilder.append()가 더 빠르다.🔹 결론: 문자열을 한 번만 변환할 때는 String.valueOf(), 반복 변환이 필요할 때는 StringBuilder를 사용하자.
matches("[05]+")의 의미.filter(i -> String.valueOf(i).matches("[05]+"))
equals()는 특정 값만 비교 가능하지만, matches("[05]+")를 사용하면 모든 0과 5 조합을 체크할 수 있다. list.add(0, list.remove(list.size() - 1)) 동작 방식LinkedList를 사용하면 removeLast() 후 addFirst()가 가능하지만, ArrayList에서는 add(0, remove(size-1)) 방식이 필요했다.list.remove()가 값을 반환하는 것을 활용하면 깔끔하게 회전 구현 가능.list.add(0, list.remove(list.size() - 1)); // 마지막 원소를 맨 앞으로 이동
🔹 결론: 리스트에서 원소를 이동할 때 remove()는 반환 값을 활용하면 코드가 간결해진다.