방구석 컴퓨터/방구석 자바 / / 2024. 11. 15. 10:28

인덱스 범위 설정: 끝 인덱스의 직전까지로 하는 이유

반응형

개발을 하다 보면 배열이나 문자열에서 특정 부분을 잘라내서 사용해야 하는 상황이 자주 발생합니다.

이럴 때 사용하는 메서드가 `Arrays.copyOfRange`, `substring` 등이 있는데요.

 

이런 메서드를 사용할 때 헷갈림과 함께 자주 드는 의문이 있었습니다.

"왜 지정한 끝 인덱스의 직전까지 포함되지? 헷갈리게!"

 

단순하게 생각해 보면 끝 인덱스를 포함시키는 것이 더 직관적인 거 같은데, 많은 언어와 라이브러리 및 메서드들이 끝 인덱스의 직전까지 포함하는 방식을 사용하고 있습니다. (그렇다면 당연히 이유가 있겠지요)

 

이번 글에서는 이렇게 범위의 끝 인덱스를 직전까지만 포함하는 이유를 알아보려고 합니다.


1. 범위의 길이를 쉽게 계산 가능

종료 인덱스를 직전까지만 포함하게 되면, 시작 인덱스와 종료 인덱스의 차이만으로 범위의 길이를 쉽게 계산할 수 있습니다.

예를 들어, `substring(2,5)를 사용할 때, 서브 스트링의 길이는 `5 - 2 = 3`으로 간단히 구할 수 있습니다.

덕분에 배열이나 문자열의 일부분을 잘라낼 때 원하는 길이를 쉽게 파악할 수 있어 편리합니다.

String str = "abcdef";
String result = str.substring(2, 5); // "cde"
System.out.println(result.length()); // 3

 

위에 예시처럼, 시작과 끝 인덱스의 차이로 바로 길이를 알 수 있으니 직관적이고 빠르게 개발을 이어나갈 수 있습니다.


2. 연속적인 범위 설정의 편리함

종료 인덱스를 직전까지 포함하게 하면, 연속적인 범위를 설정할 때 겹침 없이 자연스럽게 범위를 나눌 수 있습니다.

 

예를 들어, `"abcdef"`을 두 부분으로 나눌 때 `substring(0,3)`과 `substring(3,6)`으로 지정하면 `"abc"`와 `"def"`로 딱 맞춰서 나뉩니다.

 

이때, 두 범위가 겹치지 않으면서도 모든 요소를 포함할 수 있게 됩니다.

String str = "abcdef";
String firstHalf = str.substring(0, 3); // "abc"
String secondHalf = str.substring(3, 6); // "def"

 

이런 연속 범위 지정은 여러 데이터를 나눌 때 추가적인 코드 작성 없이도 원하는 대로 전체를 포괄할 수 있습니다.


3. 일관성과 가독성

종료 인덱스 직전까지만 포함하는 규칙은 다양한 프로그래밍 언어에서 채택하고 있습니다.

이 방식으로 범위를 지정하면 배열, 문자열, 리스트 등 여러 자료구조에서 일관된 규칙을 유지할 수 있어 코드의 가독성이 높아집니다.

 

다른 메서드나 API를 사용할 때도 동일한 원칙을 적용할 수 있어, 규칙을 이해한 이후에는 새로 익힐 필요가 없어지게 됩니다.


마지막으로 인덱스 범위 지정이 필요한, 자주 사용되는 메서드 예시를 몇 개 남깁니다.

1. `String.substring(int beginIndex, int endIndex)

`substring` 메서드는 `beginIndex`부터 `endIndex` 직전까지의 문자열을 추출합니다.

String str = "HelloWorld";
String result = str.substring(2, 5); // "llo"

 

여기서 `"llo"`는 `str`의 인덱스 2부터 4까지(5의 직전)의 부분 문자열입니다.


2. `Arrays.copyOfRange(T [] original, int from, int to)

배열의 일부 요소를 복사하여 새로운 배열로 변환합니다.

`from` 인덱스부터 `to` 인덱스 직전까지의 요소를 복사합니다.

int[] numbers = {0, 1, 2, 3, 4, 5};
int[] result = Arrays.copyOfRange(numbers, 1, 4); // {1, 2, 3}

 

`result` 배열에는 `numbers` 배열의 인덱스 1부터 3까지의 요소 `{1, 2, 3}`이 복사됩니다.


3. `List.subList(int fromIndex, int toIndex)`

`List`의 특정 범위 요소들을 반환하는 서브 리스트를 만듭니다.

`formIndex`부터 `toInex` 직전까지의 요소가 포함된 서브 리스트를 반환합니다.

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
List<String> subList = list.subList(1, 4); // ["b", "c", "d"]

 

여기서 `subList`는 인덱스 1부터 3까지의 요소인 `["b", "c", "d"]`입니다.

반응형

'방구석 컴퓨터 > 방구석 자바' 카테고리의 다른 글

equals와 hashCode  (0) 2024.11.14
제네릭(Generic)  (0) 2023.09.08
빌더 패턴(Builder Pattern)  (0) 2023.08.21
StringUtils  (0) 2023.08.17
메이븐(Maven)  (0) 2023.08.16
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유