본문 바로가기
Programming/C#

c#_8 : 배열과 컬렉션 그리고 인덱서

by 공부합시다홍아 2020. 6. 10.

프로그램을 작성하다 보면 같은 성격을 띤 다수의 데이터를 한 번에 다뤄야하는 경우가 자주 생긴다. 
데이터를 다루기 위해서는 데이터를 담는 변수가 필요합니다. 

배열

배열의 각 요소에 데이터를 저장하거나, 요소 안에 있는 데이터를 읽어올 때에는 배열 이름 뒤에 괄호 [ ] 를 붙여주고,
괄호 사이에 인덱스(Index)를 적어주면 된다. 
- 여기서 주의 할 점은 바로 인덱스 1이 아닌 0부터 시작한다는 것이다. 

배열은 for문이나 foreach문을 이용해서 변수를 이용하는 경우에 비해 코드를 훨씬 간결하게 만들 수 있습니다. 
- 프로그램에 변경 사항이 생겼을 때 배열을 이용한 쪽이 코드 관리가 훨씬 용이함

배열을 초기화하는 세 가지 방법

첫 번째 방법 : 배열의 원소 개수를 명시하고, 그 뒤에 괄호 { }로 둘러싸인 블록을 붙인 뒤, 블록 사이에 배열의 각 원소                       에 입력 될 데이터를 입력한다. 이렇게 배열 객체를 초기화하는 {}블록을 일컬어 컬렉션 추기자라고 한다.

두 번째 방법 : 배열의 용량을 생략하는 것이다. 

세 번째 방법 : new 연산자, 형식과 괄호 [ ], 배열의 용량을 모두 생략한 채 코드 블록 사이에 배열의 각 원소에 할당                         할 데이터를 넣어주면 된다.

 

System.Array

정적메소드 
Sort()  : 배열을 정렬합니다.
BinarySearch<>() : 이진 탐색을 수행한다.
IndexOf() : 배열에서 찾고자 하는 특정 데이터의 인덱스를 반환한다.
TrueForAll<>() : 배열의 모든 요소가 지정한 조건에 부합하는지의 여부를 반환한다.
FindIndex<>() : 배열에서 지정한 조건에 부합하는 첫 번쨰 요소의 인덱스를 반환한다.
Resize<>() : 배열의 크기를 재정합니다. 
Clear() : 배열의 모든 요소를 초기화합니다. 배열이 숫자 형식 기반이면 0으로, 논리 형식 기반이면 false로, 참조 형                    식 기반이면 null로 초기화
ForEach<>() : 배열의 모든 요소에 대해 동일한 작업을 수행하게 합니다.

인스턴스 메소드
GetLength() : 배열에서 지정한 차원의 길이를 반환합니다. 다차원배열에서 유용하다.

프로퍼티
Length : 배열의 길이를 반환한다.
Rank    : 배열의 차원을 반환한다. 

 

2차원 배열

2차원 배열은 2개의 차원(세로+가로)으로 원소를 배치하는 것입니다.
다른 말로 말하자면 1차원 배열을 원소로 갖는 배열이라고 할 수 있습니다. 

2차원 배열의 선언하는 방법은 기본적으로 1차원 배열과 선언 형식이 같지만 각 차원의 용량 또는 길이를 콤마( , )로 구분해서 [ ]사이에 입력해준다는 점이 다릅니다.

1차원 배열 : int[] arr = new int arr[5];
2차원 배열 : int[,] arr = new int arr[5.5];

데이터형식[ , ] 배열 이름 = new 데이터 형식 [ 2차원길이, 1차원 길이 ];

int [ 2,3 ] 은 기반 형식이 int이며 길이는 3인 1차원 배열을 원소 2개 갖고 있는 2차원 배열이라고 읽습니다.

2차원 배열의 원소에 접근할 때는 첫 번째 차원과 두 번째 차원의 인덱스를  [ ]괄호 사이에 같이 입력해야한다. 
2차원 배열을 선언과 동시에 초기화하고 싶다면, 앞에서 설명했던 1차원 배열의 세 가지 초기화 방법을 같은 형태로 사용할 수 있습니다.

 

가변 배열 

