프로그래밍 언어/C#

    [C#] 리플렉션 (Reflection) 예시

    리플렉션 개념 사용 방법 Assembly.GetType으로 접근하려는 Type 검색 Reflection을 사용하기 위해서는 Assembly.GetType을 통해 접근하고자 하는 클래스의 Type을 찾아야 한다. Type이라는 용어가 다소 생소할 수도 있는데, 클래스명 = Type이라고 생각하면 된다. public Type GetAuthDataManagerType() { //모든 assembly를 검색합니다. foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var test3 = assembly.GetTypes(); foreach (var type in assembly.GetTypes()) { //찾는 Type이 있을 경우 반환합니다...

    [C#] var 키워드

    var 사용 예제 var는 암시적 타입 지역변수(implicitly typed local variable) 이다. var는 데이터 타입을 개발자가 아닌 컴파일러(Compiler) 가 결정한다. 다음은 var 로 지역변수를 선언한 예제 코드다. 아래 예제에서 var idx의 값은 int형 정수 10으로 설정됨으로 컴파일러에 의해 int형으로 타입이 결정된다. var idx = 10; //Implicitly typed. int idx = 10; //Explicitly typed. 다음은 C#에서 사용하는 var 사용 예제코드다. using System.Linq; namespace VarTest { class Program { static void Main(string[] args) { // idx 변수 in..

    [C#] 참조에 의한 매개변수 전달 (ref, out)

    값에 의한 호출 (Call by value) 함수와 메소드를 호출할 때, 필요한 값들을 전달해주기 위해 매개변수에 값을 넣어 전달해 준다. 허나, 기본적으로 값 형식(Value type)은 매개 변수로 전달 시에 해당 인자의 값을 복사해서 전달을 한다. 이건 함수와 메소드에서 값을 리턴할 때도 마찬가지다. 이것을 값에 의한 호출(Call by value)이라고 한다. 두 매개 변수를 받아서 서로 값을 바꾸는 Swap() 함수에서 이런 예시가 자주 나온다. static void Swap(int x, int y) { int temp = x; x = y; y = temp; } static void Main(string[] args) { int x = 3; int y = 5; Swap(x, y); Console..

    [C#] 구조체 (struct)로 메모리 절약하기

    메모리의 타입(유형) 스택(Stack) 스택은 매우 단순하고 균일한 방식으로 할당되는 연속적인 메모리 영역이다. 메모리는 스택의 하위 메모리 주소에서 상위 메모리 주소로 할당 된다. 가장 최근에 할당된 메모리만 해제 할 수 있으며, 당연히 스택 맨 아래에 할당 된(먼저 할당 된) 메모리를 해제하려면 위에 할당된 메모리를 모두 해제해야만 한다. 스택에 할당 되지 않은 메모리는 단순한 메모리 포인터로 추적된다. 스택 영역에 메모리가 할당 되면 포인터가 적절한 양만큼 위로 이동한다. 반대로 메모리가 해제되면 포인터가 다시 아래로 이동한다. 실제 스택 영역에서 메모리가 해제 된다고 하더라도 메모리에 저장되어 있는 값을 지우는 것이 아닌 단순히 포인터만 이동하고, 해당 메모리는 필요 할 때 덮어 쓰여지게 된다. ..

    [C#] 관리되는, 관리 되지 않는 코드

    관리되는 코드 .NET CIL로 작성하고 컴파일 하는 .NET상의 코드 - GC 메모리 관리가 된다. 관리되지 않는 코드 기계 코드를 직접 컴파일 하도록 컴파일되는 .NET에 없는 코드 - GC 메모리 관리가 안된다. ex) 윈도우 시스템 자원 IntPtr - 인터포인터 관리되지 않는 메모리 블록에 대한 포인터 정수형 포인터를 의미하는 값 형식의 타입 포인터는 메모리 주소값을 보관하는 곳 IntPtr타입은 메모리 주소를 가리키는것 외에 윈도우 OS의 핸들값을 보관하는 용도로 쓰인다. 핸들은 윈도우 OS가 특정 자원에 대한 식별자로서 보관하는 값인데 일례로 파일이 좋은예다. 파일처리, OS에서 제공되는것 처리를 할때 사용된다. ex) 이미지 처리에서도 쓰인다. Marshal Class - 마샬 관리되지 않..

    [C#] 자료구조 : 해시테이블 (Hash Table)

    해시(Hash)는 키 값을 해시 함수(Hash function)으로 해싱하여 해시테이블의 특정 위치로 직접 엑세스하도록 만든 방식이다. 키 값을 통해 직접 엑세스하기 위해서 모든 가능한 키 값을 갖는 배열을 만들면, 배열크기가 엄청나게 커지게 된다. 예를 들어, 주민등록번호를 키 값으로 하는 경우, 000000-0000000 부터 999999-9999999까지 10의 13승의 배열 공간이 필요한데, 만약 회원수가 1000명인 경우, 1000명을 저장하기 위해 10^13의 엄청난 배열 공간이 필요하게 된다. 이렇게 낭비되는 공간을 줄이기 위해 해시 함수를 사용하게 되는데, 이 함수는 적은 공간 안에서 모든 키를 직접 찾아갈 수 있도록 해준다. 하지만 경우에 따라 서로 다른 키가 동일한 해시테이블 버켓 위치..

    C# Reflection 이용하여 Class 속성, 값 출력하기

    using System; using System.Collections.Generic; using System.Reflection; namespace ReflectionTest { class Program { static void Main(string[] args) { Student stu = new() { Name = "범범조조", Age = 29 }; School school = new() { SchoolName = "가나다학교", Area = "한국", since = 2021 }; // Student 객체 값 출력 PrintPropertyInfo(stu); Console.WriteLine(); // School 객체 값 출력 PrintPropertyInfo(school); // stu 학생의 친구 리..

    C# 클래스 할당시 메모리 구성 디버깅

    디스어셈블링 및 실제 메모리를 디버깅하면서 데이터와 객체를 할당시 어떤 구조로 메모리에 올라가는지와 C#에서 클래스를 할당하면, 힙이 어떻게 동작하는지를 보자 쉽게 보기 위해서 예제는 x86(32bit)로 컴파일되었고 이를 기준으로 설명한다 예제로 사용할 모습은 이와 같다. 아무 클래스나 하나 만들고 그 안에 문자열 하나와 int 하나를 선언, 구조체 역시 메모리를 살펴보기 쉽게 int형 두개로 선언했다 먼저 Case1 메소드를 디버깅해보자 Watch창에서 살펴보면 현재 testObject의 상태를 알 수 있고, '&testObject'로 testObject의 실제 메모리 주소를 볼 수 있다. C# 문법에서는 직접적인 포인터를 사용하려면 unsafe 옵션을 이용해서 사용 할수 있으나, 이는 그리 권장하는..

    [C#] Nullable type, int? 널러블 타입에 대해서

    1. Nullable Type 이란? C# Nullable Type 이란 Null 을 가질 수 없는 데이터 타입을 Null을 가질 수 있는 타입으로 만든 새로운 타입이다. 대표적으로 값 타입(value type)들이 Null을 가질 수 없는데요. int, 구조체, double, bool 등의 데이터 타입은 값이 없는 상태(NULL)이 불가능한 데이터 타입들이다. (클래스와 같은 reference type(=참조 타입)은 이미 Null 체크가 가능하기 때문에 따로 Nullable Type으로 만들지 않아도 된다.) int와 같은 값 타입에 대해서 "값이 없다"를 표현하기 위해 Nullable Type이 개발 되었다. 우리는 int를 nullable int type으로 변경함으로서 값이 할당 되었는지 아닌지..

    C# 공변성(Covariance)과 반공변성(Contravariance)

    사실 공변성과 반공변성을 통칭 가변성이라고 한다. 그리고 이와 반대되는 의미로는 불변성이 있다. 가변성(Variance) : 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 말한다. 공변성(Covariant) : X -> Y가 가능할 때 C가 C -> C로 가능하다면 이는 공변이다. 반공변성(Contravariant) : X -> Y가 가능할 때 C가 C -> C로 사용 가능하다면 이는 반공변이다. 불변성(Invariant) : X -> Y가 가능하더라도 C는 C로만 사용할 수 있다. 기본적으로 제네릭은 불변이다. 좀 더 상세히 설명하기 위해서 아래와 같은 다형성을 가진 환경이 있다고 가정해보자. class Base : ICompareable { public int Id { get; set..