List를 이용한 상품 탐색(binary search / linear search) 구현 및
성능 비교(performance test)
binarySearch(String productName)을 구현할 때
“문자열을 기준으로 좌/우를 어떻게 비교해야 하는지” 감이 안왔다.
if (productName.compareTo(midProduct.getName()) == 0) {
...
}
String.compareTo() 메소드 사용.compareTo()는 사전순 비교를 수행하며int cmp = productName.compareTo(midProduct.getName());
if (cmp < 0) right = mid - 1;
else if (cmp > 0) left = mid + 1;
else return mid;
문자열 비교는
==이 아니라.compareTo()또는.equals()로 해야 한다.
“왼쪽/오른쪽” 판단은compareTo()의 반환값으로 처리한다.
List<Product> 자동 생성 및 정렬10,000개의 상품 데이터를 자동으로 생성해야 했음.
상품명은 "Product_0001" ~ "Product_10000" 형태여야 함.
String.format("Product_%04d", i) 사용 → 0패딩된 문자열 생성for (int i = 1; i <= 10000; i++) {
String name = String.format("Product_%04d", i);
products.add(new Product(name));
}
정렬된 리스트를 전제로 하는 binary search에서는
반드시 동일한 기준으로 정렬해야 한다.
문자열 포맷팅(String.format)은 숫자형 인덱스를 문자열로 표현할 때 매우 유용하다.
SearchEngine 클래스의 이진탐색 구현 중
if (productName.compareTo(productName) == 0)
처럼 자기 자신끼리 비교하는 코드가 되어버림 → 항상 0 반환.
midProduct)이 아니라, 자기 자신(productName)이었음.productName vs midProduct.getName() 비교로 수정.int compare = productName.compareTo(midProduct.getName());
if (compare == 0) return midProduct;
else if (compare < 0) right = mid - 1;
else left = mid + 1;
“무엇을 무엇과 비교하고 있는가”를 항상 명확히 해야 한다.
특히 문자열 비교에서는compareTo()의 인자를 잘못 넣으면 논리 전체가 무너진다.
10_000 vs 10000코드에 generateProducts(10_000)처럼 숫자 사이에 _를 사용하는 사람이 있어서 찾아봤다.
_는 단순히 가독성을 높이는 숫자 구분자이며,
실제 값은 동일 (10_000 == 10000).
언더스코어는 Java 7 이후 숫자 리터럴 내에서 자유롭게 사용 가능함을 확인.
성능이나 계산 결과에는 전혀 영향 없음.
int a = 10_000; // = 10000
_는 단순한 “시각적 구분자”일 뿐, 값의 의미는 변하지 않는다.
| 주제 | 배운 점 |
|---|---|
| 문자열 비교 | compareTo() 사용법 |
| 리스트 정렬 | Comparator.comparing() |
| 이진 탐색 로직 | left, right, mid 개념 |
| 숫자 리터럴 | 10_000 == 10000 |