자바 탐색 과제 troubleshooting

오정빈·2025년 10월 13일

내일배움캠프

목록 보기
16/22

Java 탐색 및 성능 측정 과제

2025.10.13

학습 주제

List를 이용한 상품 탐색(binary search / linear search) 구현 및
성능 비교(performance test)


문제 1: 문자열(String) 비교 방식

상황

binarySearch(String productName)을 구현할 때
“문자열을 기준으로 좌/우를 어떻게 비교해야 하는지” 감이 안왔다.

if (productName.compareTo(midProduct.getName()) == 0) {
    ...
}

✅ 해결 방법

  • String.compareTo() 메소드 사용.
    • compareTo()사전순 비교를 수행하며
      반환값이 양수/음수/0이면 각각 오른쪽/왼쪽/같음을 의미함.
    • 정렬된 리스트 에서만 사용이 가능하다.
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()의 반환값으로 처리한다.


문제 2: 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)은 숫자형 인덱스를 문자열로 표현할 때 매우 유용하다.


문제 3: binarySearch() 비교문 작성 실수

상황

SearchEngine 클래스의 이진탐색 구현 중

if (productName.compareTo(productName) == 0)

처럼 자기 자신끼리 비교하는 코드가 되어버림 → 항상 0 반환.

어려움의 본질

  • 비교 대상이 중간값(midProduct)이 아니라, 자기 자신(productName)이었음.
  • 결과적으로 탐색이 제대로 이루어지지 않음.

✅ 해결 방법

  • 비교 기준을 명확히 구분:
    • 왼쪽(right)/오른쪽(left) 이동 판단은 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

0개의 댓글