본문 바로가기
반응형

C#19

volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치 volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치라고 이해하면 편합니다.private volatile bool _isGrabbing = false;처럼 플래그에 쓰면, 다른 스레드가 값 변경을 즉시 보고 잘 멈추거나 시작할 수 있게 해줘요.volatile가 뭔가요?효과: 해당 필드에 대한 **읽기(Read)**와 **쓰기(Write)**가**CPU/컴파일러 재정렬(reordering)**로 서로 엇갈리지 않게 만들고,코어별 캐시/레지스터에만 머물다 안 보이는(stale) 값이 되는 일을 막아,다른 스레드에서 최신 값을 즉시 관측할 수 있게 합니다.(쉽게 말해: “바로 보이게 하고, 읽기/쓰기 순서를 뒤바꾸지 말라”는 메모리 장벽을 넣어줍니다. 읽기는 acquire, 쓰.. 2025. 9. 19.
sealed를 왜 써야 할까? sealed는 **“상속 불가”**를 뜻해요.즉 public sealed class ImageGrabbedEventArgs : EventArgs 라면, 이 클래스를 다른 클래스가 상속(derive)할 수 없습니다.왜 쓰나요?설계 의도 고정: 이벤트 페이로드 형태를 바꾸지 않도록 방지(파생형으로 변형 금지).안전성: 파생 클래스가 동작을 바꾸어 역호환/버그를 유발하는 것을 차단.성능 이점: JIT가 가상 호출을 줄이고(inlining 등) 최적화할 여지가 생김.간단한 데이터 전달용(EventArgs 계열)은 보통 불변 + sealed로 두는 게 흔한 패턴.특징 요약sealed class → 상속 금지 (하지만 인터페이스 구현은 가능).sealed는 클래스에 붙이면 상속을 막고, 메서드에 붙이면 overri.. 2025. 9. 19.
C#의 readonly 키워드 1) readonly가 뭔가요?필드(멤버 변수)에 붙이는 한정자로,선언 시 또는 생성자(ctor) 안에서만 한 번 값을 할당할 수 있고, 그 이후에는 수정이 불가능합니다.즉, 객체가 만들어진 뒤에는 바뀌지 않아야 할 값에 사용합니다.(정확히 말하면 참조형의 경우 **참조(주소)**가 고정될 뿐, 참조 대상 내부 상태까지 자동으로 불변이 되는 것은 아닙니다.)2) 왜/언제 쓰나요? (써야 할 이유)불변성(immutability) 보장: 실수로 값이 바뀌는 버그를 차단합니다. 클래스 불변식을 지키기 쉬워요.코드 의도 표현: “이 값은 생성 시 결정되고 이후 변하지 않는다”를 컴파일러 수준에서 명시합니다.스레드 안정성에 기여: 공유되는 상태가 줄어들어 동시성 버그 위험을 줄입니다.설계 간결화: 의존성, 구성(.. 2025. 9. 19.
C# 태스크(Task)와 비동기 프로그래밍: 생성, 연속 작업, 부모-자식 관계 이해 internal class Program { static int TaskMethod(string name, int second) { DateTime now = DateTime.Now; string formattedTime = now.ToString("HH:mm:s:fff"); Console.WriteLine($"[{formattedTime}] " + "Task {0} is running on a thread id {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, .. 2025. 1. 20.
C# TPL: 태스크 생성 방식과 실행 흐름 완벽 이해 C# 태스크 병렬 라이브러리(TPL) - 태스크 생성**태스크 병렬 라이브러리(TPL)**은 멀티스레드 프로그래밍을 쉽게 하기 위해 .NET에서 제공하는 기능입니다. Task는 TPL의 핵심 클래스 중 하나로, 비동기 작업을 처리하고 스레드 풀(Thread Pool)을 활용하여 작업을 병렬로 실행합니다.예제 코드 분석internal class Program{ static void TaskMethod(string name) { Console.WriteLine("Task {0} is running on thread id {1}. Is thread pool thread : {2}", name, Thread.CurrentThread.ManagedTh.. 2025. 1. 17.
C# `ref`와 `out` 키워드의 차이점과 활용법 C#에서 out과 ref 키워드는 메서드에 매개변수를 전달할 때 특별한 방식으로 사용하는 키워드입니다. 두 키워드 모두 메서드가 호출된 후에 값을 반환받기 위한 목적으로 사용되지만, 약간의 차이점이 있습니다. 차이점을 명확히 이해하기 위해 각각을 설명하고, 샘플 코드를 통해 활용 사례를 보여드리겠습니다.1. ref 키워드특징:호출 전에 반드시 변수에 초기화가 되어 있어야 합니다.메서드 내부에서 값을 수정하면 호출한 쪽에서도 수정된 값을 확인할 수 있습니다.용도: 메서드가 매개변수의 값을 수정하고, 수정된 값을 호출한 쪽에서 사용해야 할 때 적합합니다.예제using System;class Program{ static void ModifyValue(ref int number) { nu.. 2025. 1. 16.
C# 람다식: 간결하고 강력한 익명 함수 이해하기 람다식(Lambda Expression)은 C#에서 매우 강력하고 유용한 기능으로, 함수 또는 메서드를 간결하게 표현하는 데 사용됩니다. 초보자도 쉽게 이해할 수 있도록 천천히 설명하겠습니다.람다식이란?람다식은 간단히 말해 **"익명 함수"**입니다. 이름이 없는 함수로, 코드를 더 짧고 간결하게 작성할 수 있도록 도와줍니다.람다식은 다음과 같은 구조를 가집니다:(입력 매개변수) => { 실행 코드 }람다식이 왜 개발되었나?코드 간결성불필요한 메서드 정의를 줄이고, 간단한 작업을 효율적으로 표현하기 위해 개발되었습니다.표현력데이터를 처리하는 함수형 프로그래밍 스타일을 지원하며, LINQ와 같은 고급 기능에서 매우 유용합니다.재사용성 및 가독성람다식을 사용하면 코드를 간결하고 읽기 쉽게 만들어 복잡한 작업.. 2025. 1. 13.
C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 LINQ (Language-Integrated Query)란?**LINQ (Language-Integrated Query)**는 C#에서 제공하는 강력한 데이터 쿼리 기능입니다.SQL과 유사한 방식으로 데이터를 검색, 필터링, 정렬, 변환할 수 있도록 도와줍니다.LINQ는 데이터를 처리하는 방식을 간결하게 표현할 수 있어, 컬렉션, XML, 데이터베이스 등 다양한 데이터 소스에서 사용됩니다.LINQ의 핵심 개념컬렉션과 데이터 쿼리LINQ는 배열, 리스트, 데이터베이스 등에서 데이터를 쿼리할 수 있는 기능을 제공합니다.표현식 기반SQL처럼 데이터를 처리하는 쿼리를 간단한 표현식으로 작성할 수 있습니다.타입 안전LINQ는 컴파일 시점에 오류를 검출할 수 있어 안전한 코드를 작성할 수 있습니다.LINQ를 왜 .. 2025. 1. 13.
스레드_스레드 상태 조사_thread state C# 스레드 상태 조사 강좌C#에서 스레드 상태를 조사하려면 ThreadState 속성을 사용합니다. ThreadState는 스레드의 현재 상태를 나타내는 열거형으로, 여러 상태 값을 포함합니다. 이 강좌에서는 ThreadState를 이해하고, 예제 코드를 통해 다양한 상태를 확인해 보겠습니다.스레드 상태의 주요 값ThreadState는 다음과 같은 주요 상태 값을 포함합니다.Unstarted: 스레드가 생성되었지만 아직 시작되지 않은 상태.Running: 스레드가 실행 중인 상태.WaitSleepJoin: 스레드가 Sleep, Join 또는 다른 대기 상태에 있는 경우.Stopped: 스레드가 작업을 완료하고 종료된 상태.Aborted: 스레드가 비정상적으로 종료된 상태(예: Abort 호출로 인해)... 2025. 1. 6.
재미로 만드는 로또 번호 생성기 #1_중복 없는 번호 생성 로또 1등에 당첨될 확률은 약 1/8,145,060입니다. 아래는 C#으로 작성된, 1부터 45까지 중복 없이 6개의 숫자를 랜덤으로 뽑는 함수입니다. 이 함수는 HashSet를 사용하여 중복을 방지하고, Random 객체를 활용합니다.using System;using System.Collections.Generic;class Program{ static void Main() { // 랜덤 번호 생성 List lottoNumbers = GenerateLottoNumbers(); // 결과 출력 Console.WriteLine("랜덤 로또 번호: " + string.Join(", ", lottoNumbers)); } st.. 2025. 1. 4.
반응형