본문 바로가기
C# 기초문법

[C#] (6) 배열 알아보기 - array, list

by novices 2022. 9. 11.
반응형

배열은 단순하게 이야기해서 같은 형태를 가지는 변수의 묶음을 뜻합니다. 예를 들어 로또번호의 7자리는 정수 형태의 배열로 표현하기 적합하다고 할 수 있습니다. 이전 시간에도 이야기했듯이 배열은 반복문과 함께 쓰이는 경우가 많은데 이번 포스팅에서는 먼저 배열의 문법과 특징을 알아보고 이어서 반복문과 함께 사용하는 코드를 작성해보겠습니다.

 

 

1. 배열의 문법

배열의 선언 방법은 데이터 형태[], 변수명, 테이터 형태의 길이로 표현됩니다. 접근방법은 배열의 인덱스로 각 데이터에 접근할 수 있으며 변수와 동일하게 각 변수의 값은 변경할 수 있습니다.  일반 변수와 배열을 비교하면서 배열의 선언 방법과 값 할당 방법을 알아보겠습니다.

 

1.1 배열 선언 하기

아래 코드는 정수 형태의 값을 7개 저장할 수 있는 배열을 numbers라는 이름으로 선언하는 내용입니다.

int[] numbers = new int[7];

 아래는 비교를 위해 일반 정수 변수를 7개 선언 방법입니다. 

int number1, number2, number3, number4, number5, number6, number7;

두 가지 방법을 비교해 보면 어떤 게 더 편한지 이야기할 것도 없습니다. 예시에서 보시는 7개의 정수는 일일이 선언해도 큰 차이가 없지만 만약 정수가 100개라면 엄청난 차이가 있습니다.

 

 

1.2 배열에 값 할당 하기

아래 코드는 선언된 배열에 값을 할당하는 코드입니다. 각 정수 값에 인덱스 넘버를 이용해 할당하는데 인덱스 넘버는 0부터 시작됩니다. 예시에서 7개의 정수배열을 선언했으니 사용 가능한 인덱스 번호는 0부터 6까지 7개의 인덱스입니다.

numbers[0] = 0;
numbers[1] = 1;
numbers[2] = 2;
numbers[3] = 3;
numbers[4] = 4;
numbers[5] = 5;
numbers[6] = 6;

아래는 비교를 위한 일반 정수 변수의 값 할당 방법입니다.

number1 = 0;
number2 = 1;
number3 = 2;
number4 = 3;
number5 = 4;
number6 = 5;
number7 = 6;

두 가지 값 할당 방법은 차이가 없습니다. 선언부와 마찬가지로 몇 개 안 되는 변수는 일일이 할당 가능하지만 변수의 수가 많은 경우 입력 자체가 고통입니다. 이런 경우 효율적인 값 할당을 위해 이전 시간에 배운 반복문을 배열과 함께 사용합니다.

 

1.3 반복문을 사용하여 값 할당하기

아래는 (4) 조건을 기준으로 반복시키기 에서 배운 for문을 사용해서 값을 입력하는 코드입니다.

int[] numbers = new int[7];

// 선언된 배열에 .Length는 배열의 길이값 입니다.
// 여기서 numbers는 길이가 7로 선언되었기 때문에
// numbers.Length는 7로 치환하여 해석하면 됩니다.

for(int i=0; i < numbers.Length; i++)
{
	numbers[i] = i;
}

numbers.Length가 7로 치환되어 위의 for문은 아래의 코드와 100% 동일한 코드입니다.

int[] numbers = new int[7];

for(int i=0; i < 7; i++)
{
	numbers[i] = i;
}

코드는 i변수가 0부터 반복하여 6이 될 때까지 총 7회 반복되며 매번 명령 블록 내에서 배열의 0부터 6번 인덱스에 접근해서 i 값을 할당합니다.

 

1.4 배열 선언과 동시에 값 할당하기

아래는 배열의 선언과 동시에 값을 할당하는 코드입니다.  for 반복문에서는 각인 덱스에 접근해서 할당된 값을 출력합니다.

int[] numbers = new int[] {0, 1, 2, 3, 4, 5, 6};

for(int i=0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}

 

배열 문법 요약

  • 배열의 선언할 때 데이터 형태에 [] 기호를 추가합니다.
  • 배열의 길이는 new 키워드를 사용해 길이를 명시합니다.
  • 배열 변수는 배열 변수 이름에 [인덱스 번호]로 접근 가능합니다.
  • 배열은 선언과 동시에 값을 할당할 수 있습니다.
  • 배열은 반복문과 같이 사용할 때 효율적입니다.

 

 

2. 리스트

이제 배열의 개념에 추가로 리스트에 대한 내용을 알아보겠습니다. 배열과 리스트의 메모리 구조는 내부적으로 복잡하지만 차이점을 작동 관점에서 단순하게 이야기해서 배열은 길이가 예측이 가능할 때 사용하고 리스트는 불가능할 때 사용합니다.  배열은 선언할 때 길이를 정하지만 리스트는 배열과는 다르게 데이터의 길이를 가변적으로 사용할 수 있는 것이 가장 큰 특징이자 차이점입니다. 여기서는 리스트의 간략한 기능만 설명하고 자세한 내용은 다음 포스팅인 함수 설명에 추가하여 설명하겠습니다.

 

2.1 리스트 선언하기

일단 List를 사용하기 위해서는 using System.Collections.Generic; 구문으로 네이스 페이스를 추가해야 합니다. 

using System;
using System.Collections.Generic;

선언은 아래와 같습니다. 리스트는 <> 표기 안에 들어가는 데이터 형태를 기준으로 생성되며 numbersList를 통해 정해진 데이터 형태를 언제든지 저장했다 지웠다 할 수 있습니다. 

List<int> numbersList = new List<int>();

 

2.2 리스트에 값 할당 하기

리스트에 값을 추가하거나 삭제할 때 함수를 이용하는데 아직 배우지 않은 내용이니 여기서는 값을 추가하는 기능 Add(), 삭제하는 RemoveAt() 기능만 설명하겠습니다.

 

아래는 1항에서 사용되었던 예시를 리스트로 변경하여 작성한 코드입니다. 배열은 인덱스를 통한 변수에 접근하여 값을 할당하는 개념이었고 리스트의 경우는 마치 바구니에 숫자를 Add()라는 기능으로 추가하는 개념입니다. 

using System;
using System.Collections.Generic;

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> numbersList = new List<int>();

            for(int i=0; i < 7; i++)
            {
            	// 리스트에 정수 저장공간과 값할당이 동시에 이루어진다.
                // Add() 함수에 인자로 정수를 전달한다.
                numbersList.Add(i);
            }
            // 데이터 추가 후 numbersList의 길이는 7이 되었다.

            Console.ReadKey();
        }
    }
}

 

 

