C# - 배열 ( Array )

2025. 9. 8. 18:49·C#

배열 ( Array )

배열이란 같은 자료형의 데이터를 연속적으로 저장하는 자료구조를 말한다.

 

배열을 선언하는 방법은 아래와 같다.

// 배열 선언
자료형[] 배열명;

// 메모리 할당
 배열명 = new 자료형[배열크기];

// 선언과 동시에 할당 가능
자료형[] 배열명 = new 자료형[배열크기];
// 예시
int[] yourHair = new int[10];

 

배열은 그럼 왜 필요할까?

 

예를들어 학생 500명을 각각 변수를 선언해서 성적을 기입한다고 생각해보자

배열이 없다면 우리는 학생 500명의 점수를 담을 변수를 모조리 선언해야할 것이다.

int s1 = 0;
int s2 = 15;
int s3 = 12;
int s4 = 100;
int s5 = 44;
. . . . .
. . .
. .
int s499 = 0;
int s500 = 88;

 

어느세월에 이걸 다 하고있나..?

입력도 문제고 관리도 문제다.

하지만 굳이 학생명을 기억해야할 필요가 없고, 점수만 나열하는 게 목적이라면

int[] scores = new int[500];
scores[0] = 0;
.
.
.

 

여전히 입력은 귀찮아 보이긴 하지만 배열은 그 자체만으로도 여러 편리한 기능을 갖고있다.

 

우선 배열은 각 요소를 인덱스로 접근할 수 있다.

인덱스라는 건 배열의 특정 값의 자리(주소) 정도로 이해해두면 된다.

 

예를들어

int[] scores = { 90, 85, 100 };

Console.WriteLine(scores[0]); // 90
Console.WriteLine(scores[1]); // 85
Console.WriteLine(scores[2]); // 100

 

이런식으로 배열 안의 내용을 배열명[인덱스]로 접근할 수 있다.

그리고 Length 속성을 통해 배열의 길이를 알 수 있는데 이 또한 유용하니 꼭 알아두자.

 

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Length); // 5

 

배열은 반복문과의 시너지도 아주 좋다.

 

우선 예시를 위해 배열을 사용하지 않고 단축키를 통해 아이템을 사용을 콘솔로 출력하는 코드를 간단하게 작성해보자.

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            string shortCut1 = "탈모약";
            string shortCut2 = "탈모샴푸";
            string shortCut3 = "발모제";
            string shortCut4 = "두피영양제";

            Console.WriteLine("사용할 단축키를 1~4 골라주시기 바랍니다.");

            int input = int.Parse(Console.ReadLine());

            switch (input)
            {
                case 1:
                    Console.WriteLine($"{shortCut1} 사용");
                    break;
                case 2:
                    Console.WriteLine($"{shortCut2} 사용");
                    break;
                case 3:
                    Console.WriteLine($"{shortCut3} 사용");
                    break;
                case 4:
                    Console.WriteLine($"{shortCut4} 사용");
                    break;
            }
        }
    }
}

단축키 사용을 위해 shortCut을 일일이 변수로 지정해줬다.

지금은 4개 밖에 없지만 만약에 shortCut이 몇백개가 된다고 생각하면...

case를 일일이 몇백개에 맞춰서 만들어서 출력해야하는 지옥같은 상황이 발생한다.

 

하지만 우리는 방금 배열을 배웠기 때문에 지옥에 빠질 필요 없다.

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            string[] shortCuts = new string[4];

            shortCuts[0] = "탈모약";
            shortCuts[1] = "탈모샴푸";
            shortCuts[2] = "발모제";
            shortCuts[3] = "두피영양제";

            int number;
            Console.WriteLine("사용할 단축키를 1~4 사이로 입력해라");
            if (int.TryParse(Console.ReadLine(), out number))
            {
                Console.WriteLine($"배열의 {number}번 속의 내용은 {shortCuts[number - 1]} 입니다.");
            }
        }
    }
}

 

배열의 인덱스를 이용해 간단하게 작성할 수 있다.

만약 배열 전체의 내용을 출력하고 싶으면? 이번엔 반복문을 활용해서 인덱스를 순회해서 출력하기만 하면 된다

 

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            string[] shortCuts = new string[4];

            //배열 사용 방법
            shortCuts[0] = "탈모약";       // 해당 공간을 열어볼 수 있음
            shortCuts[1] = "탈모샴푸";
            shortCuts[2] = "발모제";
            shortCuts[3] = "두피영양제";

            Console.WriteLine("반복문");
            // 4번 반복할 것으로 반복문 사용 가능
            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine($"배열의 {i}번 속의 내용은 {shortCuts[i]} 입니다.");
            }
        }
    }
}

 

