" /> 글로벌 객체지향 프로그래밍 7주차 - 배열 | BlackWerf's Blog
포스트

글로벌 객체지향 프로그래밍 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


속성

이름의미
IsFixedSizeArray의 크기가 고정되었는지 값을 가져옴
IsReadyOnlyArray가 읽기 전용인지 값을 가져옴
IsSynchronizedArray에 대한 엑세스가 동기화 되어 스레드로 부터 안전한지 값을 가져옴
LengthArray의 크기 값을 가져옴
LongLengthArray의 모든 차원에 있는 요소의 총 수를 나타내는 64비트 정수를 가져옴
MaxLength배열에 포함 가능한 최대 요소 수를 가져옴
RankArray의 차원 수를 반환함
Ex) 1차원 : 1
2차원: 2
SyncRootArray에 대한 엑세스를 동기화 하는데 이용 가능한 개체를 가져옴


메소드 명의미
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비트의 정수로 길이가 지정됨
  1. 컬렉션의 마지막 순서부터 역순으로 인덱스 지정이 가능함 

  2. https://learn.microsoft.com/ko-kr/dotnet/api/system.array?view=net-7.0 

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.