slice는 왜 [start:end)일까?

Nacho·2024년 2월 1일
0
post-thumbnail

Go에서 슬라이스를 사용할 때, 표기법은 a[start:end]이다. 여기서 start는 포함되지만, end는 포함되지 않는다. 즉, start 인덱스부터 end-1 인덱스까지의 요소들이 선택된다.

Go뿐만 아니라 다른 언어에서 array를 분리할 때 start는 포함시키지만 end는 포함시키지 않는다.
특별한 이유가 있는걸까? 문득 의문점이 들어서 찾아보았다.

  1. 명확한 길이 계산: end - start는 슬라이스의 길이를 직접 나타낸다. 예를 들어, a[1:4]1, 2, 3의 세 요소를 포함하므로 길이는 4 - 1 = 3입니다. 이는 길이 계산을 단순하고 명확하게 만든다.

  2. 중첩 및 연속적인 슬라이싱 용이: a[start:end]a[end:x] 형태로 슬라이스를 연속해서 사용할 때, 중복이나 빈 요소 없이 연속적인 슬라이스를 생성하기 쉽다. 예를 들어, a[0:5]a[5:10]a의 첫 번째 요소부터 열 번째 요소까지를 두 개의 슬라이스로 나눈다.

  3. 경계값 처리의 간결함: startend가 슬라이스의 경계를 넘지 않도록 하는 것이 더 쉽다. 예를 들어, a[0:len(a)]는 전체 슬라이스를 나타내며, 이 때 len(a)는 슬라이스의 길이를 초과하지 않는다.

  4. 역사적 및 다른 언어와의 일관성: 이러한 방식은 다른 프로그래밍 언어, 예를 들어 Python에서도 사용되는 방식이다. 따라서 프로그래머들이 이미 익숙한 패턴을 따르는 것이다.

  1. 배열이 저장되는 방식: 메모리상에서 배열은 순차적으로 저장된다.

    위에 그림을 보자. 메모리에서 배열은 위와 같이 저장이된다. index는 배열이 해당 값에 접근하기위한 계산에 사용된다. 다시 말해 요소 하나의 사이즈 * index를 하면 해당 인덱스의 출발점에 도달하게되는 것이다. 그래서 0출발점에서 4출발점을 자르면 (arr[0:4]) index 4의 값은 포함되지 않는다.

이러한 이유들로 인해 Go의 슬라이스 표현은 사용하기 편리하고, 오류를 줄이며, 다른 언어들과의 일관성을 유지하면서 효율적인 프로그래밍을 가능하게 한다.

profile
풀스택 개발자

0개의 댓글

관련 채용 정보