앞서 2차원배열이나 3차원배열 같은 다차원 배열을 "배열을 요소로 갖는 배열"이라고 설명했는데, 사실 진정한 의미에서의 배열을 요소로 갖는 배열은 '가변 배열'이다.
가변 배열은 다양한 길이의 배열을 요소로 가지는 다차원 배열로 이용될 수 있다. 우리는 2차원 배열의 요소에 접근할 때 반드시 첨자 두 개를 사용해야 했다. 하나만 사용해서 1차원 배열에 접근한다거나 하는 일은 불가능하다.

가변 배열은 이러한 다차원 배열과는 달리 배열을 요소로써 접근할 수 있다.

가변 배열의 선언

데이터형식[][] 배열이름 = new 데이터형식[가변 배열의 용량][ ];

 

ArrayList 

ArrayList는 가장 배열과 닮은 컬렉션이라 할 수 있다.
컬렉션의 요소에 접근할 때는  [ ]연산자를 이용하고, 특정 위치에 있는 요소에 데이터를 임의로 할당할 수도 있습니다.
한편, 배열과는 달리 컬렉션을 생성할 때 용량을 미리 지정할 필요가 없이 필요에 따라 자동으로 그 용량이 늘어나거나 줄어든다.

- ArrayList에서 가장 중요한 메소드 Add(), RemoveAt(), Insert(), 이렇게 세 개입니다.
ADD()메소드 : 컬렉션의 가장 마지막에 있는 요소 뒤에 새 요소를 추가
RemoveAt() 메소드 : 특정 인덱스에 있는 요소를 제거합니다. 
Insert() : 원하는 위치에 새 요소를 삽입합니다. 

- ArrayList를 이용한 구구단

 

Queue 

Queue는 대기열, 즉 기다리는 줄이라는 뜻이다. Queue 자료구조는 데이터나 작업을 차례대로 입력해뒀다가 입력된 순서대로 하나씩 꺼내 처리하기 위해 사용된다.
배열이나 리스트가 원하는 위치에 자유롭게 접근하는 반면에 Queue는 입력은 오직 뒤에서, 출력은 앞에서만 이루어집니다.

 

Stack

Stack은 Queue와는 반대로 먼저 들어온 데이터가 나중에 나가고(First In - Last Out), 나중에 들어온 데이터는 먼저 나가는 (Last In - First Out)구조의 컬렉션입니다. 

stack에 데이터 삽입 시에는 Push()메소드를 이용하고, 데이터를 꺼낼 때는 POP()메소드를 이용한다.
Push() 메소드는 테이블 위에 "쌓는다"를 뜻합니다.
Pop() 메소드는 제일 위에 쌓여있는 데이터를 꺼냅니다. 

Pop을 이용하여 데이터를 호출하고 그 데이터는 컬렉션에서 제거가 디고 그 아래에 있던 데이터가 제일 위로 올라간다.

 

Hashtable

Hashtable은 "키"와 "값"의 쌍으로 이루어진 데이터를 다루 때 사용합니다.
Hashtable은 탐색 속도가 빠르고, 사용하기도 편하다. 배열과 다른점은 데이터를 저장할 요소의 위치로 인덱스를 사용하는 반면에, Hashtable 컬렉션은 키 데이터를 그대로 사용하고, 키를 이용해 단번에 데이터가 저장되어 있는 컬렉션 내의 주소를 계산한다.  이 작업을 해싱(Hashing)이라고 하는데 Hashtable의 이름은 이 알고리즘에서 유래한 것이다.

 

컬렉션을 초기화하는 방법

ArrayList, Queue, Stack은 배열의 도움을 받아 간단하게 초기화를 수행할 수 있습니다. 이들 컬렉션의 생성자를 호출할 때 매개변수로 배열 객체를 넘기면 컬렉션 객체는 해당 배열을 바탕으로 내부 데이터를 채웁니다. 

728x90

'Programming > C#' 카테고리의 다른 글

c#_10 : 인덱서와 예외처리  (0) 2020.06.11
c#_9 : Oracle과 C# 연동 방법과 선언  (0) 2020.06.10
c# _7 : 프로퍼티  (0) 2020.06.10
C# _6  (0) 2020.06.09
C# _ 5  (0) 2020.06.08