C# 비트 연산 : enum을 flag로 활용하는 방법
·
C#
C#에서 enum은 여러 개의 값을 한 번에 표현할 수 있는 유용한 기능입니다. 하지만, enum을 flag로 사용하려면 몇 가지 제약이 있습니다. enum의 값은 정수여야 합니다. enum의 값은 0부터 시작해야 합니다. 이러한 제약을 해결하기 위해 C#에는 [Flags] 애트리뷰트가 제공됩니다. [Flags] 애트리뷰트를 사용하여 enum을 flag로 사용할 수 있도록 설정할 수 있습니다. 애트리뷰트 설정하기 애트리뷰트를 설정하려면 enum에 다음과 같은 [Flags] 애트리뷰트를 추가하면 됩니다. [Flags] enum MyFlags { None = 0, Flag1 = 1, Flag2 = 2, Flag3 = 4, } 이렇게 하면 MyFlags enum은 0부터 시작하는 정수 값을 갖게 됩니다. 또한..
C#에서 class와 struct의 차이점
·
C#
C#에서 class와 struct는 모두 데이터와 함수를 포함하는 사용자 정의 데이터 형식입니다. 하지만 두 형식에는 몇 가지 중요한 차이점이 있습니다. class와 struct의 주요 차이점 특징 class struct 크기 객체 헤더와 데이터로 구성되어 있어 일반적으로 struct보다 크기가 큽니다. 데이터로만 구성되어 있어 일반적으로 class보다 크기가 작습니다. 포인터 객체는 포인터를 통해 참조됩니다. 구조체는 값으로 전달됩니다. 참조 투명성 객체의 값을 수정하면 참조하는 모든 객체의 값이 수정됩니다. 구조체의 값을 수정하면 원본 구조체의 값만 수정됩니다. 상속 class는 상속을 지원합니다. struct는 상속을 지원하지 않습니다. 포함 class는 다른 class를 포함할 수 있습니다. st..
C# Linked List
·
C#
C#의 링크드 리스트는 연결 리스트라고도 불리며, 각 요소가 다음 요소에 대한 포인터를 가지고 있는 구조입니다. 링크드 리스트는 다음과 같은 특징을 가지고 있습니다. 삽입/삭제 작업이 빠릅니다.링크드 리스트에서 삽입/삭제 작업을 수행할 때는 리스트의 요소를 이동할 필요가 없습니다. 따라서, 삽입/삭제 작업은 O(1)의 시간 복잡도를 갖습니다. 검색 작업이 느립니다. 링크드 리스트에서 검색 작업을 수행할 때는 리스트의 모든 요소를 순회해야 합니다. 따라서, 검색 작업은 O(n)의 시간 복잡도를 갖습니다. 메모리 사용이 효율적입니다. 링크드 리스트는 리스트의 요소가 사용되지 않을 때 자동으로 메모리에서 해제됩니다. 따라서, 메모리 사용이 효율적입니다. 구현 링크드 리스트를 구현하기 위해서는 다음과 같은 코드..
C# 11.0의 required modifier
·
C#
C# 11.0에서는 required modifier가 추가되었습니다. required modifier는 클래스, 구조체, 인터페이스의 필드 또는 속성에 적용하여, 해당 필드 또는 속성이 반드시 초기화되어야 함을 나타냅니다. required modifier 사용하기 required modifier를 사용하려면, 필드 또는 속성에 required 키워드를 추가하면 됩니다. // required modifier 사용 struct Person { public string Name { get; set; } = "John Doe"; public int Age { get; set;; } = 30; public required string Address; } 이 코드에서는 Person 구조체의 Address 속성에 r..
C# 6.0 정적 멤버 직접 사용
·
C#
C# 6.0에서는 정적 멤버를 클래스명 없이 직접 사용할 수 있는 기능이 추가되었습니다. 이 기능은 using static 키워드를 사용하여 구현됩니다. 예제1 using static 키워드를 사용하면, 해당 파일 내에서는 지정된 클래스의 모든 정적 멤버를 클래스명 없이 사용할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성하면 됩니다. using static System.Console; namespace CS6 { class Program { static void Main(string[] args) { // Console. 생략 가능 WriteLine("csharpstudy.com"); // Math. 생략 가능 int x = Random(); float y = Sqrt(100); // DateTi..
C# 6.0의 catch/finally 블럭에서 await 사용
·
C#
C# 6.0에서는 catch/finally 블럭에서 await 키워드를 사용할 수 있는 기능이 추가되었습니다. 이 기능을 사용하면, 예외가 발생하더라도 finally 블럭을 실행할 수 있습니다. C# 5.0 이전 버전 C# 5.0 이전 버전에서는 catch/finally 블럭에서 await 키워드를 사용할 수 없었습니다. 따라서 예외가 발생하면 finally 블럭은 실행되지 않았습니다. 예를 들어, 다음과 같은 코드를 작성하면 예외가 발생하더라도 finally 블럭은 실행되지 않습니다. async Task Main() { try { await Task.Run(() => { throw new Exception("예외가 발생했습니다."); }); } catch (Exception ex) { // 예외 처리 ..
Microsoft.CodeAnalysis.LanguageServer client: couldn't create connection to server.
·
C#
Mac OS에서 VS Code로 C# 프로젝트를 열 때 다음과 같은 에러가 발생하는 경우가 있습니다. Microsoft.CodeAnalysis.LanguageServer client: couldn't create connection to server. Mac OS에서 VS Code로 C# 프로젝트를 열 때 다음과 같은 에러가 발생하는 경우가 있습니다. 이 에러는 VS Code의 C# Extension 버전을 최신 버전으로 사용해 발생하는 경우가 많습니다. 그 경우에는 C# Extension의 버전을 다운그레이드 하면 됩니다. 필자의 경우 1.xx 버전에서도 1.24 version을 사용하였고(1.25 이상은 에러 발생 ), 현재 최신 버전인 2.8.23으로 업데이트 했다가 에러가 발생해 다시 2.5.30..
C#의 정적 타입 정보 연산자
·
C#
C#에서는 정적 타입 정보 연산자를 사용하여 변수, 메서드, 클래스 등의 타입 정보를 확인할 수 있습니다. 정적 타입 정보 연산자는 다음과 같습니다. nameof typeof type.GetFields nameof 연산자 nameof 연산자는 변수, 메서드, 클래스 등의 이름을 문자열로 반환합니다. nameof 연산자는 다음과 같은 형식을 사용합니다. nameof(변수 또는 메서드 또는 클래스) 예를 들어, 다음과 같이 사용할 수 있습니다. // 변수의 이름을 문자열로 반환합니다. string variableName = nameof(myVariable); // 메서드의 이름을 문자열로 반환합니다. string methodName = nameof(myMethod); // 클래스의 이름을 문자열로 반환합니다..