| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
Tags
- property
- type
- 앙상블
- condition
- loop
- Python
- generic
- security
- npm
- BOJ
- C++
- dotenv
- var
- C#
- git
- Clone
- VUE
- AI
- leetcode
- JavaScript
- TypeScript
- 보안
- scss
- machine learning
- vue.js
- nginx
- webpack
- vuetify
- bash
- docker
Archives
- Today
- Total
ice rabbit programming
[C#] 컬렉션, 코루틴, LINQ, 스레딩, GC 본문
728x90
1. 컬렉션, 코루틴, LINQ
Collection
동일 타입의 객체를 보관하는 자료구조다. C#에서는 성능과 타입 안정성을 위해 주로 제네릭 컬렉션(List<T>, Dictionary<K,V>)을 사용하며, 멀티 스레드 환경에서는 Concurrent 컬렉션을 사용한다.
Enumerator (열거자)와 Co-Routine (코루틴)
- 열거자: IEnumerator 인터페이스를 구현하며, MoveNext(), Current를 통해 컬렉션을 순회한다. foreach 문은 내부적으로 열거자를 사용한다.
- 코루틴 (yield return): 컬렉션을 순회할 때 값을 한 번에 리턴하지 않고, yield return을 만날 때마다 호출부로 돌아갔다가 다음 호출 시 중단점부터 다시 실행되는 상태 머신 구조다.
LINQ (Language Integrated Query)
컬렉션 데이터를 SQL 쿼리처럼 다룰 수 있게 해주는 C#의 강력한 기능이다. (주로 IEnumerable<T>를 반환)
- 지연된 실행(Deferred Execution): 쿼리를 정의한 시점이 아니라, 실제로 데이터에 접근(foreach 등)할 때 연산이 수행된다.
- 람다식, 확장 메서드, 코루틴, 델리게이트가 총동원된 기술이다.
- 문법 형태: 확장 메서드 방식 (Fluent Syntax)과 쿼리 식 방식 (Query Syntax)을 모두 지원한다.
var e = arr.Where(n => n % 2 == 1).Select(n => n * 10).Skip(3);
2. 스레딩과 비동기 (Threading & Task)
- Thread: Thread t = new Thread(메서드); t.Start();로 실행한다. 매개변수가 필요하면 람다식을 활용한다.
- Foreground 스레드: 주 스레드가 종료되어도 스레드 작업이 끝날 때까지 프로세스가 살아있다.
- Background 스레드: 주 스레드가 종료되면 즉시 강제 종료된다.
- Task: 시스템이 관리하는 스레드 풀(Thread Pool)을 활용하여 최적화된 스레딩을 제공한다. 최신 C#에서는 원시적인 Thread보다 Task.Run() 사용을 적극 권장한다. 기본적으로 Background 스레드로 동작한다.
3. 가비지 컬렉션 (GC)과 Disposal 패턴
Garbage Collection (GC) 원리
- C#에서는 메모리가 연속적으로 할당되며, 힙 영역에 더 이상 참조되지 않는 객체(쓰레기)가 쌓여 메모리가 부족해지면 GC가 동작한다.
- 사용 중인 메모리를 압축(Compacting)하여 파편화를 막는다.
- 세대(Generation) 기반 수집: 0, 1, 2세대로 나뉘며 최근에 생성된 객체(0세대)일수록 먼저, 자주 검사한다. 오래 살아남은 객체는 다음 세대로 승격된다.
자원 해제와 Dispose 패턴
네트워크, 파일, DB 커넥션 등의 비관리(Unmanaged) 자원은 GC가 언제 수거할지 알 수 없다(Non-deterministic). 따라서 사용을 마친 후에는 반드시 명시적으로 자원을 해제해야 한다.
- Dispose() 메서드를 구현하여 명시적으로 자원을 해제한다.
- 실무에서는 GC.Collect()를 직접 호출하는 것은 웬만하면 피하고, 프레임워크의 관리에 맡기는 것이 좋다. 대신 자원 해제는 앞서 언급한 using 블록을 활용하여 안전하게 처리하자.
728x90
'Development > C#' 카테고리의 다른 글
| [C#] 예외 처리(Exception Handling) (2) | 2021.03.28 |
|---|---|
| [C#] Delegate (0) | 2020.09.05 |
| [C#] Generic (0) | 2020.05.24 |
| [C#] Index와 Range (0) | 2020.05.17 |
| [C#] Property와 Indexer (0) | 2020.05.10 |