TIL(24-04-23) - C#

임재훈·2024년 4월 23일

C#

목록 보기
4/11

foreach

foreach문은 배열이나 컬렉션에 대한 반복문을 작성할 때 사용한다.

foreach (자료형 변수 in 배열 또는 컬렉션)
{
    // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}
string[] inventory = { "검", "방패", "활", "화살", "물약" };

foreach (string item in inventory)
{
    Console.WriteLine(item);
    // 검, 방패, 활, 화살, 물약 순서대로 출력된다.
}

컬렉션

컬렉션은 자료를 모아 놓은 데이터 구조를 의미한다.

  • 배열과 비슷한 자료 구조
  • 배열과는 다르게 크기가 가변적
  • C#에서는 다양한 종류의 컬렉션을 제공
  • 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가

1. List

  • List는 가변적인 크기를 갖는 배열
  • List를 생성할 때는 List에 담을 자료형을 지정
List<int> numbers = new List<int>(); // 빈 int형 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);

numbers.Remove(2); // 리스트에서 데이터 삭제

foreach(int number in numbers) // 리스트 데이터 출력
{
    Console.WriteLine(number);
    // 1, 3 출력
    // 2는 삭제
}

2. Dictionary

  • Dictionary는 키와 값으로 구성된 데이터를 저장(C++의 Map과 같은 역할을 하는 듯함.)
  • 중복된 키를 가질 수 없으며, 키와 값의 쌍을 이루어 데이터를 저장
using System.Collections.Generic; // using문 추가

Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 (키: string 값: int) 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);

scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제

foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
    Console.WriteLine(pair.Key + ": " + pair.Value);
    // Alice: 100, Charlie: 90 출력
    // Bob: 80은 삭제
}

3. Stack

  • 후입선출(LIFO) 구조를 가진 자료 구조
Stack<int> stack1 = new Stack<int>();  // int형 Stack 선언

// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);

// Stack에서 요소 가져오기
int value = stack1.Pop(); // value = 3 (마지막에 추가된 요소)

4. Queue

  • 선입선출(FIFO) 구조를 가진 자료 구조
Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언

// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);

// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)

배열과 리스트

배열과 리스트의 가장 큰 차이점은 리스트는 동적으로 크기를 조정할 수 있어 유연한 데이터 구조를 구현할 수 있다는 것이다.
그렇다고 해서 리스트를 무분별하게 사용하는 것은 좋지 않은 습관이다.

  1. 메모리 사용량 증가
    리스트는 동적으로 크기를 조정할 수 있어 배열보다 많은 메모리를 사용한다.
    무분별하게 사용하면 메모리 사용량이 급격히 증가하여 성능 저하를 유발할 수 있다.
  2. 데이터 접근 시간 증가
    리스트는 연결 리스트로 구현되기 때문에, 인덱스를 이용한 데이터 접근이 배열보다 느리다.
    리스트에서 특정 인덱스의 데이터를 찾기 위해서는 연결된 노드를 모두 순회해야 하기 때문이다.
    무분별하게 사용하면 데이터 접근 시간이 증가하여 성능이 저하될 수 있다.
  3. 코드 복잡도 증가
    리스트는 동적으로 크기를 조정할 수 있기 때문에, 데이터 추가, 삭제 등의 작업이 배열보다 간편하다.
    하지만, 이러한 유연성은 코드 복잡도를 증가시킬 수 있다.
    리스트를 사용할 때는 데이터 추가, 삭제 등의 작업을 적절히 처리하는 코드를 작성해야 하므로, 코드의 가독성과 유지보수성이 저하될 수 있다.

이러한 이유들로, 데이터의 크기와 사용 목적을 고려하여 배열과 리스트 중 적절한 것을 선택해야 한다.

profile
초심을 잃지 말자!

0개의 댓글