c#
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..
C# static (정적) 메서드와 클래스
1. C# static 메서드 정적(Static) 메서드는 인스턴스 메서드와는 달리 클래스로부터 객체를 생성하지 않고 직접 [클래스명.메서드명] 형식으로 호출하는 메서드이다. 이 메서드는 메서드 앞에 static 이라는 C# 키워드를 적어 주며, 메서드 내부에서 클래스의 인스턴스 객체 멤버를 참조해서는 안된다. 이 static 메서드는 인스턴스 객체로부터 호출될 수 없으며, 반드시 클래스명과 함께 사용된다. 2. C# static 속성, 필드 정적(Static) 속성 및 필드는 위의 static 메서드와 같이 [클래스명.속성명]과 같이 사용하며, 다음 예와 같이 static을 앞에 붙여 정의한다. 클래스 내의 Non-static 필드들은 클래스 인스턴트를 생성할 때마다 메모리에 매번 새로 생성되게 되는 ..
C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값
Boxing ( 박싱 ) : 값 형식을 참조 형식으로 변환하는 것을 말한다. boxing은 암시적으로 발생한다. ( 예를 들어 int, float 를 object 로 변환하는 것을 말하는데 이 과정에서 단순 참조의 20배에 해당 하는 오버헤드와 메모리의 추가 사용이 발생한다. ) int test = 100; object tetsObj = test; UnBoxing ( 언박싱 ) : 참조 형식을 값 형식으로 변환하는 것을 말한다. Unboxing은 명시적으로 발생한다. ( 예를 들어 object를 int, float로 변환하는 것을 말하는데 이 과정에서 일반적인 할당의 4배에 달하는 시간이 소요된다. ) int test = 100; object testObj = test; int i = (int)test;..