c#
[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..
C# 포인터 사용
C#에서는 포인터를 안전하지 않은(unsafe) 형식으로 지정하여 표면적으로는 지원하지 않고 있지만 기존의 C++의 라이브러리 등의 외부 라이브러리를 사용한다던가 프로그램의 비약적인 성능향상의 목적을 위해 사용할 필요성을 가지게 된다. 이러한 포인터를 사용하기 위해서는 다음과 같은 절차를 거쳐야 사용할 수 있다. 1. 솔루션설정변경 생성한 솔루션에서 설정메뉴를 통해 들어간 뒤 빌드를 확인하면 위와 같이 안전하지 않은 코드를 사용할 수 있는 체크박스를 확인할 수 있다. 이 항목을 체크하면 솔루션 내에서 포인터를 사용할 수 있는 조건을 만들어 주게 된다. 2. unsafe 블럭 생성 class Program { static void Main(string[] args) { int number = 10; uns..
C# 날짜 관련 함수(DateTime)
시간을 표현하는 방법 DateTime now; // 날짜 변수 now선언 now = DateTime.Now; // 현재시간 Console.WriteLine(now); // 현재시간 Console.WriteLine(now.Year); // 현재 년도를 보여줌 Console.WriteLine(now.Month); // 현재 월을 보여줌 Console.WriteLine(now.Day); // 현재 일을 보여줌 Console.WriteLine(now.DayOfWeek); // 현재 몇 주인지 보여줌 Console.WriteLine(now.DayOfYear); // 1년중 몇일째인지 보여줌 Console.WriteLine(now.TimeOfDay); // 금일 자정부터 몇시간 보여줌 Console.WriteLin..
C# DateTime & TimeSpan
DateTime 날짜와 시간을 나타내기 위해 사용한다. DateTime dt = new DateTime(2016, 08, 24); 기본 생성은 년, 월, 일을 사용해서 초기화 하는 것이다. DateTime dt = new DateTime(2016, 08, 24, 23, 30, 12); Console.WriteLine(dt.ToString()); 시, 분, 초 까지 줘서 초기화 할 수 도 있다. info["date"] = DateTime.Now; 현재 시간은 DateTime.Now 프로퍼티를 사용해서 얻을 수 있다. Console.WriteLine(default(DateTime)); 기본 값은 default(DateTime)으로 얻을 수 있으며, 0001-01-01 00:00:00 이다. DateTime ..
C# 각 타입별로 접근제한자 (Access Modifiers)
이중이 아닌것들 | Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | public, internal interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal 이중인것들 | Default | Permitted declared ..
C# 문자열 배열을 int 배열로 변환
1. Array.ConvertAll() 메서드를 사용 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Linq; namespace Array_of_String_to_integer { class Program { static void Main(string[] args) { //method 1 using Array.ConvertAll string[] temp_str = new string[] { "1000", "2000", "3000" }; int[] temp_int = Array.ConvertAll(temp_str, s => ..