슬라이스(Slices)
슬라이스는 문법적으로 부분 구간(subrange) 타입과 비슷해 보이지만, 다른 맥락에서 사용됩니다. 슬라이스는 단순히 두 개의 경계값 `a`와 `b`를 담고 있는 Slice 타입의 객체일 뿐입니다. 슬라이스 자체로는 그리 유용하지 않지만, 다른 컬렉션 타입에서 Slice 객체를 받아 구간을 정의하는 연산자를 제공합니다.
```nim
var
a = "Nim is a programming language"
b = "Slices are useless."
echo a[7 .. 12] # --> 'a prog'
b[11 .. ^2] = "useful"
echo b # --> 'Slices are useful.'
```
위 예시에서 슬라이스는 문자열의 일부를 수정하는 데 사용됩니다. 슬라이스의 경계값은 타입이 허용하는 모든 값을 가질 수 있지만, 실제로 어떤 값이 허용되는지는 슬라이스를 사용하는 프로시저가 정의합니다.
문자열, 배열, 시퀀스 등의 인덱스를 지정하는 다양한 방식을 이해하려면, Nim은 0부터 시작하는 인덱스 체계를 사용한다는 점을 기억해야 합니다.
예를 들어 문자열 `b`의 길이는 19이며, 인덱스를 표현하는 두 가지 방법은 다음과 같습니다:
```nim
"Slices are useless."
| | |
0 11 17 (일반 인덱스 사용)
^19 ^8 ^2 (^ 문법 사용)
```
따라서 `b[0 .. ^1]`은 `b[0 .. b.len-1]` 또는 `b[0 ..< b.len]`과 동일합니다. 여기서 `^1`은 `b.len-1`을 간단히 표현하는 방법입니다. (뒤에서부터 인덱스를 세는 연산자 Backwards Index를 이용).
위 예제에서는 문자열이 마침표로 끝나므로 "useless" 부분만 잘라 "useful"로 교체하려고 합니다.
- `b[11 .. ^2]`은 "useless" 부분을 가리키며,
- `b[11 .. ^2] = "useful"`은 "useless"를 "useful"로 바꿔 최종 결과 "Slices are useful."을 만듭니다.
참고:
- 동일한 표현: `b[^8 .. ^2] = "useful"`, `b[11 .. b.len-2] = "useful"`, `b[11 ..< b.len-1] = "useful"`.
- `^` 연산자는 `BackwardsIndex` 타입을 반환하므로, `const lastIndex = ^1`처럼 상수를 정의해 나중에 `b[0 .. lastIndex]`로 활용할 수도 있습니다.

객체(Objects)
여러 값을 하나의 구조로 묶어 이름을 부여할 때 사용하는 기본 타입이 object입니다. 객체는 값 타입(value type)이므로, 객체를 새로운 변수에 할당하면 그 안의 모든 필드 값이 복사됩니다.
각 객체 타입 `Foo`에는 `Foo(field: value, ...)` 형태의 생성자가 있으며, 이를 통해 모든 필드를 초기화할 수 있습니다. 지정되지 않은 필드는 기본값으로 채워집니다.
```nim
type
Person = object
name: string
age: int
var person1 = Person(name: "Peter", age: 30)
echo person1.name # "Peter"
echo person1.age # 30
var person2 = person1 # person1의 복사본 생성
person2.age += 14
echo person1.age # 30
echo person2.age # 44
# 필드 순서를 바꾸어도 무방함
let person3 = Person(age: 12, name: "Quentin")
# 모든 필드를 지정할 필요 없음
let person4 = Person(age: 3)
# 지정되지 않은 필드는 기본값으로 초기화됨
# 이 경우 name은 빈 문자열("")이 됨
doAssert person4.name == ""
```
객체 필드가 다른 모듈에서도 보이도록 하려면 `*`를 붙여야 합니다. 다른 언어의 export, public과 유사합니다.
```nim
type
Person* = object # 이 타입은 외부 모듈에서도 보임
name*: string # 이 필드는 외부 모듈에서도 접근 가능
age*: int
```
본 설명은 Nim 공식 문서(https://nim-lang.org/docs/tut1.html, Creative Commons Attribution 3.0) 및 코드 예제(MIT License)를 바탕으로 하였습니다.
'Programming Languages > Nim' 카테고리의 다른 글
| [Nim 언어 강좌] procedural, distinct type (0) | 2025.10.19 |
|---|---|
| [Nim 언어 강좌] 튜플, 참조형/포인터 타입 (0) | 2025.10.18 |
| [Nim 언어 강좌] Sequences, Open arrays, Varargs (0) | 2025.10.07 |
| [Nim 언어 강좌] set, array (0) | 2025.10.06 |
| [Nim 언어 강좌] Enum, ordinal types, subrange (0) | 2025.10.05 |