글로벌 객체지향 프로그래밍 7주차 - 배열
배열
일반 변수의 단점
- 한번에 1개의 값만 저장이 가능
-> 한번에 2개 이상의 값을 저장하기 위해서는 배열이 필요함
특징
- 동일 자료형의 값 여러 개를 저장 가능함
- int, char, float, 클래스 등 다양한 자료형을 사용 가능함
- 변수명 = 배열 이름
선언 방법
1) 초기화와 동시에 값 선언
1
자료형[] 배열명 = new 자료형[크기]{값1, ..., 값n}
2) 실행 전에 값 선언하기
1
자료형[] 배열명 = {값1, ..., 값n}
접근 방법
배열명[index]
- 배열은 new 연산자를 사용하며, new 클래스명()과 같은 형태
‘.’ 연산자로 속성과 메소드의 호출이 가능함
배열의 Index는 0부터 시작하며, 마지막 요소는 ‘배열명.length-1’임
System.Index, ^(캐럿) 1연산자를 사용시 더 쉽게 배열에 접근 가능
매개변수
메소드
정의
배열 타입을 매개변수로 지정함
1
접근제한자 반환타입 함수이름(배열타입[] 배열명) {} //배열 타입을 매개변수로 지정
호출
- 메소드이름(배열이름);
- 예시
1
2
3
4
5
6
7
8
9
10
11
public static void Main(string[] args)
{
void Func(int[] arr)
{
foreach(int i in arr)
Console.WriteLine(i);
}
int[] testArray = {1,2,3};
Func(testArray);
}
결과
1
2
3
1
2
3
반환형
선언부
- 반환형으로 배열 지정
1
접근제한자 배열타입[] 함수명(매개변수타입 매개변수명) {}
리턴
반환되는 배열의 타입과 일치하게 배열을 선언
1
배열타입[] 배열명 = 함수명();
값 호출 방식
Call by Reference
호출 받은 메소드에서 배열 값을 변경할 경우, 호출한 메소드에서도 변경된 값이 되게 하는 것
ref 키워드를 이용해 배열에 대한 참조를 전달함
- 주소를 다른 이름으로 공유함
예시 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
using System; class Program { static void ArrayIdxChange(ref char[] array, int originalIdx, int changeIdx) { char tempString = array[originalIdx]; array[originalIdx] = array[changeIdx]; array[changeIdx] = tempString; } static void Main(string[] args) { char[] testArr = { 'a', 'b', 'c', 'd', 'e' }; int originalIdx, changeIdx; Console.Write("바꿀 문자의 원본 위치는? >>"); originalIdx = Convert.ToInt32(Console.ReadLine()); Console.Write("선택한 문자와 바꿀 문자의 위치는? >>"); changeIdx = Convert.ToInt32(Console.ReadLine()); Console.Write("원본 배열>>"); foreach (char c in testArr) Console.Write(c); Console.WriteLine(); ArrayIdxChange(ref testArr, originalIdx, changeIdx); Console.Write("변경된 배열>>"); foreach (char c in testArr) Console.Write(c); } }
결과
1 2 3 4
바꿀 문자의 원본 위치는? >>1 선택한 문자와 바꿀 문자의 위치는? >>2 원본 배열>>abcde 변경된 배열>>acbde
Call by Value
관련 오류
1. IndexOutOfRangeException
배열에서 유효하지 않은 인덱스의 값에 접근하려 할 때 발생
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
using System; class Program { static void ArrayIdxChange(ref char[] array, int originalIdx, int changeIdx) { char tempString = array[originalIdx]; array[originalIdx] = array[changeIdx]; array[changeIdx] = tempString; } static void Main(string[] args) { char[] testArr = { 'a', 'b', 'c', 'd', 'e' }; ArrayIdxChange(ref testArr, 3, 6); Console.Write("변경된 배열>>"); foreach (char c in testArr) Console.Write(c); } }
오류 결과
1
System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
2. NullReferenceException
- 배열이나 배열의 요소가 지정되지 않은 상태에서 메소드나 속성에 접근하려고 할 때 발생
- 예시 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
using System; class Program { static void ArrayIdxChange(ref char[] array, int originalIdx, int changeIdx) { char tempString = array[originalIdx]; array[originalIdx] = array[changeIdx]; array[changeIdx] = tempString; } static void Main(string[] args) { char[] testArr = null; ArrayIdxChange(ref testArr, 3, 6); Console.Write("변경된 배열>>"); foreach (char c in testArr) Console.Write(c); } }
오류 결과
1
System.NullReferenceException: 'Object reference not set to an instance of an object.'
3. ArgumentException
- 배열 초기화 할 때 혹은, 메소드에 잘못된 인수를 전달 시 발생
4. ArrayTypeMismatchException
- 배열의 형식을 잘못 된 방식으로 변경하려 할 때 발생
Array 클래스
정의
배열을 만들고, 조작, 검색 및 정렬해 공용 언어 런타임에 모든 배열의 기본 클래스 역할을 수행 가능하도록 하는 메소드 제공2
속성
| 이름 | 의미 |
|---|---|
| IsFixedSize | Array의 크기가 고정되었는지 값을 가져옴 |
| IsReadyOnly | Array가 읽기 전용인지 값을 가져옴 |
| IsSynchronized | Array에 대한 엑세스가 동기화 되어 스레드로 부터 안전한지 값을 가져옴 |
| Length | Array의 크기 값을 가져옴 |
| LongLength | Array의 모든 차원에 있는 요소의 총 수를 나타내는 64비트 정수를 가져옴 |
| MaxLength | 배열에 포함 가능한 최대 요소 수를 가져옴 |
| Rank | Array의 차원 수를 반환함 Ex) 1차원 : 1 2차원: 2 |
| SyncRoot | Array에 대한 엑세스를 동기화 하는데 이용 가능한 개체를 가져옴 |
| 메소드 명 | 의미 |
|---|---|
| Clear(Array) | 배열의 각 내용을 삭제 |
| Clear(Array, Int32, Int32) | 배열의 각 요소의 형식의 기본 값으로 배열의 크기를 설정함 |
| Clone() | 배열의 부분 복사본을 생성 |
| ConstrainedCopy(Array, Int32, Array, Int32, Int32) | 배열의 범위를 지정한 인덱스부터 복사해, 지정된 대상 인덱스로부터 시작하는 다른 배열에 붙여넣기 함 |
| ConvertAll<TInput, TOutput>(TInput[], Converter<TInput, TOutput>) | 선택한 배열을 다른 형식의 배열로 변환함 |
| Copy(Array, Array, Int32) | 배열을 크기를 첫 요소부터 복사해, 다른 배열에 첫번째 값부터 붙여넣기 함 32비트의 정수로 길이가 지정됨 |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.