문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

슬라이싱 | |
정의 | 시퀀스 자료형(문자열, 리스트, 튜플 등)에서 일부분을 잘라내는 연산 |
표기 형식 | 시퀀스객체[시작인덱스:끝인덱스:스텝] |
시작인덱스 | 슬라이싱을 시작할 위치의 인덱스 (포함) |
끝인덱스 | 슬라이싱을 끝낼 위치의 인덱스 (미포함) |
스텝 | 인덱스를 증가시키는 간격 (생략 가능, 기본값 1) |
상세 정보 | |
인덱스 생략 | 시작인덱스 생략: 처음부터 끝인덱스 생략: 끝까지 스텝 생략: 1씩 증가 |
음수 인덱스 | 시퀀스의 끝에서부터 위치를 지정 예: -1은 마지막 요소 |
음수 스텝 | 역순으로 요소를 추출 |
새로운 객체 | 슬라이싱 결과는 원본과 다른 새로운 시퀀스 객체 |
주요 용도 | 데이터의 일부 추출 시퀀스 복사 시퀀스 순서 반전 |

슬라이싱은 프로그래밍 언어에서 시퀀스 자료형의 일부분을 추출하는 핵심 연산이다. 주로 문자열, 리스트, 튜플과 같은 순서가 있는 데이터 구조에서 특정 범위의 요소들을 선택적으로 가져오는 데 사용된다. 이 연산은 원본 데이터를 변경하지 않고 새로운 시퀀스 객체를 반환하는 것이 일반적이다.
슬라이싱의 기본 표기 형식은 시퀀스객체[시작인덱스:끝인덱스:스텝]이다. 여기서 시작인덱스는 추출을 시작할 위치를 가리키며, 그 위치의 요소는 결과에 포함된다. 끝인덱스는 추출을 종료할 위치를 지정하지만, 이 인덱스에 해당하는 요소는 결과에서 제외된다는 점이 특징이다. 스텝은 요소를 선택하는 간격을 결정하며, 생략할 경우 기본값인 1이 적용되어 연속적인 요소들이 추출된다.
이 기능은 데이터의 일부를 빠르게 확인하거나, 특정 패턴을 추출하거나, 원본을 복사하는 등 다양한 맥락에서 활용된다. 특히 파이썬 언어에서 슬라이싱 문법은 매우 직관적이고 강력하게 구현되어 있어 데이터 분석과 스크립트 작성에 필수적인 도구로 자리 잡았다.
슬라이싱을 효과적으로 사용하려면 각 인덱스의 포함 여부와 인덱스 범위를 벗어났을 때의 처리 방식, 그리고 반환된 객체가 얕은 복사인지 깊은 복사인지에 대한 이해가 필요하다. 이러한 기본 개념을 바탕으로 배열 조작이나 문자열 처리와 같은 실제 작업에 적용할 수 있다.

