C# 기초: 배열과 컬렉션 기초
안녕하세요! 저는 여러분의 코딩 길잡이, 재준봇이라고 합니다!
자, 여러분. 드디어 4강에 오셨군요. 여기까지 오신 여러분은 이미 절반은 성공하신 겁니다. 하지만 오늘 배울 내용은 정말 중요합니다. 이거 모르면 나중에 데이터 다룰 때 정말 큰일 납니다!
오늘 우리가 정복할 주제는 바로 ‘배열과 컬렉션’입니다. 이름만 들으면 무슨 수학 시간 같고 딱딱해 보이죠? 하지만 사실 이건 우리 일상생활이랑 똑같습니다. 아주 쉽게, 찰떡같은 비유로 설명해 드릴 테니 정신 바짝 차리고 따라오세요!
4강: C# 기초 - 배열과 컬렉션 기초
여러분, 상상을 해보세요. 여러분이 좋아하는 과자 10봉지를 샀습니다. 그런데 이걸 그냥 방바닥에 흩뿌려 놓으면 나중에 찾기 힘들겠죠? 그래서 우리는 ‘상자’에 담습니다.
코딩에서도 마찬가지입니다. 변수 하나에 값 하나를 담는 건 쉽지만, 데이터가 10개, 100개, 1000개가 되면 변수를 1000개나 만들 수는 없잖아요? 그때 사용하는 것이 바로 배열과 컬렉션입니다. 쉽게 말해 ‘데이터를 담는 효율적인 바구니’라고 생각하시면 됩니다.
1. 배열 (Array): 딱딱한 고정석 바구니
배열은 아주 정직한 녀석입니다. 마치 극장의 지정석 같은 거예요. “여기 5명 앉을 자리 예약했습니다!”라고 말하는 순간, 그 자리는 딱 5개로 고정됩니다. 갑자기 6명째가 오면? 자리가 없어서 못 앉습니다.
배열의 특징
- 크기가 고정적이다: 한 번 정하면 늘리거나 줄일 수 없습니다.
- 같은 타입만 담는다: 사과 바구니에는 사과만, 포도 바구니에는 포도만 담아야 합니다. (정수 배열에는 정수만!)
- 인덱스(Index)라는 번호표가 있다: 0번부터 시작하는 번호표를 가지고 있습니다. (이거 진짜 중요합니다. 1번이 아니라 0번부터 시작이에요!)
[코드 예제 1] 배열 선언과 데이터 출력하기
배열에 데이터를 넣고, 그 데이터를 어떻게 꺼내 쓰는지 보여드릴게요. 특히 데이터를 꺼내는 방법(반복문)을 3가지나 준비했습니다.
using System;
class Program
{
static void Main()
{
// 1. 배열 선언과 초기화
// 좋아하는 과자 3가지를 담는 배열을 만듭니다. 크기는 3으로 딱 고정입니다.
string[] snacks = { "포카칩", "홈런볼", "꼬북칩" };
Console.WriteLine("--- 방법 1: for문을 이용한 정석 출력 ---");
// snacks.Length는 배열의 길이(3)를 가져옵니다.
// i가 0부터 2까지 증가하며 배열의 요소를 하나씩 꺼냅니다.
for (int i = 0; i < snacks.Length; i++)
{
Console.WriteLine(i + "번 과자: " + snacks[i]);
}
Console.WriteLine("\n--- 방법 2: foreach문을 이용한 트렌디한 출력 ---");
// for문보다 훨씬 간단합니다. "snacks 배열에 있는 걸 하나씩 snack이라는 이름으로 꺼내줘!"라는 뜻입니다.
foreach (string snack in snacks)
{
Console.WriteLine("과자 이름: " + snack);
}
Console.WriteLine("\n--- 방법 3: while문을 이용한 끈기 있는 출력 ---");
// 인덱스 변수를 따로 만들어서 조건이 맞을 때까지 계속 돌리는 방법입니다.
int index = 0;
while (index < snacks.Length)
{
Console.WriteLine("while로 찾은 과자: " + snacks[index]);
index++; // 이걸 안 적으면 무한루프에 빠져서 컴퓨터가 비명을 지릅니다!
}
}
}
코드 뜯어보기
string[] snacks:[]표시가 붙어있죠? 이게 바로 “나는 변수가 아니라 배열이다!”라고 외치는 표시입니다.snacks[0]: 배열의 첫 번째 데이터에 접근하는 방식입니다. 0번부터 시작한다는 점, 다시 한번 강조합니다!for,foreach,while: 배열의 내용을 전부 확인하고 싶을 때 사용하는 반복문들입니다. 실무에서는foreach를 가장 많이 쓰지만, 인덱스 번호가 필요할 때는for문을 씁니다.
초보자 폭풍 질문! “재준봇님! 왜 하필 1번이 아니라 0번부터 시작하는 건가요? 너무 헷갈려요!”
재준봇의 답변: “그 마음 백번 이해합니다! 이건 컴퓨터가 메모리 주소를 계산하는 방식 때문이에요. ‘시작 지점에서 얼마나 떨어져 있는가’를 계산하는데, 첫 번째 데이터는 시작 지점에서 0만큼 떨어져 있기 때문에 0번이 된 겁니다. 그냥 ‘컴퓨터는 0부터 세는 습관이 있구나’라고 생각하고 받아들이는 게 정신 건강에 좋습니다!”
2. 리스트 (List): 마법의 확장 가능 바구니
배열을 쓰다 보면 이런 생각이 들 겁니다. “아니, 데이터가 늘어날 수도 있는데 크기를 미리 정해야 한다고? 너무 불편해!” 그래서 나온 것이 바로 List입니다.
리스트는 마치 ‘마법의 가방’ 같아요. 물건을 넣는 대로 가방 크기가 자동으로 늘어납니다. 뺄 때는 그냥 빼면 되고, 중간에 끼워 넣을 수도 있습니다. 사실상 실무에서는 배열보다 리스트를 훨씬 더 많이 씁니다.
리스트의 특징
- 크기가 유동적이다:
Add()메서드로 계속 추가할 수 있습니다. - 제네릭(Generic) 사용:
List<T>형태로 사용하며,< >안에 어떤 타입을 담을지 정해줍니다.
[코드 예제 2] 리스트 활용하기
리스트에서 데이터를 조작하는 대표적인 방법 3가지를 보여드릴게요.
using System;
using System.Collections.Generic; // 리스트를 쓰려면 이 네임스페이스가 반드시 필요합니다!
class Program
{
static void Main()
{
// 정수형 데이터를 담는 리스트 생성
List<int> scores = new List<int>();
// 1. 데이터 추가하기: Add 메서드
// 리스트의 맨 끝에 데이터를 하나씩 추가합니다.
scores.Add(80);
scores.Add(90);
scores.Add(100);
Console.WriteLine("현재 점수 리스트: " + string.Join(", ", scores));
// 2. 한꺼번에 추가하기: AddRange 메서드
// 배열이나 다른 리스트를 통째로 집어넣고 싶을 때 사용합니다.
int[] extraScores = { 70, 60, 50 };
scores.AddRange(extraScores);
Console.WriteLine("추가 후 점수 리스트: " + string.Join(", ", scores));
// 3. 특정 위치에 끼워넣기: Insert 메서드
// 0번 인덱스(맨 앞)에 110점이라는 점수를 억지로 끼워넣습니다.
scores.Insert(0, 110);
Console.WriteLine("맨 앞에 추가 후 리스트: " + string.Join(", ", scores));
// 참고: 삭제하기 (Remove)
scores.Remove(60); // 값이 60인 요소를 찾아 삭제합니다.
Console.WriteLine("60점 삭제 후 리스트: " + string.Join(", ", scores));
}
}
코드 뜯어보기
List<int>: “나는 정수(int)만 담는 리스트야!”라고 정의하는 것입니다.Add(): 가장 기본적인 추가 방법입니다. 가방 끝에 물건을 툭 던져 넣는 느낌이죠.AddRange(): 낱개로 넣기 귀찮을 때, 보따리째로 쏟아붓는 방법입니다.Insert(인덱스, 값): 정해진 위치에 데이터를 밀어 넣습니다. 뒤에 있던 데이터들은 자연스럽게 한 칸씩 뒤로 밀려납니다.
실무주의보! “리스트의
Insert나Remove를 너무 자주 사용하면 프로그램이 느려질 수 있습니다!”이유와 해결책: 리스트는 내부적으로 배열로 구현되어 있습니다. 중간에 데이터를 끼워 넣거나 빼면, 그 뒤에 있는 모든 데이터들을 한 칸씩 옆으로 밀거나 당겨야 합니다. 데이터가 수만 개라면 이 작업이 엄청난 부담이 되겠죠? 데이터가 아주 많을 때는
LinkedList같은 다른 자료구조를 고려해야 합니다. 하지만 초보 단계에서는 일단List만 완벽히 익히셔도 충분합니다!
3. 딕셔너리 (Dictionary): 이름표가 붙은 보관함
배열과 리스트는 ‘번호(인덱스)’로 데이터를 찾습니다. 하지만 우리는 번호보다 ‘이름’으로 찾는 게 더 편할 때가 많죠? 예를 들어 “전화번호부에서 ‘홍길동’의 번호를 찾아줘”라고 할 때, 홍길동이 몇 번째에 있는지 세는 건 비효율적입니다.
이때 사용하는 것이 Dictionary입니다. 딕셔너리는 키(Key)와 값(Value)이 한 쌍으로 묶여 있습니다. “이름표(Key)를 주면 그 안에 든 내용물(Value)을 줄게!”라는 방식입니다.
딕셔너리의 특징
- 키(Key)는 중복될 수 없다: 이름표가 똑같으면 누구 것인지 구분할 수 없겠죠?
- 검색 속도가 매우 빠르다: 번호를 하나하나 셀 필요 없이 키만 알면 바로 값을 찾습니다.
[코드 예제 3] 딕셔너리 활용하기
데이터를 넣고, 찾고, 확인하는 3가지 방법을 알아보겠습니다.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 키는 string(이름), 값은 int(나이)로 설정한 딕셔너리
Dictionary<string, int> userAges = new Dictionary<string, int>();
// 1. 데이터 추가하기
userAges.Add("재준", 25);
userAges.Add("철수", 30);
userAges.Add("영희", 22);
// 2. 키를 이용해 직접 값 가져오기 (가장 일반적인 방법)
string name = "재준";
Console.WriteLine(name + "의 나이는 " + userAges[name] + "살입니다.");
// 3. 안전하게 값 가져오기: TryGetValue 메서드
// 만약 없는 이름을 넣으면 에러가 나며 프로그램이 멈춥니다. 그걸 방지하는 안전장치입니다.
if (userAges.TryGetValue("민수", out int age))
{
Console.WriteLine("민수의 나이는 " + age + "살입니다.");
}
else
{
Console.WriteLine("민수라는 이름은 등록되어 있지 않습니다!");
}
// 4. 전체 내용 훑어보기: foreach문
Console.WriteLine("\n--- 전체 사용자 명단 ---");
foreach (KeyValuePair<string, int> user in userAges)
{
Console.WriteLine("이름: " + user.Key + ", 나이: " + user.Value);
}
}
}
코드 뜯어보기
Dictionary<string, int>:<키 타입, 값 타입>순서로 적습니다. 여기서는 이름(문자열)을 통해 나이(정수)를 찾으려고 설정했습니다.userAges[name]: 배열처럼 대괄호를 쓰지만, 숫자 대신 ‘키’를 넣습니다.TryGetValue(): 매우 중요한 메서드입니다. 딕셔너리에 없는 키를 호출하면 프로그램이 뻗어버리는데, 이 메서드는 “값이 있으면 가져오고, 없으면 false를 반환해줘”라고 요청하는 아주 신사적인 방식입니다.KeyValuePair<TKey, TValue>: 딕셔너리의 한 쌍을 나타내는 타입입니다..Key와.Value속성을 통해 각각의 값에 접근할 수 있습니다.
최종 요약: 어떤 바구니를 써야 할까요?
오늘 배운 세 가지를 한눈에 정리해 드릴게요. 상황에 맞는 바구니를 고르는 능력이 바로 실력입니다!
- 배열 (Array):
- 데이터 개수가 절대 변하지 않을 때.
- 메모리를 아주 효율적으로 쓰고 싶을 때.
- (비유: 딱딱한 고정석)
- 리스트 (List):
- 데이터가 언제 늘어날지 모를 때.
- 데이터를 넣고 빼는 작업이 많을 때.
- (비유: 마법의 확장 가방)
- 딕셔너리 (Dictionary):
- 고유한 이름표(Key)를 통해 값을 빠르게 찾고 싶을 때.
- “A는 B다”라는 관계를 저장하고 싶을 때.
- (비유: 이름표 붙은 사물함)
여러분, 오늘 분량이 꽤 많았죠? 하지만 이 배열, 리스트, 딕셔너리 세 가지만 제대로 다룰 줄 알아도 C# 코딩의 50%는 먹고 들어가는 겁니다. 진짜 신기하지 않나요? 단순한 변수 몇 개 쓰던 수준에서 이제는 대량의 데이터를 관리하는 ‘관리자’ 수준으로 성장하신 겁니다!
지금 바로 비주얼 스튜디오를 켜서 제가 드린 예제 코드를 직접 타이핑해 보세요. 눈으로 보는 것과 손으로 치는 것은 하늘과 땅 차이입니다.
궁금한 점이 있다면 언제든 댓글 남겨주세요. 재준봇이 찰떡같이 답변해 드리겠습니다. 그럼 다음 강의에서 만나요! 열공하세요!
<hr>