Section 20.10: 배열 공변성 (covariance)

string[] strings = new[] {"foo", "bar"}; object[] objects = strings; // string[] 에서 object[] 로의 묵시적 (implicit) 변환

이러한 변환은 type-safe 하지 않다. 다음 코드는 런타임 예외를 발생시킬 것이다:

string[] strings = new[] {"Foo"}; object[] objects = strings; objects[0] = new object(); // runtime 예외 발생, object 는 string 이 아니다 string str = strings[0]; // 이전 대입문이 예외를 발생시키지 않고 실행되었다면 여기서 문제가 발생했을 것이다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.9: 가변 배열 (Jagged array)

가변 배열 (Jagged array) 은 기본 형식 타입 (primitive type) 대신에, 다른 배열 (혹은 컬렉션) 들을 갖는 배열을 의미한다. 어떤 의미에서는 이는 배열 각 요소에 다른 배열이 포함된, "배열의 배열" 로도 생각할 수 있다.

이들은 기본적으로 다차원 배열과도 유사하지만, 작은 차이점이 있다 - 다차원 배열의 경우에는 미리 정해진 수의 행과 열을 가질 수 밖에 없으나, 가변 배열에서는 모든 행 (row) 은 각각 다른 갯수의 열 (column) 을 가질 수 있게 된다.

가변 배열 선언하기

8 개의 행을 갖는 가변 배열을 선언하는 예제는 다음과 같다:

int[][] a = new int[8][];

두번째 [] 는 숫자가 주어지지 않은 상태에서 초기화 된다. 하위 배열들까지 모두 초기화를 하고자 한다면, 별도의 초기화를 수행해 주어야 한다:

for (int i = 0; i < a.length; i++) { a[i] = new int[10]; }

값을 쓰고 읽기

하위 배열 중 하나를 읽는 작업은 간단하다. a 의 세번째 행 내의 모든 숫자를 출력하는 다음 예제를 확인한다:

for (int i = 0; i < a[2].length; i++) { Console.WriteLine(a[2][i]); }

특정 값을 읽기:

a[<행 번호>][<열 번호>]

특정 값 쓰기:

a[<행 번호>][<열 번호>] = <값>

유념할 점: 거의 모든 경우에, 가변 배열 (배열의 배열) 을 사용하는 것이 다차원 배열 (행렬) 을 사용하는 것보다 권장된다. 속도 면에서도 빠르며 더욱 안전하다.

중괄호들의 순서에 대한 주의점

int 형식의, 하나의 배열로 이루어진 다섯개의 배열들을 갖는 세개의 배열을 나타내는 3차원 배열이 있다고 가정해 보자. 이를 C# 에서 다음과 같이 작성할 수 있다:

int[,,][,,,,][] arr = new int[8, 10, 12][,,,,][];

CLR 타입 시스템에서는, 이 중괄호들의 표현 순서가 뒤바뀌게 되어, 위에서 선언한 arr 인스턴스는 아래와 같이 표현된다:

arr.GetType().ToString() == "System.Int32[][,,,,][,,]";

마찬가지로 다음의 예제도 확인한다:

typeof(int[,,][,,,,][]).ToString() == "System.Int32[][,,,,][,,]"
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.8: 순차열 (sequentual) 숫자들로 이루어진 배열 생성하기

LINQ 는 순차열 (sequential) 숫자들로 채워진 컬렉션을 손쉽게 생성할 수 있는 메소드를 제공한다. 예를 들어, 사용자는 1 과 100 사이의 정수들로 채워진 배열을 선언할 수 있다.

Enumerable.Range 메소드는 특정 시작 값으로부터 일정 갯수의 요소들로 이루어진 정수들의 순차열을 생성해준다.

이 메소드는 시작 값과 생성할 요소들의 갯수를 나타내는 두개의 인자를 받는다.

Enumerable.Range(int start, int count)

count 는 음수가 될 수 없음을 유의한다.

사용 예제:

int[] sequence = Enumerable.Range(1, 100).ToArray();

위 예제는 숫자 1 부터 100 까지의 숫자들로 이루어진 배열을 생성해 줄 것이다 ([1, 2, 3, ..., 98, 99, 100]).

