개발자 노트 (Developer's Notes)

C# 제네릭에서의 불변성과 가변성

C# 제네릭에서의 불변성과 가변성 C#에서 가변성은 배열, 델리게이트, 제네릭에 적용될 수 있는데, 여기서는 제네릭에 포커스하여 가변성을 살펴본다. C# 제네릭(generics)은 불변성(invariance)와 가변성(variance)를 지원한다. C# 3.0 / .NET 3.5 까지는 제네릭은 불변성만을 지원하였으나, C# 4.0 / .NET 4.0 부터는 제네릭에서 불변성과 가변성을 모두 지원하였다. 가변성(variance)이란 암묵적인 레퍼런스 변환(

 
by csharpstudy | 4/12/2020
 

Docker를 이용한 TLS 테스트 방법에 대하여

HTTPS는 SSL/TLS 프로토콜을 기반으로 하고 있는데, 낮은 버전의 SSL/TLS는 Man-in-the-middle 공격에 노출되기 쉽기 때문에, 최근들어 금융권을 비롯한 엔터프라이즈에서 TLS 1.2로 업그레이드하는 추세이다. 이에 맞춰, C# /.NET 응용프로그램에서도 TLS 1.2를 지원하도록 수정할 필요성이 생기고 있다.

 
by csharpstudy | 3/13/2018
 

빅데이타 언어 U-SQL과 C#

마이크로소프트는 내부적으로만 사용하고 있는 빅데이타 시스템을 갖고 있는데, 이를 Cosmos라 부른다. Cosmos는 예전 MSN 에서부터 개발되어 현재 Bing 그룹이 사용하고 있다. Bing이 사용하는 자동화된 서버 Provisioning 시스템이 Azure를 통해 상용화 되었듯이, 분산 데이타 처리를 위해 설계된 Cosmos의 빅데이타 시스템도 Azure Data Lake 서비스로 상용화 되고 있는 것 같다.

 
by csharpstudy | 1/17/2016
 

C# Virtual Table의 구조와 Polymorphism에 관한 이해

이 아티클은 C#의 Virtual Table 구조를 통해 객체지향프로그래밍의 다형성(Polymorphism)이 어떻게 구현되는지를 간략히 정리한 글이다. 

 
by csharpstudy | 2/25/2015
 

C# 파생클래스 객체의 메모리 표현에 관하여

예전의 아티클 "C# 클래스 객체는 어떻게 Managed Heap에 표현되는가?"은 한 클래스 객체가 어떻게 Heap 메모리에 표현되는지에 대해 설명하였다. 이번 아티클에서는 Base 클래스를 갖는 파생클래스(Derived Class)가 어떻게 메모리에 표현되는지에 대해 알아보자.

 
by csharpstudy | 2/24/2015
 

C# Closure 이해하기

Closure란 무엇인가? C#에서 Closure는 어떻게 구현되는가? C#에서 Closure는 어떤 곳에 사용되는가? 이 아티클은 이러한 질문에 대한 답변을 정리한 글이다.  

 
by csharpstudy | 10/30/2014
 

C#의 Heap

C# 프로그램을 실행하면 4개의 Heap이 생성된다 - Process Heap, JIT Code Heap, Small Object Heap, Large Object Heap.

 
by csharpstudy | 10/23/2014
 

C# string에 대한 3가지 오해

C#에서 한 문자는 항상 2바이트를 차지하는가? C# string 객체는 코드페이지에 따라 다른 인코딩을 가질 수 있는가? 하나의 C# string 변수는 동일한 메모리에 여러 번 다른 문자열을 가질 수 있는가?

 
by csharpstudy | 10/18/2014
 

디버거를 통해서 본 C# Generics

C# Generic Type은 컴파일시 Type Parameter 정보를 갖는 IL과 메타데이타를 생성한다. 런타임시 이러한 Generic Type이 처음 호출될 때, IL을 JIT 컴파일하는 단계에서 Type Parameter를 실제 타입으로 대체하게 된다. C#의 Generics는 런타임시에 Type Instantiation을 한다는 점에서 컴파일시에 Type을 매크로처럼 새로 만드는 C++와 다르며, 또한 C# Generics는 런타임시에 구체적인 타입을 생성해 낸다는 점에서 구체적 타입을 제거하는 Java와 다르다.

 
by csharpstudy | 8/27/2014
 

C#, IL 그리고 Native

C++ 혹은 Native 코드를 써왔던 C# 개발자들은 간혹 C# 코드가 Native처럼 실행되기를 바랄 때가 있다. 이 개발자들은 문득 C++ 처럼 빠른 스피드에 대한 회상에 젖거나 혹은 ILSpy로도 쉽게 복원되지 않는 C# Native(?) 코드를 갖고 싶어할지도 모른다. 그렇다면 이것은 가능할까?

 
by csharpstudy | 8/21/2014
 

모달 vs 모달리스 다이얼로그 - 쓰레드와 메시지 루프

이 아티클은 Modal 다이얼로그와 Modeless (혹은 Non-Modal) 다이얼로그의 쓰레드와 메시지 루프에 대한 간략한 Summary를 담고 있다. 윈폼을 예제로 사용하고 있지만, 기본 원리는 WPF에도 똑같이 적용된다.

 
by csharpstudy | 7/2/2014
 

쉬운 C# 코드를 어럽게 이해하기

아래와 같은 아주 단순한 C# 코드가 실행되었을 때, 내부적으로 어떠한 일이 일어날까?

 
by csharpstudy | 6/19/2014
 

Roslyn - C# 컴파일러 API 에 대하여 (3)

이번 아티클에서는 Senmatic Analysis와 관련된 API 에 대해 좀 더 자세히 알아보고자 한다. 지난 아티클에서 CSharpCompilation 객체를 생성하는 부분을 설명했었는데, 이 CSharpCompilation 객체가 생성된 후에 해당 객체의 GlobalNamespace 속성을 참조하면, 소스코드로부터 얻어진 심벌들을 계층적으로 검색할 수 있다. GlobalNamespace 속성은 INamespaceSymbol 인터페이스를 갖고, 이로부터 GetMembers() 호출하면 하위 심벌 노드들을 얻어낼 수 있다.

 
by csharpstudy | 6/13/2014
 

Roslyn - C# 컴파일러 API 에 대하여 (2)

지난 아티클 (1) 에서는 Parser와 Syntax Tree를 통해 프로그램의 구조를 체크할 수 있는 Syntax API를 살펴보았다. 이번 아티클에서는 컴파일 과정과 관련된 API들에 대해 간략히 살펴보고자 한다.

 
by csharpstudy | 6/12/2014
 

Roslyn - C# 컴파일러 API 에 대하여 (1)

Roslyn은 C# 6.0 컴파일러를 제공함과 더불어 컴파일러의 각 단계별 기능들을 개발자가 직접 활용할 수 있도록  Compiler API 도 제공하고 있다. 이 Compiler API를 이용하면 개발자는 컴파일러 내에서 일어나는 기능들을 활용한 다양한 응용 프로그램을 만들 수 있다. 이번 아티클에서는 C# 코드를 문자열로 받아들여 이를 파싱해서 구문 분석(Syntax Analysis)을 실행하는 API를 살펴보자.

 
by csharpstudy | 6/5/2014
 

C# 6.0의 새로운 기능들

*주: 이 아티클은 2014년 6월에 작성된 글로서 C# 6.0에는 아래 기능들 중 삭제되거나 추가된 기능들이 있습니다. 최신 업데이트는 http://www.csharpstudy.com/CS6/CSharp-6-new-features.aspx 사이트에 정리되어 있습니다. 차기 버전인 C# 6.0 은 기존에 일상적으로 반복되었던 코드들을 보다 간결하게 해주는 편리한 기능들을 제공할 예정이다. C# 2.0의 Generics, C# 3.0의 LINQ과 같은 큼직 큼직한 Feature들을 제공하지는 않을 것으로 보이지

 
by csharpstudy | 5/29/2014
 

C# delegate의 내부 구조에 대하여 II (MultiCast)

지난 SingleCast C# delegate 내부구조 아티클에 이어 이번에는 복수개의 델리게이트를 가진 MultiCast C# delegate의 내부 구조를 살펴보자. (주: C# delegate의 내부 구조에 대하여 I (SingleCast) 을 읽지 않은 분들은 먼저 그 아티클을 읽기 바랍니다.)

 
by csharpstudy | 4/2/2014
 

C# delegate의 내부 구조에 대하여 I (SingleCast)

C# delegate는 메서드에 대한 레퍼런스를 Encapsulation하여 이를 다른 곳으로 전달하거나 호출할 수 있는 기능을 제공한다. C#의 delegate는 기본적으로 Multicast 기능을 가지고 있으며, .NET의 MulticastDelegate 클래스를 기반으로 하고 있다.

 
by csharpstudy | 4/2/2014
 

HTML img 태크에서 DB에 저장된 이미지를 지정하는 방법

이미지가 파일로 존재하는 경우, 이미지를 웹페이지에 삽입하는 것은 HTML img 태크를 통해 간단하게 표현할 수 있다. 하지만 이미지가 Database 내에 존재한다면, 이는 간단한 문제가 아니다.

 
by csharpstudy | 3/11/2014
 

C# ?? 연산자

SQL Server에 COALESCE() 라는 함수가 있다. 이 함수는 함수 파라미터들이 NULL이 아닐 때까지 계속 체크를 해서 NULL이 아닌 파라미터의 값을 리턴한다.

 
by csharpstudy | 2/27/2014
 

Push를 통한 데이타 Refresh 기법

데이타를 서버로부터 가져오는 일반적인 방식은 클라이언트가 서버에 데이타를 요청하는 Request를 보내고, 서버는 요청된 데이타를 DB 테이블로부터 읽어 클라이언트에게 주는 것이다. 이러한 방식은 클라이언트가 필요할 때마다 자료를 서버에 요청한다는 점에 On-demand Pull 방식의 접근이라 할 수 있다.

 
by csharpstudy | 1/23/2014
 

객체의 메모리 레이아웃에 대하여

클래스 혹은 구조체 객체의 크기는 일반적으로 필드 크기의 합보다 크게 표시되며, 객체의 필드들은 개발자가 정의한 순서대로 메모리 상에 위치하지 않는다. 이 노트는 이러한 현상의 이유와 해결법을 알아본다.

 
by csharpstudy | 12/22/2013
 

Web API : 사용자 인증에 관한 메모

웹서비스를 개발하는 방식으로 최근 각광을 받고 있는 기술 중의 하나로 RESTful Web Service를 들 수 있다. 그리고 .NET에서 RESTful Web Service를 개발하는 방식으로는 WCF REST 혹은 ASP.NET WebAPI 가 일반적이다. 이 노트에서 REST 서비스를 개발함에 있어 공통적으로 경험할 수 있는 몇가지 문제들을 정리하고자 한다.

 
by csharpstudy | 12/16/2013
 

마이크로소프트의 빅데이타 COSMOS

Summary: 마이크로소프트의 빅데이타인 COSMOS 시스템에 대한 간략한 소개

 
by csharpstudy | 12/4/2013
 

C# Destructor를 사용하지 못하는 struct

C# 클래스에서 소멸자(Destructor)는 소위 Unmanaged 리소스를 Clean up하기 위해 사용된다. 그렇다면, class가 아닌 struct 에도 Destructor를 사용할 수 있을까?

 
by csharpstudy | 9/26/2013
 

ADO.NET Connection Pooling과 SQL 트랜잭션

일반적으로 트랜잭션이 SQL 서버에서 끝나지 (Commit 되지) 않은 경우, 클라이언트에서 Connection이 끊어질 때, SQL Server는 완결되지 않은 트랜잭션을 Rollback하게 된다.

 
by csharpstudy | 8/18/2013
 

C# 클래스 객체는 어떻게 Managed Heap에 표현되는가?

C#에서 클래스 객체 (오브젝트)를 생성하면 이는 CLR Managed Heap에 생성된다. 이 아티클은 이러한 객체가 어떻게 Heap에서 표현되는지, 즉 객체가 Heap의 메모리 공간에 어떤 형태로 저장되는지를 살펴본다.

 
by csharpstudy | 7/21/2013
 

인터페이스의 암묵적 구현과 명시적 구현

C#에서 클래스는 하나의 Base 클래스와 여러 개의 Interface들을 상속/구현할 수 있다. 클래스는 인터페이스가 지정된 경우 이 인터페이스가 갖는 메서드들을 모두 구현해야 한다. 메서드를 구현하는 방법은 암묵적 구현(Implicit Implementation)과 명시적 구현(Explicit Implementation) 으로 나눌 수 있다.

 
by csharpstudy | 7/11/2013
 

C# 어셈블리에 Delay Sign은 왜 하는 것일까?

이전 아티클 (http://bit.ly/14k9d86)에서 설명한 바와 같이 어셈블리의 Digital Signature를 생성하기 위해서는 private/public key pair 중 private key를 사용하게 된다. 일반적으로 개발회사에서 이 private key는 각별한 보안을 유지 하기 때문에, 개발 기간 동안은 매 빌드마다 private/public key 파일을 사용하지 않고, public key만을 가진 키 파일을 사용한다.

 
by csharpstudy | 6/30/2013
 

C# 어셈블리에 사인(Sign)은 왜 하는 것일까?

C# DLL (또는 EXE 파일) 어셈블리에 사인(Sign)은 왜 하는 것일까? 만약 사인하지 않는다면, 어떠한 제약사항이 있을까?

 
by csharpstudy | 6/30/2013
 

CLR 쓰레드와 OS 쓰레드의 관계에 대하여...

CLR 쓰레드는 어떻게 OS 쓰레드와 다른가? CLR 쓰레드와 OS 쓰레드의 관계를 살피는 것은 CLR에서의 멀티 쓰레딩 환경을 개념적으로 이해하는데 도움이 된다.

 
by csharpstudy | 6/25/2013