안녕하세요. 박민성입니다. ☺️
오늘은 C#의 ^와 ..에 대해서 글을 쓰고자 합니다. 🤔
최근 Unity에 대해서 글을 많이 썼는데여 오늘으 C# 문법으로 돌아오게 되었습니다.
^와 ..은 인덱스을 사용할때 유용하게 사용될 듯 싶어서 글로 남기고자 합니다.
1. 기존 인덱스 접근 방식
int[] numbers = { 10, 20, 30, 40, 50 };
int last = numbers[numbers.Length - 1];
저는 배열의 마지막 요소에 접근하려면 보통 이렇게 했습니다.
배열 길이가 5라면 Length는 5고 마지막 인덱스가 4이니 Length - 1를 사용하면 마지막 원소를 뽑을 수 있습니다.
2. ^ 인덱스란?
int[] numbers = { 10, 20, 30, 40, 50 };
int last = numbers[^1]; // 50
int secondLast = numbers[^2]; // 40
^는 뒤에서부터 몇 번째 요소인지 나타내는 인덱스 문법입니다.
numbers[numbers.Length - 1] 기존 방식과 비교하면 numbers[^1]으로 더 짧게 쓸 수가 있습니다.
여기서 중요한 점은 ^0이 마지막 요소가 아닌 ^1이 마지막 요소인 것입니다.
뒤에서부터 세는 인덱스 개념이 아닌 N번째 느낌이라서 ^0이 마지막 요소가 아닌 ^1이 마지막 요소인 것입니다.
만약 ^0을 사용하게 된다면 배열의 끝 바로 다음 위치를 의미하기 때문에 사용할 수 없습니다.
int val = numbers[^0]; // IndexOutOfRangeException
사용하면 IndexOutOfRangeException 오류가 납니다.
3. .. 범위란?
int[] numbers = { 10, 20, 30, 40, 50 };
int[] part = numbers[1..4]; // 20, 30, 40
..는 배열이나 문자열에서 특정 구간을 선택하는 Range 문법입니다.
Range가 그렇듯이 ..도 시작은 값은 포함하고 끝 값은 제외합니다.
그래서 1..4는 인덱스 1부터 인덱스 4 앞까지 이라는 말입니다.
이러한 방식을 끝 인덱스 제외(exclusive end)이라고 합니다.
그리고 시작 인덱스 값이나 끝을 생략할 수도 있습니다.
int[] first = numbers[..3]; // 10, 20, 30
처음부터 인덱스 3 앞까지라는 의미입니다.
int[] last = numbers[2..]; // 30, 40, 50
인덱스 2부터 끝까지입니다.
int[] copy = numbers[..]; // 10, 20, 30, 40, 50
이렇게 전체 배열을 복사할 수도 있습니다.
4. ^와 ..를 같이 사용하기
int[] numbers = { 10, 20, 30, 40, 50 };
int[] part = numbers[1..^1];
인덱스 1부터 뒤에서 첫 번째 위치 직전까지입니다.
예를 들어 마지막 두 개만 가져오고 싶다면
int[] part = numbers[^2..];
이런식으로 사용할 수 있습니다.
5. ^와 ..는 실제로 타입이 있습니다.
Index index = ^1;
^는 내부적으로 System.Index와 연결되고
Range range = 1..4;
그리고 ..는 System.Range와 연결됩니다.
즉 ^와 ..은 System.Index와 System.Range를 편리하게 사용하기 위한 문법인 것입니다.
Index index = new Index(1, fromEnd: true);
Index index = ^1; // 둘이 똑같음
개념적으로 같은 의미를 뜻합니다.
오늘은 C#에 ^와 ..에 대해서 알아보았는데요~!
배열뿐만 아니라 string에서도 사용할 수 있기 때문에 알고리즘을 풀 때에도 유용하게 사용할 수 있을 것 같습니다.
그리고 모든 배열이 그렇듯이 배열이 생성되면 메모리가 할당되고 GC가 일을 해야 하기 때문에 Update나 그런 반복문에서는 사용을 피하는 것이 좋을 것 같습니다.
오늘의 노래 추천은
QUEEN - I We Are The Champions 이라는 곡입니다.
힘을 많이 받는 곡입니다.
But I've come through~!
내일은 더욱 좋은 글을 써보도록 노력하겠습니다.
봐주셔서 감사합니다. ☺️