c#

    C# 읽기 전용 (readonly)

    readonly 키워드는 다음 네 가지 컨텍스트에서 사용할 수 있는 한정자다. 필드 선언에서 필드에 대한 할당을 나타내는 readonly는 선언의 일부로 또는 동일한 클래스의 생성자에서만 발생할 수 있다. 필드 선언과 생성자 내에서 읽기 전용 필드를 여러 번 할당 및 재할당할 수 있다. 값 형식은 해당 데이터를 직접 포함하므로 값 형식인 readonly 필드는 변경할 수 없다. 참조 형식에는 해당 데이터에 대한 참조가 포함되므로, readonly 참조 형식인 필드는 항상 같은 개체를 참조해야해당 개체를 변경할 수 있다. 생성자가 종료된 후에는 readonly 필드를 할당할 수 없다. 이 규칙의 의미는 값 형식과 참조 형식에서 서로 다르다. readonly struct 형식 정의에서 readonly는 구조..

    C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)

    클래스에 적용된 경우 sealed 한정자는 다른 클래스가 해당 클래스에서 상속하지 못하도록 한다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class Parent { } public sealed class Derived : Parent { } public class AnotherDerived : Derived { } public class Test { public static void Main() { AnotherDerived anotherDerived = new AnotherDerived(); } } 함수 같은 경우에는 가상 함수 오버라이딩 방지용으로 쓰여진다. using Sys..

    C# 중첩 클래스 (Nested Class)

    클래스 내부에서 클래스를 정의할 수 있다. 중첩 클래스를 사용하여 클래스를 그룹화할 수 있으며, 클래스의 사용 범위를 제한할 수 있다. class OutsideClass { // ... class InsideClass { // ... } } OutsideClass 내부에 InsideClass 클래스를 정의했으므로 OutsideClass는 중첩 클래스다. 사용하는 이유 클래스를 논리적으로 그룹화할 수 있다. 특정 클래스 내부에서만 사용되기 때문에 코드를 더 쉽게 파악할 수 있으며, 유지 관리가 쉽다. 특정 클래스 내부에서만 사용되므로 클래스 구조가 단순해진다. 예제 학교에는 선생님이 존재하므로 School 클래스 내부에 Teacher 클래스를 선언한다. public class School { public ..

    C# 확장 메서드 (Extension Method)

    확장 메서드(MSDN 링크) 는 C# 3.0부터 추가된 기능으로 미리 정의된 형식에 사용자 정의 함수를 확장(추가)시키는 작업을 수행한다. 예로 들어서 string 형식에 Print라는 함수를 확장할 때 일반적인 경우라면 형식에 메서드를 추가하기 위해서는 해당 형식의 소스 코드가 필요하다. string 형식은 mscorlib (Multi-language Standard Common Object Runtime Library, 다국어 표준 공용 언어 런타임 라이브러리) 프로젝트에 포함되어 있으며, 변경 후에는 이 프로젝트를 다시 빌드하여 어셈블리를 만들어야 한다. 깃헙 링크 하지만, 확장 메서드를 사용한다면 해당 형식의 코드를 변경하지 않고 내 코드에서 어떤 형식이던지 메서드를 확장시킬 수가 있게 된다. 확..

    C# 리플렉션과 어트리뷰트 (Reflection and Attributes)

    리플렉션 C#에서는 프로그램 실행 도중에 객체의 정보를 조사하거나, 다른 모듈에 선언된 인스턴스를 생성하거나, 기존 개체에서 형식을 가져오고 해당하는 메소드를 호출, 또는 해당 필드와 속성에 접근할 수 있는 기능이다. 형식 메소드 설명 Type GetType() 지정된 형식의 Type 개체를 가져온다. MemberInfo[] GetMembers() 해당 형식의 멤버 목록을 가져온다. MethodInfo[] GetMethods() 해당 형식의 메소드 목록을 가져온다. FieldInfo[] GetFields() 해당 형식의 필드 목록을 가져온다. using System; using System.Collections.Generic; using System.Linq; using System.Text; using..

    C# 전처리기의 모든것

    C 및 C++ 지시문과 달리, 매크로를 만드는 데는 해당 지시문을 사용할 수 없다. 전처리기 지시문은 한 줄에서 유일한 명령이어야 한다. Null 허용 컨텍스트 #nullable 전처리기 지시문은 null 허용 주석이 적용되는지와 null 허용 여부 경고가 지정되는지를 제어한다. 각 컨텍스트는 disabled 또는 enabled이다. 주석 및 경고 컨텍스트를 제어하고 프로젝트 수준 설정보다 우선으로 적용된다. 다른 지시문이 재정의할 때까지 제어하는 컨텍스트를 설정하거나 소스 파일의 끝까지 설정한다. 지시문의 효과는 다음과 같다. #nullable disable: null 허용 주석 및 경고 컨텍스트를 disabled로 설정한다. #nullable enable: null 허용 주석 및 경고 컨텍스트를 en..

    C# Action/Func/Predicate

    Action Delegate .NET의 Action delegate는 하나의 파라미터를 받아들이고, 리턴 값이 없는 함수에 사용되는 Delegate이다. Action delegate는 System 네임스페이스에서 제공되는데, 파라미터의 수에 따라 0개부터 16개의 파라미터까지 받아들이는 delegate가 있다. 즉, 파라미터가 없는 Action은 Action delegate, 파라미터가 1개인 Action delegate, 2개인 Action delegate - 이렇게 16개 파라미터가 있는 Action delegate가 존재한다. 많은 함수의 경우 대개 3~5개의 파라미터까지 있는 걸로 본다면, 상당히 많은 함수에 대한 표준 delegate를 미리 만들어 둔것으로 보면된다. 물론 중요한 특징은 리턴 값..

    C# 배열 복사 방법

    한 가지 유의해야할 점은 Clone 함수는 얕은 복사이다. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class A { public float value { get; set; } public A(float value) { this.value = value; } } public class Test { static readonly int mk_size = 10; static void Print(A[] arr) { foreach (var item in arr) { Console.Write($"{item.value} "); } Console.WriteLine(); } static void ..

    C# 얕은 복사 깊은 복사

    Object.MemberwiseClone 은 shallow copy 를 생성하며, ICloneable interface와 함께 사용하면 deep copy 을 얻을 수 있다. MemberwiseClone 는 새로운 객체를 생성 한 다음, 새로운 객체는 현재 오브젝트의 필드를 copy 하여 단순 복사본을 생성한다. 그리고 필드가 value type 이면 bit-by-bit copy (bit 별 복사)가 수행된다. 필드가 reference type 인 경우 reference 가 복사되지만 reference 된 객체는 복사되지 않는다. 이로 인해 원본 객체와 새로운 개체의 복제본은 동일한 객체를 참조하게 된다. 아래 그림 처럼 shallow clone 은 reference 형태를 가진 객체만 복사가 안된다는 점..

    C# ?? 및 ??=, ?. 연산자

    C# 코드를 작성하다보면 null 체크를 해야하는 경우가 꽤 많다. if 문을 사용해서 null 체크를 하다보면 코드가 길어지고 가독성이 떨어지게된다 그래서 C# 에서는 간단한 연산자로 null 체크를 할 수 있는 방법을 제공한다. 연산자 ?. 및 ?[] 피연산자가 null 이 아닌 것으로 평가되었을 때만 멤버 액세스 ?. 또는 요소 액세스 ?[] 연산을 피연산자에게 적용하며, 그렇지 않으면 null 을 반환한다. a가 null로 평가되면 a?.x 또는 a?[x]의 결과는 null이다. a가 null이 아닌 것으로 평가되면 a?.x 또는 a?[x]의 결과는 각각 a.x또는 a[x]의 결과와 같다. Null 조건부 연산자는 단락 연산자이다. 즉 조건부 멤버나 요소 액세스 작업의 한 체인의 작업에서 null..