제로의영역

10.3 알아두면 삶이 윤택해지는 System.Array 본문

C#

10.3 알아두면 삶이 윤택해지는 System.Array

아이큐제로 2019. 8. 5. 17:08

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

.NET 프레임워크의 CTS(Common Type System)에서 배열은 System.Array 클래스에 대응.

 

예제) int 기반의 배열이 System.Array 형식에서 파생되었음을 보여줌.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _10._3
{
    class MainProgram
    {
        static void Main(string[] args)
        {
            int[] array = new int[] { 10, 20, 30, 7, 1 };
            Console.WriteLine("Type Of array:{0}", array.GetType());    // GetType(): 현재 인스턴스의 런타임형식(런타임시 생성되는 인스턴스 타입)을 가져오는 메서드
            Console.WriteLine("Base type Of array : {0}",array.GetType().BaseType);   //BaseType: 현재 Type이 직접 상속된 형식
        }
    }
}

출력결과

Type Of array:System.Int32[ ] -> GetType( )이 형식을 가져오는 메소드이기 때문에 System.32[ ]가 출력 
Base type Of array : System.Array ->GetType( ).BaseType이 GetType( )이 상속되는 형식(BaseType의 역할)을 가져오기 때문에 System.Array가 출력 

 

System.Array클래스에서 자주 사용되는 메소드와 프로퍼티

분류 이름 설명
정적 메소드 Sort( ) 배열을 정렬
BinarySearch<T>( ) 이진 탐색을 수행
IndexOf() 배열에서 찾고자 하는 특정 데이터의 인덱스를 반환
TrueForAll<T>( ) 배열의 모든 요소가 지정한 조건에 부합하는지의 여부를 반환
FindIndex<T>( ) 배열에서 지정한 조건에 부합하는 첫 번째 요소의 인덱스를 반환. IndexOf( )메소드가 특정 값을 찾는데 비해, FindIndex<T>( )메소드는 지정한 조건에 바탕하여 값을 찾음. 
Resize<T>( ) 배열의 크기를 재조정
 Clear( ) 배열의 모든 요소를 초기화. 배열이 숫자 형식 기반이면 0으로, 논리형식 기반이면 false로, 참조형식 기반이면 null로 초기화
ForEach<T>( ) 배열의 모든 요소에 대해 동일한 작업을 수행하게 함
인스턴스 메소드 GetLength( ) 배열에서 지정한 차원의 길이를 반환
프로퍼티 Length 배열의 길이를 반환
Rank 배열의 차원을 반환

<T>: 형식 매개 변수. 메소드를 호출 할 때는 배열의 기반 자료형을 매개 변수로 입력하면 컴파일러가 해당 형식에 맞춰 동작하도록 위 메소드들을 컴파일함.

 1. 용도: 출력을 희망하는 메소드가 코드가 같고 형식(int, float, string.. 등)만 다를 경우

 2. 사용법

   (1) 메소드 작성시 각기 다른 형식을 통합하여 < 형식 매개변수(임의의 문자) >로 작성

   (2) 출력할 때 < 출력 희망 형식(int, float, string.. 등) > 을 입력하면 원하는 형식의 데이터 출력 가능   

 

예제)

using System;

namespace _10._3
{
    class MainProgram
    {
        private static bool CheckPassed(int score) 
  //private: 클래스 내부에서만 접근이 가능한 한정자, static: 정적한정자. 클래스에 소속되도록 지정
        {
            if (score >= 60)
                return true;
            else
                return false;
        }

        private static void Print(int value)
        {
            Console.Write($"{value} ");
        }

        static void Main(string[] args)
        {
            int[] scores = new int[] { 80, 74, 81, 90, 34 };  			
            									//배열 초기화

            foreach (int score in scores)   
              //foreach: 배열을 순회하며 각 데이터 요소에 차례대로 접근
                Console.Write($"{score} ");
           									//80 74 81 90 34 출력
            Console.WriteLine();

            Array.Sort(scores); 		//Sort(): 배열 오름차순 정렬
            Array.ForEach<int>(scores, new Action<int>(Print)); 
            	/* ForEach<int>: int형식의 변수에 대해 동일한 작업 수행
          		Action<T>Delegate: 리턴값이 없는 함수에 사용되는 Delegate */
            Console.WriteLine();

            Console.WriteLine($"Number of dimensions:{scores.Rank}");   
         			//Rank: 배열의 차원을 반환, scores는 1차원 배열, 1출력

            Console.WriteLine("Binary Search:81is at{0}",  
        								//BinarySearch<int>: 이진 탐색 수행. 
                Array.BinarySearch<int>(scores, 81)); 
             								//scores에서 81의 위치를 찾아 표시
            Console.WriteLine("Liner Search:90 is at{0}", 
           								//LinerSearch<int>: 선형 탐색 수행
                Array.IndexOf(scores, 90));
               							//scores에서 90의 위치를 찾아 표시

            Console.WriteLine("Everyone passed?:{0}",
                Array.TrueForAll<int>(scores, CheckPassed)); 
         		/* TrueForAll: 배열의 모든 요소가 지정한 조건에 부합하는지 여부를 반환,
 			메소드는 배열과 함께 조건을 검사하는 메소드를 함께 매개변수로 받음.*/

            int index=Array.FindIndex<int>(scores, 
            	delegate(int score)
                {
                if (score < 60)
                    return true;
                else
                    return false;
            });			// index는 60보다 작은 변수(여기서는 34)를 가리킴
            /* FindIndex 메소드는 특정 조건에 부합하는 메소드를 매개 변수로 받음.
  				여기에선 익명 메소드로 구현.*/

            scores[index] = 61;						//index를 61로 수정
            Console.WriteLine("Everyone passed?:{0}",
                Array.TrueForAll<int>(scores, CheckPassed));    
                					//다시 TrueForAll 실행, true 출력    

            Console.WriteLine($"Old length of scores:{scores.GetLength(0)}");
            			//GetLength(): 배열에서 지정한 차원의 길이를 반환

            Array.Resize<int>(ref scores, 10);
            						//5였던 배열의 용량을 10으로 재조정

            Console.WriteLine($"New length of scores:{scores.Length}");
            								//Length: 배열의 길이를 반환

            Array.ForEach<int>(scores, new Action<int>(Print)); 
            Console.WriteLine();

            Array.Clear(scores, 3, 7);
            							/*Clear: 배열의 모든 요소를 초기화,
            			3번부터 7번까지의 배열을 초기화: 숫자는 0으로 초기화*/

            Array.ForEach<int>(scores, new Action<int>(Print));
            Console.WriteLine();
        }
    }
}

출력 결과:

80 74 81 90 34
34 74 80 81 90
Number of dimensions:1
Binary Search:81is at3
Liner Search:90is at4
Everyone passed?:False
Everyone passed?:True
Old length of scores:5
New length of scores:10
61 74 80 81 90 0 0 0 0 0
61 74 80 0 0 0 0 0 0 0