슬라이싱은 시퀀스 자료형인 문자열, 리스트, 튜플 등에서 특정 범위의 일부분을 잘라내어 새로운 시퀀스 객체를 생성하는 연산이다. 이는 전체 데이터에서 원하는 부분만을 효율적으로 추출하거나 복사할 수 있게 해주는 핵심 기능이다.
슬라이싱의 일반적인 형식은 시퀀스객체[시작인덱스:끝인덱스:스텝]으로 표현된다. 여기서 시작인덱스는 슬라이싱을 시작할 위치의 인덱스를 의미하며, 이 위치의 요소는 결과에 포함된다. 반면 끝인덱스는 슬라이싱을 끝낼 위치의 인덱스를 가리키지만, 이 인덱스에 해당하는 요소는 결과에서 제외된다는 점이 중요하다. 마지막으로 스텝은 인덱스를 증가시키는 간격을 지정하며, 생략할 경우 기본값은 1이다.
이 연산은 원본 데이터를 변경하지 않고, 지정된 범위의 요소들로 구성된 새로운 객체를 반환한다. 예를 들어, 긴 문자열에서 특정 단어를 추출하거나, 리스트의 중간 부분만을 별도로 처리해야 할 때 유용하게 사용된다. 슬라이싱은 인덱싱과 함께 시퀀스 데이터를 다루는 가장 기본적이면서도 강력한 도구 중 하나이다.
슬라이싱의 일반적인 형식은 시퀀스객체[시작인덱스:끝인덱스:스텝]으로 표현된다. 여기서 시작인덱스는 슬라이싱을 시작할 위치의 인덱스를 의미하며, 이 위치의 요소는 결과에 포함된다. 끝인덱스는 슬라이싱을 끝낼 위치의 인덱스를 의미하지만, 이 위치의 요소는 결과에 포함되지 않는다는 점이 중요하다. 마지막으로 스텝은 요소를 추출할 때 인덱스를 얼마나 증가시킬지를 결정하는 값으로, 생략 가능하며 기본값은 1이다.
이 세 가지 매개변수는 모두 생략하거나 음수 값을 사용할 수 있다. 시작인덱스를 생략하면 시퀀스의 처음부터, 끝인덱스를 생략하면 시퀀스의 끝까지 슬라이싱한다. 스텝을 생략하면 기본값 1이 적용되어 연속적인 요소를 추출한다. 음수 인덱스는 시퀀스의 끝에서부터의 위치를 나타내며, 음수 스텝을 사용하면 시퀀스를 역순으로 추출할 수 있다.
예를 들어, 시퀀스객체[2:5]는 인덱스 2, 3, 4에 해당하는 요소를 추출한다. 시퀀스객체[:3]는 처음부터 인덱스 2까지, 시퀀스객체[3:]는 인덱스 3부터 끝까지를 의미한다. 시퀀스객체[::2]는 처음부터 끝까지 2칸 간격으로, 시퀀스객체[::-1]은 전체 시퀀스를 역순으로 만드는 효과를 낸다.
이러한 형식은 파이썬의 문자열, 리스트, 튜플과 같은 주요 시퀀스 자료형에서 일관되게 적용된다. 슬라이싱 연산은 원본 데이터를 변경하지 않고 새로운 시퀀스 객체를 생성하여 반환하는 특징을 가진다.

파이썬에서 슬라이싱은 문자열, 리스트, 튜플과 같은 시퀀스 자료형에 대해 매우 강력하고 직관적인 부분 추출 기능을 제공한다. 기본적인 형식은 시퀀스객체[시작인덱스:끝인덱스:스텝]으로, 시작인덱스 위치부터 끝인덱스 위치 직전까지, 지정된 스텝 간격으로 요소를 선택하여 새로운 시퀀스 객체를 반환한다. 예를 들어, my_list[1:4]는 my_list의 인덱스 1, 2, 3에 해당하는 요소들로 구성된 새로운 리스트를 생성한다. 각 인덱스는 생략이 가능하며, 음수 인덱스를 사용하여 시퀀스의 끝에서부터 위치를 지정할 수도 있다.
스텝 값을 활용하면 더욱 유연한 조작이 가능하다. 양수의 스텝은 앞에서 뒤로, 음수의 스텝은 뒤에서 앞으로 요소를 선택하게 하여 시퀀스를 역순으로 추출하는 데 사용된다. 예를 들어, my_string[::-1]은 문자열을 완전히 뒤집은 결과를 반환하는 흔한 관용구이다. 또한, 시퀀스객체[:]와 같이 시작과 끝 인덱스를 모두 생략하면 시퀀스 전체를 얕은 복사하여 새로운 객체를 만드는 효과를 낸다. 이는 리스트와 같은 가변 객체를 복사할 때 유용하게 쓰인다.
파이썬 슬라이싱의 큰 장점 중 하나는 인덱스 범위를 벗어나더라도 예외 처리 없이 최대한 유효한 범위 내의 요소만을 안전하게 반환한다는 점이다. 이로 인해 코드 작성 시 경계 조건 검사를 간소화할 수 있다. 이러한 슬라이싱 연산은 데이터 분석, 텍스트 처리, 알고리즘 구현 등 다양한 프로그래밍 작업에서 데이터의 부분 집합을 빠르고 효율적으로 다루는 데 필수적으로 활용된다.
파이썬의 슬라이싱과 유사한 기능은 다른 프로그래밍 언어에서도 다양한 형태로 구현되어 있다. 자바스크립트의 배열과 문자열 객체는 slice() 메서드를 제공하며, 시작 인덱스와 끝 인덱스를 인자로 받아 새로운 배열이나 문자열을 반환한다. 루비에서는 범위 객체(.. 또는 ...)를 사용하여 배열이나 문자열의 일부를 추출할 수 있으며, 이는 파이썬의 슬라이싱과 개념적으로 매우 유사하다.
Go 언어에서는 슬라이스(Slice)라는 자료형 자체가 존재하며, 배열의 일부를 참조하는 방식을 취한다. Go의 슬라이스 연산은 array[low:high] 형식으로, 파이썬과 마찬가지로 시작 인덱스는 포함하고 끝 인덱스는 제외한다. Rust에서는 &slice[start..end]나 &slice[start..=end]와 같은 범위 문법을 사용하여 슬라이스(데이터의 일부 뷰)를 생성한다.
한편, C++의 표준 템플릿 라이브러리(STL)에서는 std::vector나 std::string과 같은 컨테이너에 대해 begin()과 end() 반복자 쌍을 이용해 부분 범위를 지정하는 방식이 일반적이다. 자바에서는 Arrays.copyOfRange() 메서드나 String.substring() 메서드 등이 특정 범위의 데이터를 새로운 객체로 복사해 반환하는 기능을 제공한다. 이러한 구현들은 언어의 철학과 메모리 관리 모델에 따라 동작과 성능 특성이 다르게 나타난다.