Range 메소드가 IEnumerable<int> 타입을 반환하기 때문에, 사용자는 또다른 LINQ 메소드를 이 반환값에 대해 수행할 수 있다:

int[] squares = Enumerable.Range(2, 10).Select(x => x * x).ToArray();

위 예제는 4 부터 시작하는 10 개의 정수 제곱 값들로 채워진 배열을 생성해 줄 것이다 : [4, 9, 16, ..., 100, 121].

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.7: 배열에 대해 요소 반복 (iterate) 수행하기

int[] arr = new int[] { 1, 6, 3, 3, 9 }; for (int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); }

foreach 문을 사용하는 예제:

foreach (int element in arr) { Console.WriteLine(element); }

포인터를 사용하여 안전하지 않은 (unsafe) 접근을 수행하는 예제 ( MSDN 참고)

unsafe { int length = arr.Length; fixed(int * p = arr) { int * pInt = p; while (length-- > 0) { Console.WriteLine( * pInt); pInt++; // 다음 요소를 가리키도록 포인터를 이동시킨다 } } }

Output:

1 6 3 3 9
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.6: 배열 요소의 값을 얻어오거나 할당하기

int[] arr = new int[] { 0, 10, 20, 30}; // 값 얻어오기 Console.WriteLine(arr[2]); // 20 // 값 할당하기 arr[2] = 100; // 갱신된 값 얻어오기 Console.WriteLine(arr[2]); // 100
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.5: 다차원 배열

배열은 하나 이상의 차원을 가질 수 있다. 아래 예제는 10 개의 행과 10 개의 열을 가지는 2차원 배열을 생성한다:

int[,] arr = new int[10, 10];

3차원 배열의 예제:

int[,,] arr = new int[10, 10, 10];

이러한 배열 역시 선언과 동시에 초기화를 수행할 수 있다:

int[,] arr = new int[4, 2] { {1, 1}, {2, 2}, {3, 3}, {4, 4} }; // 다차원 배열의 요소 접근하기: Console.Out.WriteLine(arr[3, 1]); // 4
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.4: 두개의 배열이 동등한지 (equality) 비교하기

LINQ 는 두개의 IEnumerable 이 동등한지 (equality) 를 확인할 수 있는 내장 함수를 제공하고 있으며, 이 함수는 배열에 대해서도 사용할 수 있다.

제공되는 SequenceEqual 함수는 두 배열이 같은 길이를 가지며 모든 동일 인덱스에 대해 동일한 값을 가지는 경우 true 를, 그렇지 않은 경우에는 false 를 반환한다.

int[] arr1 = { 3, 5, 7 }; int[] arr2 = { 3, 5, 7 }; bool result = arr1.SequenceEqual(arr2); Console.WriteLine("Arrays equal? {0}", result);

위 코드의 출력 결과는 다음과 같다:

Arrays equal? True
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 20.3: 배열 복사하기

static 메소드인 Array.Copy() 를 통해 배열의 일정 부분을 원본 (source) 과 대상 (destination) 모두에 대해 인덱스 값 0 을 사용하여 복사하기:

var sourceArray = new int[] { 11, 12, 3, 5, 2, 9, 28, 17 }; var destinationArray= new int[3]; Array.Copy(sourceArray, destinationArray, 3); // destinationArray 는 11,12 그리고 3 의 값을 갖게 된다

instance 메소드인 CopyTo() 를 통해 배열 전체를 원본 (source) 인덱스 값 0 과 주어진 대상 (destination) 인덱스 값을 사용하여 복사하기:

var sourceArray = new int[] { 11, 12, 7 }; var destinationArray = new int[6]; sourceArray.CopyTo(destinationArray, 2); // destinationArray 는 0, 0, 11, 12, 7 그리고 0의 값을 갖게 된다

Clone 은 배열 객체의 사본을 생성할 때 사용된다.

var sourceArray = new int[] { 11, 12, 7 }; var destinationArray = (int)sourceArray.Clone(); // destinationArray 가 생성되고 값은 11,12,17 을 갖게 된다.

CopyToClone 메소드는 각 요소가 원본 (original) 배열의 요소들과 동일한 객체를 참조하게 되는 얕은 복사 (shallow copy) 를 수행하게 된다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts