#. 들어가기 전에.
C#에 대해 공부를 하고 설명하는데 있어서 설명의 레벨을 [프로그램을 처음 다뤄보신 분]으로 작성하자 하면 정말 자세한 설명이 될 것입니다. 그러한 레벨로써는 이미 많은 다른 사이트에서 양질의 설명을 갖고 있고, 제가 그 이상 더 멋지고 이해하기 쉽게 설명드릴 자신은 없습니다.
다른 글들과의 차별성을 갖기 위해, 그리고 저도 설명하는데 쉽게하기 위해서 설명대상의 레벨을 [약간이나마 자바를 다뤄보신 분]으로 설정하고 설명하도록 하겠습니다.
1. 배 열(Array)
C#에서의 배열은 자바의 그것과 동일하다고 해도 과언이 아니라 생각합니다.(내부적으로는 다를 수도 있겠지만..)
C부터 시작해서 이쪽계열의 프로그래밍 언어에서와 같이,
1. 같은 데이터 형식의 시리얼한 구조체입니다.
2. 역시 0부터 인덱스는 시작하며 한번 결정되어진 사이즈는 변경되어지지 않습니다. 물론 다른 크기의 배열을 생성후 그 배열에 현재의 배열내용을 카피하고 해당 변수에 할당할 수 있겠습니다만, 현재의 배열과 생성된 배열은 별개의 배열이지요.(아시는 내용이시겠지만..)
인덱스의 처리나, 사이즈의 변경이 불가능하다는 단점이 여타의 다른 컬렉션 클래스에 비해서 불편하다고도 할 수 있겠지만, 수행속도 면에서 이점을 얻고자 하거나 혹은 명확한 레코드의 갯수를 가지고 정교하게 관리를 하여야 할 경우, 사용되어 집니다. (사실 컬렉션에서의 내부처리도 결국 배열일 것입니다. 이 점은 C#의 내부 소스를 확인하지 않았지만, 자바 소스상에서는 확인했던 것이고, 자신을 가지고 말씀드릴수 있습니다.)
배열의 선언은
type[] arrayName;
으로 선언 합니다.
배열의 할당도
arrayName = new type[length];
입니다. (참 설명이 쉽군요... 자바 아시는 분들에게 설명을 드리니.. -ㅅ-;)
역시 선언과 동시에 초기화도 가능합니다!
String [] kh2team_man = {"choikj", "shimsb", "kimhj", "hanes", "songth"};
그러나! 다차원 배열에서 제가 못봤던 구문들이 있었습니다. (내가 무식했던 걸지도..)
String[,] kh2team;
저기 [] 사이에 ,이 보이십니까? 이건 2차원 배열의 선언입니다.
3차원 배열일 경우? String[,,]이고 4차원은 String[,,,]이고... 그만하겠습니다.
역시 선언과 동시에초기화 가능합니다.
int[, ,] cube = { { { 1, 2, 3 }, { 1, 2, 0} }, { { 0, 1, 2 }, { 3, 4, 6 } }, { { 5, 6, 7 }, { 9, 10, 11 } } };
잠시.. 위의 예문에서 cube[0,1,0]에 해당하는 값은 무엇일까요?
이건 저도 가로가 먼전가 세로가 먼전가, 가끔씩 헷갈리는 부분이라 잠시 소스프로그램을 작성해보겠습니다.
using System;
namespace ConsoleApplication1
{
class CubeArrayTest
{
static void Main(string[] args)
{
int[, ,] cube = { { { 1, 2, 3 }, { 1, 2, 0} }, { { 0, 1, 2 }, { 3, 4, 6 } }, { { 5, 6, 7 }, { 9, 10, 11 } } };
for (int i = 0; i < cube.GetLength(0); i++) {
for (int j = 0; j < cube.GetLength(1); j++)
{
for (int k = 0; k < cube.GetLength(2); k++)
{
Console.WriteLine("element[{0}, {1}, {2}] = {3}", i, j, k, cube[i, j, k]);
}
}
}
}
}
이 소스 작성하면서 System.OutOfRangeException이 몇번 나오더군요. (뻘쭘;)
참조 불가능한 인덱스의 값을 취득, 혹은 할당하고자 할 경우 System.OutOfRangeException이 발생한답니다.
어쨋든 위 소스는 정상 작동하였고 결과로
를 내뱉었습니다.
답은 1이군요. 간단하게 앞의 숫자는 밖의 브레이스와 매치되는 군요. 다음으로..
자바를 하신 분이시라면 위의 소스에서 다른 것을 두군데 찾을수 있습니다.
일단 GetLength메쏘드. 이것은 System.Array에 정의되어 있으며 차원의 길이를 반환합니다. (자바의 length와 같은..) 인자값으로는 배열의 깊이입니다. 따라서 String[,,] strs의 두번째 깊이를 알기 위해서는 strs.getLength(1)이 됩니다.
두번째로 저번 설명에도 나왔던 Console.WriteLine()입니다.
이는 c언어의 printf와 비슷합니다.
WriteLine("출력문", 인자1, 인자2. ...);
입니다. 인자1, 인자2는 출력문 안에 있는 {0}, {1}부분이 replace되어 출력되어집니다.
다차원 배열의 선언을 [,]의 형식으로 할수 있는가 하면 많이 보아왔던 [][]의 선언도 가능합니다.
개인적으로는 이쪽이 친근한지라 이쪽을 많이 쓸것 같군요.
자바의 배열이 java.Array를 상속받듯, C#에서의 배열도 System.Array를 상속받습니다.
그렇다면 System.Array의 몇몇 메쏘드를 알아봐야겠지요.
Rank() : 배열의 차원값을 반환합니다.
Reverse() : 요소의 순서를 바꿉니다.
Sort() : 정렬합니다! (이것 참 유용하게 쓰일 듯 합니다.)
Clear() : 초기화 합니다. (프리미티브 타입은 0으로, 레퍼런스 타입은 null로)
IndexOf() : 인자와 일치하는 첫번째 인덱스를 반환합니다.
LastIndexOf() : 인자와 일치하는 마지막 인덱스를 반환합니다.
이 외에도 몇가지 더 있습니다만, 이러한 글은 MSDN이 더 정확하고 자세하므로
이곳 msdn을 참조하시기 바랍니다.
써먹는 일은 다른 컬렉션에 비해 떨어진다 하겠지만 배열은 컬렉션의 기본이 되는 구조이므로 잘 숙지하여 두실 필요가 있다고 생각합니다. 컬렉션도 뒤져보면 결국 배열이니까요.
배열쪽에 대해서는 기본적 프로그래밍 문법 + MSDN + 약간의 실습이면 크게 문제가 되지 않으리라 생각합니다.
그럼 간단하게 마치도록 하겠습니다.
틀린점 지적해주시면 파판 포션 한병 사드립니다. 200엔짜리로! -_-;
감사합니다.
'[ Program ] > C#' 카테고리의 다른 글
Event Handler를 활성화 하는 Feature 생성하기 (sharepoint 2007) (0) | 2012.09.17 |
---|---|
C# 싱글톤 패턴 예제 (0) | 2012.09.17 |
【 C# 】 컬렉션의 기본 인터페이스_# (0) | 2012.09.17 |
IEnumerable 과 IEnumerator 인터페이스 (0) | 2012.09.17 |
IEnumerator, IEnumerable (0) | 2012.09.17 |
댓글