반복문의 조건식에 4 대신 shortCuts.Length를 이용해 확장성을 챙기는 방법도 있다.

그리고 이것보다 더 간단한 건 foreach문을 활용하는 것이다.

 

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            string[] shortCuts = new string[4];

            shortCuts[0] = "탈모약";
            shortCuts[1] = "탈모샴푸";
            shortCuts[2] = "발모제";
            shortCuts[3] = "두피영양제";
            
            foreach (string s in shortCuts)
            {
                Console.WriteLine(s);
            }
        }
    }
}

 

배열 전체를 순회해서 특정 값을 읽어들이는 것만이 목적이면 foreach는 매우 편리한 기능이다.

하지만 foreach는 for문과 달리 읽기전용이기에 상황에 따라 잘 골라 사용해야한다.

// 이런거 안됨
foreach (string st in shortCuts)
{
	st = st + "12"
}

// 하지만 for문은 가능
for (int i = 0; i < shortCuts.Length; i++)
{
	shortCuts[i] = shortCuts[i] + "12;
}

 

 


다차원 배열

다차원 배열이란 행과 열, 그리고 그 이상의 차원을 가진 배열이다.

일반적인 1차원 배열이 값들을 일렬로 저장하는 구조라면

2차원 배열은 표 형태,

3차원 배열은 여러 개의 표를 쌓아놓은 입체 구조로 생각할 수 있다.

 

즉, 배열 안에 배열을 또 가지는 방식이 아니라 메모리 상에서 연속된 공간을 다차원적으로 나누어 표현한 구조다.

하지만 일단 배열 안의 배열이라고만 이해하고 넘어가도 사용에는 무방하다.

shortCuts = new string[3, 4]
{
    {"1-1", "1-2", "1-3", "1-4" },
    {"2-1", "2-2", "2-3", "2-4" },
    {"3-1", "3-2", "3-3", "3-4" },
};

이렇게 배열 안에 배열을 갖는 배열을 2차원 배열이라고 한다.

그리고 배열 안에 n개의 배열을 만들 수 있기에 다차원 배열이라고 부른다.

,의 개수가 차원을 표현한다.

 

그래픽스나 이상한 행동을 하는 게 아니라면 3차원 위로는 쓸 일이 거의 없다고 하지만

알아둬서 나쁠 건 없다.

일단 2차원 배열까지는 자주 쓰이니 확실히 알아두자.


값 타입 (Value Type) / 참조 타입 (Refernce Type)

C#을 배우다 보면 값 타입과 참조 타입이라는 개념을 자주 접하게 된다다.
이는 단순한 문법 구분이 아니라, 메모리 사용 방식과 데이터 동작 원리에 직접적인 차이를 만들기 때문에 반드시 이해하고 넘어가야 하는 중요한 주제다.

 

값 타입 (Value Type)

스택(Stack) 메모리에 직접 값이 저장 됨

변수에 대입하면 값이 복사 되기 때문에 원본과 사본은 서로 영향을 주지 않음

기본적으로 System.ValueType을 상속함

int, float, double, bool, char, struct(구조체), enum(열거형) 이 대표적이다.

 

int a = 10;
int b = a; // a의 값을 복사하여 b에 저장

b = 20;

Console.WriteLine(a); // 10 (변하지 않음)
Console.WriteLine(b); // 20

 

참조 타입 (Reference Type)

힙(Heap 메모리에 실제 데이터가 저장되고, 변수에는 그 주소를 저장한다.

그렇기 때문에 복사가 일어나면, 주소를 복사하기 때문에 같은 원본 데이터를 가리키고 있어 원본과 사본이 서로에게 영향을 준다.

기본적으로 System.Object를 상속한다.

class, Array, string, interface, delegate 가 대표적이다.

 

class Person
{
    public string Name;
}

Person p1 = new Person();
p1.Name = "Alice";

Person p2 = p1; // 주소를 복사 (같은 객체 참조)

p2.Name = "Bob";

Console.WriteLine(p1.Name); // Bob (p1도 함께 바뀜)
Console.WriteLine(p2.Name); // Bob

 

정리 표

구분 값 타입 참조 타입
저장 위치 스택(Stack) 힙(Heap)
대입 방식 값 자체 복사 참조(주소) 복사
독립성 서로 독립적 같은 데이터 공유
대표 예시 int, float, struct, enum class, array, string, object

 

주의

 

  • string은 참조 타입이지만, 불변(immutable) 객체이기 때문에 값 타입처럼 보일 때가 있음.
  • 구조체(struct)는 값 타입이지만, 멤버로 참조 타입을 가질 수도 있음.
  • 박싱(Boxing)과 언박싱(Unboxing) 과정에서도 값/참조 타입의 차이가 성능에 영향을 줄 수 있음.

 

 


VAR

C#에서 var는 암시적 형식 지역 변수(implicitly typed local variable) 를 선언할 때 사용하는 키워드다.
즉, 컴파일러가 오른쪽 값(우항)을 보고 변수의 타입을 추론해준다.

 

자료형을 적지 않아도 되어 코드가 간결해지고 편리하다는 장점이 있지만 항상 사용 가능한 건 아니다.

지역 변수나 LINQ 같은 스크립트 컨텍스트에서만 사용 가능하다고 한다.

 

그리고 일반 변수와는 다르게 선언과 동시에 초기화해야 한다.

안 하면 그냥 에러 출력이다.

var x = 10; // OK
var y;      // 오류: 타입을 추론할 수 없음

 

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            var a = 10; // 우항을 보고 타입을 추론함. 10은 정수형이니 int라고 추론
            var b = 2.14; // 실수
            var c = 2.3f; // float형

            Console.WriteLine(a.GetType());		//System.Int32
            Console.WriteLine(b.GetType());		//System.Double
            Console.WriteLine(c.GetType());		//System.Single
        }
    }
}