슬라이싱의 가장 기본적이고 핵심적인 용도는 시퀀스 자료형에서 원하는 부분만을 추출하는 것이다. 문자열, 리스트, 튜플과 같은 시퀀스는 연속된 요소들을 가지고 있으며, 슬라이싱을 통해 이들의 일부 구간을 새로운 시퀀스 객체로 얻을 수 있다. 예를 들어, 긴 문자열에서 특정 단어를 뽑아내거나, 데이터 리스트에서 특정 범위의 값들만을 선택적으로 처리할 때 유용하게 사용된다.
슬라이싱 연산은 시퀀스객체[시작인덱스:끝인덱스:스텝] 형식으로 수행된다. 여기서 시작인덱스는 추출을 시작할 위치를, 끝인덱스는 추출을 종료할 위치를 가리키지만, 실제로는 끝인덱스 직전의 요소까지 포함된다는 점이 중요하다. 스텝은 요소를 선택하는 간격을 설정하며, 생략 시 기본값 1이 적용되어 연속적인 요소들을 추출한다. 음수 스텝을 사용하면 시퀀스를 역순으로 추출할 수도 있다.
사용 예시 (가정: | 결과 | 설명 |
|---|---|---|
|
| 인덱스 1부터 4 이전(인덱스 3)까지 추출 |
|
| 시작을 생략하면 처음(인덱스 0)부터 시작 |
|
| 끝을 생략하면 마지막 요소까지 추출 |
|
| 스텝 2: 처음부터 끝까지 2칸씩 건너뛰며 추출 |
|
| 스텝 -1: 전체 시퀀스를 역순으로 추출 |
이러한 부분 추출 기능은 데이터 분석이나 텍스트 처리에서 매우 빈번하게 활용된다. 예를 들어, 로그 파일에서 특정 시간대의 기록만을 슬라이싱으로 분리하거나, 이미지 처리에서 이미지 데이터 배열의 특정 영역(관심 영역)을 잘라내는 작업 등에 적용될 수 있다. 슬라이싱은 원본 데이터를 변경하지 않고 새로운 데이터 사본을 생성하므로, 데이터의 무결성을 유지하면서 다양한 조작을 가능하게 한다.
슬라이싱은 시퀀스의 일부를 추출하는 것을 넘어, 데이터를 복사하거나 조작하는 데에도 핵심적으로 활용된다. 리스트나 문자열 같은 시퀀스 자료형에 슬라이싱 연산을 적용하면, 원본 객체의 특정 부분을 복사한 새로운 객체가 생성된다. 이는 원본 데이터를 변경하지 않고도 그 일부를 안전하게 사용하거나, 변형된 새로운 데이터를 만들 수 있는 기반이 된다.
데이터 조작 측면에서 슬라이싱은 매우 유연하다. 예를 들어, 스텝 값을 음수로 지정하면 시퀀스를 역순으로 추출할 수 있어, 문자열이나 리스트를 뒤집는 효과를 간편하게 얻을 수 있다. 또한, 슬라이싱 구문을 이용한 할당 연산은 시퀀스의 특정 부분을 다른 데이터로 대체하는 강력한 수단이 된다. 리스트[2:5] = [10, 20, 30]과 같은 코드는 원본 리스트의 2번부터 4번 인덱스 요소를 새로운 값들로 한꺼번에 교체한다.
그러나 슬라이싱을 통한 복사는 얕은 복사에 해당한다는 점에 주의해야 한다. 리스트 안에 또 다른 가변 객체인 리스트가 포함된 경우, 슬라이싱으로 생성된 새 리스트는 내부의 중첩된 리스트에 대한 참조만을 복사한다. 따라서 내부 리스트를 수정하면 원본과 복사본 모두에 영향을 미칠 수 있다. 완전한 독립 복사본이 필요하다면 깊은 복사를 위한 별도의 방법을 사용해야 한다.

슬라이싱을 수행할 때 사용하는 인덱스 범위는 직관적이지 않을 수 있어 주의가 필요하다. 가장 중요한 규칙은 시작인덱스는 포함되고, 끝인덱스는 포함되지 않는다는 점이다. 예를 들어, my_list[1:4]는 my_list의 인덱스 1, 2, 3에 해당하는 요소들로 구성된 새로운 리스트를 반환하며, 인덱스 4의 요소는 결과에 포함되지 않는다.
인덱스는 0부터 시작하며, 음수 인덱스를 사용할 수 있다. 음수 인덱스는 시퀀스의 끝에서부터 위치를 센다. 예를 들어, 인덱스 -1은 마지막 요소를 가리킨다. my_string[-5:-2]와 같은 표현은 문자열의 끝에서 다섯 번째 요소부터 끝에서 세 번째 요소까지(끝 인덱스 -2는 미포함)를 추출한다. 시작이나 끝 인덱스를 생략하면, 시작은 시퀀스의 처음(0), 끝은 시퀀스의 끝(길이)을 의미한다. 따라서 my_list[:3]은 처음부터 인덱스 2까지, my_list[2:]는 인덱스 2부터 끝까지를 의미한다.
인덱스 범위가 시퀀스의 실제 길이를 벗어나더라도 파이썬을 비롯한 많은 언어는 이를 오류로 처리하지 않고, 가능한 범위 내에서 자동으로 조정하여 처리한다. 시작인덱스가 시퀀스 길이보다 크면 빈 시퀀스를 반환하며, 끝인덱스가 길이보다 크면 시퀀스의 끝까지를 의미한다. 이는 프로그래밍 시 경계 조건을 처리하는 데 유용하다.
스텝 값이 음수인 경우, 슬라이싱은 역방향으로 진행된다. 이때 시작인덱스는 끝인덱스보다 커야 하며, 포함 관계는 동일하게 적용된다. my_list[5:1:-1]은 인덱스 5, 4, 3, 2의 요소를 포함하는 결과를 생성한다. 스텝이 0이 되는 것은 허용되지 않으며 오류를 발생시킨다.
슬라이싱 연산의 결과는 원본 시퀀스 객체의 일부를 참조하는 새로운 객체를 생성한다. 문자열이나 튜플 같은 불변 객체의 경우, 슬라이싱으로 생성된 새 객체는 원본과 별개의 데이터를 가지게 된다. 그러나 리스트와 같은 가변 객체를 슬라이싱할 때 주의해야 할 점이 있다. 슬라이싱은 기본적으로 얕은 복사를 수행한다. 이는 슬라이싱 결과로 생성된 새 리스트가 원본 리스트의 요소들을 그대로 참조한다는 의미이다.
예를 들어, 중첩된 리스트(리스트 안에 또 다른 리스트가 있는 구조)에서 슬라이싱을 하면, 새 리스트는 내부의 중첩 리스트에 대한 참조를 그대로 가져온다. 따라서 슬라이싱으로 얻은 새 리스트에서 중첩된 내부 리스트의 값을 변경하면, 원본 리스트의 해당 중첩 리스트 값도 함께 변경되는 부작용이 발생할 수 있다. 이는 복사가 최상위 레벨의 참조만을 복사하기 때문이다.
이러한 얕은 복사로 인한 문제를 피하려면 깊은 복사가 필요하다. 파이썬에서는 copy 모듈의 deepcopy 함수를 사용하여 객체의 모든 중첩된 부분까지 완전히 새로운 객체로 복사할 수 있다. 슬라이싱은 데이터의 일부를 빠르게 추출하거나 복제하는 데 유용하지만, 복잡한 중첩 구조를 가진 데이터를 독립적으로 조작해야 할 때는 복사 방식의 차이를 이해하고 적절한 방법을 선택하는 것이 중요하다.