본문 바로가기

JAVA

[JAVA] indexOf() 분석해보기

소스 분석 중에 신기한 코드를 보게 되었다.

이걸 이렇게 쓴다고..? 경험이 부족해서 그런 건지 새로운 사용법이 신기할 따름이었다.

나중에 참고하기 위해 제대로 분석해보기로 했다!

 

오늘의 주제는 indexOf

String 클래스의 특정 문자를 찾아서 index를 반환해주는 메서드이다.

String str = "abcd";

str.indexOf("a") // 0
str.indexOf("b") // 1
str.indexOf("z") // -1

특정 문자가 있으면 해당 index 위치를 반환, 없으면 -1을 반환한다.

 

String code = "A01"; // code = A01, A02, B01, B02

if(code.indexOf("A") != -1) {
	// A코드일때 처리
}

일반적으로 실무에서는 이런 식으로 쓸 수 있을 것 같다.

 

그런데 내가 봤던 신기한 소스는..?

// String num = 1~8
if("5678".indexOf(num) != -1) {

}

마치 equals  쓰는 것과 비슷해서 신기했다.

처음 봤을 땐 이게 맞는 건가 싶었는데.. 정상적인 코드였다.

5~8에 해당하는 문자일 때만 따로 처리하려고 하는 if문이었고 문득 궁금했다.

 

좀 느리지 않을까?

// String num = 1~8
if("5".equals(num) || "6".equals(num) || "7".equals(num) || "8".equals(num)) {

}

이런 식으로도 비교가 가능할 텐데.. 어떤 게 효율적인지 궁금했다!

 

String[] s = {"1", "2", "3", "4", "5", "6", "7", "8"};
		
long start = System.nanoTime();

for(int i=0; i<s.length; i++) {
    String num = s[i];

    // case 1
    if("5".equals(num) || "6".equals(num) || "7".equals(num) || "8".equals(num)) {
    }

    // case 2
    if("5678".indexOf(num) != -1) {
    }

}

long end = System.nanoTime();
double time = end - start;

System.out.println(time);
// case 1 : 3000(ns) ~
// case 2 : 5300(ns) ~

단순하게 1부터 8까지 반복하면서 두 가지 케이스를 테스트해보았다.

결과는 case 1번의 equals 비교문이 작은 차이지만 조금 더 빠르다는 것을 알게 되었다!

 

 

indexOf 내부 코드

 

아무래도 indexOf 내부적으로도 탐색을 하기 때문에 속도의 차이가 날 수밖에 없을 것 같다.

 

색다른 코드를 발견해서 비교해보고 싶었던 내용이었는데.. 속이 좀 시원해졌다!

앞으로도 궁금한 주제가 생길 때마다 열심히 분석해봐야겠다.