문자열 = 배열??

C#에서 문자열(string)은 사실상 배열처럼 다룰 수 있다.
그래서 인덱스를 사용하거나, 반복문으로 한 글자씩 접근할 수 있으며 for문을 이용해 분해하는 것도 가능하다.

using System;

namespace CsharpStudy
{
    internal class Program
    {
        static void Main()
        {
            string name = "Goddess of Victory Nikke, RedHood Raphi & Cinderella";

            Console.WriteLine(name[0]); // G 출력
            Console.WriteLine("---------------------");

            foreach (char ch in name)
            {
                Console.WriteLine(ch);
            }
        }
    }
}

 

위에서도 설명했지만 문자열은 다른 기본 데이터 타입들과 달리 참조 타입이다.

코드를 열어보면 내부적으로 배열처럼 클래스로 구현돼있는 걸 알 수 있다.

하지만 배열과 같은 방식으로 문자열[0] 이런거로 특정 부분을 수정할 수 없다.

이는 string이 참조 타입이긴 하지만 불변 객체이기 때문인데, StringBuilder를 사용한다던가 전부 해체하고 다시 조합한다던가 하는 방식으로 수정하는 방법이 있긴 하다.


배열과는 엮여있는 이야기가 많아서 한 번에 많은 내용을 정리하는 바람에 조금 두서 없어 보이기도 하지만 전부 필수로 알아둬야하는 내용들 뿐이다.

배열 관련 주요 메서드를 정리한 표를 마지막으로 오늘 글을 마무리 하겠다.

 

메서드 설명 예제 코드 결과

메서드 설명
Array.Sort() 배열 요소를 오름차순 정렬
Array.Reverse() 배열 요소의 순서를 반대로 뒤집음
Array.IndexOf() 특정 값이 배열의 몇 번째 인덱스에 있는지 반환 (없으면 -1)
Array.LastIndexOf() 특정 값이 마지막으로 나타나는 인덱스 반환
Array.Exists() 조건에 맞는 요소가 존재하는지 확인
Array.Find() 조건에 맞는 첫 번째 요소 반환
Array.FindAll() 조건에 맞는 모든 요소 반환
Array.FindIndex() 조건에 맞는 첫 번째 요소의 인덱스 반환
Array.Clear() 지정한 범위의 배열 요소를 기본값으로 초기화
Array.Copy() 배열 요소를 다른 배열로 복사
Array.Resize() 배열 크기를 변경 (새 배열 생성)

 

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

C# - 함수 (Function)  (0) 2025.09.10
C# - 값 타입 (Value Type), 참조 타입 (Reference Type)  (0) 2025.09.10
C# - 콘솔로 별 찍기 (다이아몬드 편)  (0) 2025.09.08
C# - 콘솔로 별 찍기 (삼각형 편)  (0) 2025.09.04
C# - 반복문 ( Loop Statements )  (0) 2025.09.04
'C#' 카테고리의 다른 글
  • C# - 함수 (Function)
  • C# - 값 타입 (Value Type), 참조 타입 (Reference Type)
  • C# - 콘솔로 별 찍기 (다이아몬드 편)
  • C# - 콘솔로 별 찍기 (삼각형 편)
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Design Pattern
    delegate
    struct
    unity
    class
    알고리즘
    stack
    Abstract
    스택
    list
    function
    useState
    interface
    최적화
    큐
    Queue
    C#
    클래스
    inputsystem
    유니티
    추상 클래스
    콘솔
    Photon
    Network
    게임
    네트워크
    자료구조
    console
    firebase
    터미널
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - 배열 ( Array )
상단으로

티스토리툴바