2.3 리스트의 인덱스

리스트도 인덱스의 개념이 있습니다. 추가된 순서대로 인덱스 번호가 부여된다고 생각하면 됩니다. 실제로 리스트에 있는 데이터를 액세스 할 때 배열과 동일한 문법으로 사용할 수 있습니다. 다만 리스트의 데이터 공간은 추가와 삭제는 리스트 기능으로만 가능합니다. 아래는 이해를 위해 코드를 추가한 예시 코드입니다.

using System;
using System.Collections.Generic;

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> numbersList = new List<int>();

		// numbersList에 정수 0 부터 6까지 순차적으로 입력한다.
            for(int i=0; i < 7; i++)
            {
                numbersList.Add(i);
            }
            
		// numbersList에 0번인덱스의 저장공간과 값을 동시에 삭제한다.
            numbersList.RemoveAt(0);

		// numbersList의 길이만큼 반복하며 각 인덱스에 저장된 정수값을 출력한다.
            for(int i=0; i < numbersList.Count; i++)
            {
                Console.WriteLine(numbersList[i]);
            }

            Console.ReadKey();
        }
    }
}

 

2.4 foreach로 반복하기

아래는 이전 포스팅에서 배우지 못한 마지만 반복 문법인 foreach와 for문의 차이점 비교표 입니다. foreach는 처음부터 끝까지 별도의 처리가 필요 없고 동일한 작업을 지시할 때 사용되는 반복문입니다. foreach의 () 안의 내용은 각 배열이나 리스트를 이루고 있는 데이터 형태 - 변수 이름 - in키워드 - 배열 or리스트 형태로 되어있고 명시한 변수 이름을 기준으로 명령 블록에서 각 요소별로 명령을 실행하는 구조입니다. 추가로 배열의 길이는 배열.Length로 사용했지만 리스트는 .Count로 길이를 읽어 올 수 있습니다.

for 문법 foreach 문법
for 문법 예시
foreach 문법 예시

 

리스트 요약

  • 리스트는 배열과 다르게 가변 길이의 데이터에 사용합니다.
  • 리스트는 배열보다 연산속도가 느립니다.
  • 리스트도 인덱스를 가지고 있습니다.
  • 리스트는 데이터 추가나 삭제 시 선언된 데이터 공간과 값이 동시에 처리됩니다.
  • 리스트의 길이는 .Count로 읽어 올 수 있습니다.
  • 리스트는 인덱스 번호로 해당되는 요소를 삭제할 수 있습니다.

 

 

3. 결론

이번 포스트에서는 배열과 리스트의 기본 개념에 대해서 알아봤습니다. 배열과 리스트가 처음에 접하면 바로 이해하기 힘든 부분이 있습니다. 특히 리스트 같은 경우는 이번 포스트에 자세히 다루지 않았지만 배열과 비교하면 알아야 할 부분들을 작게나마 나열해 보았습니다. 다음 포스트는 가장 많이 사용되는 함수에 대해 포스팅하겠습니다. 

 

 

반응형

댓글