본문 바로가기

C#

(9)
[C#] 정렬 규칙 ,CompareTo함수 1. Sort가 비교값을 해석하는 규칙Sort는 비교 함수(a, b)가 반환한 값을 이렇게 해석합니다:음수 ( → a가 b보다 앞에 와야 함0 → 순서 그대로양수 (> 0) → a가 b보다 뒤에 와야 함 즉, 반환값은 항상 첫 번째 인자(a)의 위치 기준으로 해석됩니다.비교함수는 a.CompareTo(b)일 때 a가 b보다 크면 양수, 작으면 음수를 반환합니다.2. 오름차순 예시 (a, b) => a.CompareTo(b) a = 2, b = 5 → a.CompareTo(b) = -1 (음수)→ a가 앞으로 (즉, 2가 5보다 앞)a = 5, b = 2 → a.CompareTo(b) = 1 (양수)→ a가 뒤로 (즉, 2가 앞으로)3. 내림차순에서 b.CompareTo(a) (a, b) => b.Comp..
[C#] 값 형식과 참조 형식의 저장 위치 struct MyStruct{ public MyClass refType;}class MyClass{ public int data;}MyStruct 자체는 값 형식이므로,지역 변수라면 스택(Stack)참조 타입 필드 안에 있으면 힙(Heap)에 저장됩니다.하지만 MyStruct 안의 MyClass는 참조 형식이므로,refType 필드에는 힙에 있는 MyClass 객체의 참조(주소) 가 저장됩니다.실제 MyClass 인스턴스 데이터는 힙(Heap) 에 저장됩니다.즉,struct 본체 → 값 형식 저장 규칙을 따름그 안의 class 필드 → 힙에 따로 저장, struct에는 참조만 저장
[C#] 자료구조 정리 표 자료구조 추천 사용 상황 접근검색삽입/삭제Array크기 변동 거의 없음, 인덱스 접근 속도 최우선, 캐시 효율 중요한 경우O(1)O(n)O(n)List범용, 순차/인덱스 접근이 잦고 크기 변동이 가끔 있는 경우O(1)O(n)O(n)Dictionary키 기반 빠른 검색 필요, 대량 데이터 매핑-O(1) 평균O(n) 최악O(1) 평균O(n) 최악Queue순서대로 처리(FIFO)O(n)O(n)O(1) (양끝)Stack마지막 데이터 우선 처리(LIFO)O(n)O(n)O(1) (양끝)HashSet포함 여부 체크, 중복 제거 필요-O(1) 평균O(n) 최악O(1) 평균O(n) 최악LinkedList중간 삽입/삭제가 빈번, 데이터 크기 변동 많음O(n)O(n)O(1) (노드 참조) 배열(Array)이 List보다..
[C#] 구조체를 쓰는 이유 클래스를 쓰는 이유는 세상 사람들이 다암.그럼에도 불구하고 클래스 대신 구조체를 쓰는 이유는?1. 힙 할당을 피하고 성능·메모리 효율 확보클래스(참조형) → 힙에 할당 + 참조를 통해 접근GC 대상이 되므로 수명이 끝나면 수거해야 함 (GC 부하 발생 가능)구조체(값형) → 스택이나 포함된 객체 메모리에 바로 저장GC 부담 없음, 생성·소멸이 빠름크기가 작을 때는 값 복사 비용보다 힙 할당/GC 비용 절감 효과가 더 큼2. 독립적인 값 의미를 명확하게 표현값형은 복사 시 원본과 완전히 독립→ 서로 영향을 주지 않는 데이터임을 타입 설계에서 보장클래스는 참조를 공유하므로, 한쪽 변경이 다른 쪽에 전파되어 의도치 않은 부작용 가능“독립적인 값”이라는 요구사항이 있을 때 값형은 의미적으로도 적합3. 불변 데이..
[C#] Boxing과 UnBoxing ✅ 핵심 정의Boxing값 타입을 참조 타입(object)으로 감싸는 과정int → object 등Unboxing참조 타입에서 다시 값 타입으로 꺼내는 과정object → int 등 🔸 예제 1: Boxingint num = 10;object boxed = num; // Boxing 발생int는 값 타입 → 스택에 저장됨object는 참조 타입 → 힙에 저장됨Boxing 시: num의 값을 힙에 새로 복사해서 object로 감🎯 즉, Boxing = 값을 힙에 복사 + 참조 타입으로 변환🔸 예제 2: Unboxing object boxed = 10;int num = (int)boxed; // Unboxing 발생boxed는 힙에 저장된 int 값의 참조(int)를 통해 다시 값 타입으로 꺼냄🎯 U..
[C#] Garbage Collector ✅ GC의 목적힙(Heap)에 쌓인 더 이상 참조되지 않는 객체를 자동으로 찾아 제거하여 메모리 누수를 방지프로그래머가 수동으로 delete 같은 메모리 해제를 하지 않아도 되게 함 (C++과 비교되는 장점)🔍 GC의 동작 흐름 요약1. 객체가 생성되면 힙(Heap)에 저장됨var player = new Player(); // new → 힙 메모리 할당이 객체는 스택 변수 player가 참조하고 있음참조가 사라지지 않는 한, GC는 이 객체를 제거하지 않음2. GC는 "참조 그래프"를 분석해서 도달 불가능한 객체를 수거루트(스택 변수, static, CPU 레지스터 등)에서 시작해,따라갈 수 없는 객체는 "고아 객체(unreachable)" → 수거 대상3. 수거 시점: GC는 항상 즉시 작동하지 않음..
[C#] LINQ와 Lazy Evaluation(지연 평가) ✅ LINQ란?LINQ (Language Integrated Query) 는C# 코드에서 배열이나 컬렉션을 SQL처럼 필터링, 정렬, 변환할 수 있게 해주는 기능입니다.🔹 예전 방식List list = new List { 1, 2, 3, 4, 5 };List result = new List();foreach (int i in list){ if (i % 2 == 0) result.Add(i);}🔹 LINQ 방식var result = list.Where(x => x % 2 == 0).ToList(); 🎯 결과는 동일하지만 코드가 훨씬 짧고 읽기 쉬움 ✅ LINQ는 왜 쓰는가?✅ 가독성코드가 SQL처럼 직관적이고 깔끔함✅ 체이닝 가능여러 조건을 연속으로 필터링 가능✅ 유지보수 편함반복문보다 수정이..
[C#] IEnumerable을 쓰는 이유 C++에서는 std::vector, std::list처럼 구체적인 컨테이너를 주로 다루는 반면,C#에서는 IEnumerable 같은 추상적인 인터페이스를 많이 씁니다. 1. 모든 컬렉션을 같은 방식으로 다룰 수 있음void PrintAll(IEnumerable items){ foreach (var item in items) Console.WriteLine(item);} → List, Array, HashSet 등 어떤 컬렉션이 와도 동작함! 2. LINQ 사용 가능 (지연 평가 포함)var result = users.Where(u => u.Age > 18).Select(u => u.Name);Where, Select 등은 모두 IEnumerable 확장 메서드List 같은 구체 타입이 ..