SqlerCSharp_SRC.zip

 

 

2000년 6월 Microsoft PDC(Professional Developers Conference) 2000 에서 Microsoft가 닷넷(.NET) 전략에 대해 발표한 이후 Microsoft의 제품들은 계속해서 닷넷과 통합이 이루어 지고 있다. (SQL Server, Office, Sharepoint 등) 특히 C#은 닷넷 전략이 발표 되면서 기존의 언어와는 다른 닷넷 환경에 최적화된 언어의 필요성에 의해 새롭게 탄생된 언어이다.

 

2c8a3dcb03a8e2fe6a75d2738234d33b.png

[닷넷 프레임워크 버전별 변화]

 

닷넷을 지원하는 언어는 Visual Studio에서 기본으로 지원하는 C#과 더불어 Visual Basic, Visual C++, F# 이외에 Delphi, Cobol, Iron Ruby, Iron Python 등 다양한 서드파티(3rd Party)에서 지원을 하고 있다. (http://www.dotnetlanguages.net/DNL/Resources.aspx) 하지만, 닷넷을 지원하는 다양한 언어들이 이미 예전에 개발된 컴파일러 및 언어적 특성을 닷넷을 지원하기 위해 적절히 수정하여야 했고, 닷넷의 장점을 십분 발휘하기 쉽지 않았다. C#은 탄생부터 닷넷을 위해 설계가 되었으며, 닷넷의 개발 장점을 가장 잘 가지고 있는 언어가 아닌가 생각 한다.닷넷 개발시 많은 곳에서 C#을 기본 언어로 사용하고 있으며, C++의 강력한 성능과 Visual Basic, Java와 같은 유연함을 함께 가지고 있는 훌륭한 언어라고 볼 수 있다. 또한 C#은 Standard ECMA-334 (http://www.ecma-international.org/publications/standards/Ecma-334.htm), ISO/IEC 23270:2006 (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=42926)의 표준으로 등록이 되어 있다.

 

 

81dc8f875040002b5a349fe697d03687.png

[C# 버전별 주요 특징]

 

  • C# 1.0

과거 CS(Clinet-Server) 환경에서 웹 기반 솔류션(Solution)으로 빠르게 이동이 되면서, 기존 프로그램 언어와 플랫폼으로는 시장의 빠른 흐름에 대응하기에는 한계점을 가지고 있었다. Microsoft는 이러한 문제점을 해결하기 위하여 닷넷 프레임워크 1.0과 C# 1.0, Visual Studio 2002를 시작으로 닷넷이 세상과 첫 만나게 된다. 기존 개발자가 모든 상황에 대한 처리 코드를 작성해야 했다면, 닷넷으로 넘어 오면서 메모리 관리는 가비지 컬렉션(Garbage Collection) 으로, DLL Hell은 전역 어셈블리를 통한 버전 관리 등과 같이 프레임워크 차원에서 관리되는 형태로 변화 되었다. 그만큼 개발자는 비즈니스를 구현하는데 집중을 할 수 있게 되었다.

 

  • C# 2.0

현재 가장 많이 사용 되고, 현재 닷넷 기술의 기틀이 자리 잡은 중요한 시기이다. 가장 큰 특징은 제네렉(Generic) 지원이다. 이전에는 모든 컬렉션(Collection)이 오브젝트(object) 형식만 지원하여 값 형식(Value type)을 컬렉션에서 사용할 경우 참조 형식(Reference type)으로 변환하고 다시 원본 형식으로 캐스팅 하는 박싱(Boxing), 언박싱(Unboxing) 작업으로 성능에 안 좋은 영향을 미쳤었다. 하지만 제네릭 형식 선언 및 사용으로 좀더 강력한 형식 확인을 통하여 런타임 오류 및 잦은 형 변환에 따른 오버헤드를 줄 일 수 있게 되었다. 그리고 이터레이터(Iterator)를 쉽게 구현할 수 있는 yield, 델리게이트 사용이 간편해진 익명메서드(Anonymous Method), 값 형식의 널 형식(Nullable Type) 지원 및 널 형식의 기본값 설정을 쉽게 할 수 있는 "??" 연산자를 지원 하고 있다.

 

  • C# 3.0

여러 데이터원본(Object, DB, XML, 컬렉션 등)에서 데이터 처리를 위한 통합 인프라인 LINQ(Language INtegration Query)를 지원해 주고 있다. 그리고 많은 추가된 기능들이 LINQ와 연관을 맺고 있다. 조회데이터의 유연한 사용을 위한 Local variable type(var), 익명 형식(Anonymous type), 기존 객체의 소스 변경 없이 기능을 확장 할 수 있는 확장메서드(Extension Method), 좀더 간결한 코드로 객체 및 컬렉션 초기화를 위한 Object & Collection Initializer, 익명 메서드(Anonymous Method)를 더 쉽게 사용할 수 있는 람다식(Lambda)을 들 수 있다. 닷넷 프레임워크 3.0은 상당히 시기적으로 아쉬운 점이 있다. 닷넷 프레임워크 2.0 기반에 획기적인 응용기술을 선보였으나 개발툴인 Visual Studio가 뒷받침을 해 주지 않아 특히 WPF 개발에 있어서는 Visual Studio 2008(개발 코드명 Orcas) 출시 전까지는 닷넷 프레임워크 3.0 개발에 있어서 어려움이 많았다. Visual Studio 2005에서는 Extension previews 형태로 지원하다 Visual Studio 2008 CTP, Beta 출시 이후에는 Beta 툴로 정식 프레임워크의 기술을 개발하는 상황 발생이 발생한 것이다.

 

  • C# 4.0

닷넷 프레임워크(.NET Framework) 4.0으로 오면서 CLR(Common Language Runtime), Visual Studio, C# 모든 것이 새롭게 탄생 되었다.C# 4.0은 다이나믹(dynamic)을 기본 컨셉으로 Dynamic lookup(dynamic), Named and Optional Parameters, COM Interop, 공변성(Variance) 그리고 병렬처리와 같은 기술이 추가 되었다. C# 4.0에 대한 언어적인 세부 정보는 MSDN에서 다운로드 가능하다. (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=dfbf523c-f98c-4804-afbd-459e846b268e)

 

델리게이트(delegate)를 통해 본 C#의 변화 실 예제

C# 버전별로 어떻게 변화가 이루어 졌는지 일례로 델리게이트(delegate) 사용 방법 변화를 통해서 살펴 보자. 혹 현재 C#을 처음 접하게 되어 아래 내용이 이해가 잘 되지 않는다면, 먼저 다른 C# 주제를 먼저 학습한 후 읽어도 좋을 것이다.

 

우리나라 말로 델리게이트를 위임이라고 표현한다. 뜻 그대로 나 대신 일을 처리해 주는 것이다. 개발 측면에서는 가장 많이 사용하는 것이 이벤트(Event) 와 함께 사용이 된다. 스래드(Thread)를 사용하려면 ThreadStart라는 델리게이트에 위임 받을 메서드를 설정 하여 사용하게 된다.

 

public delegate void ThreadStart()

public Thread( ThreadStart start )

 

C# 1.0 에서는 일반적인 컴파일러 언어의 특징처럼 명시적으로 모든 것을 선언한다.

 

//C# 1.0 명시적(Explicitly) 선언

ThreadStart tStart = new ThreadStart(DoWork);

Thread thread1 = new Thread(tStart);

 

C# 2.0 에서는 2가지 변화를 가진다.

하나는 구문을 간소화 할 수 있는 부분, 그리고 무명 메서드를 통하여 명시적으로 메서드를 선언 하지 않아도 구문을 작성 할 수 있도록 되어 있다. 좀더 유연한 프로그램을 가능하게 해 준다.

 

// C# 2.0 묵시적(Implicitly) 선언

ThreadStart tStart = DoWork;

Thread thread1 = new Thread(tStart);

 

//C# 2.0 무명 메서드(Anonymous Method) 이용

Thread thread1 = new Thread

(

delegate()

{

Console.WriteLine("Do work");

}

);

 

C# 3.0은 무명 메서드에서 좀더 발전된 람다 표현식(Lambda Expression)을 통해서 델리게이트를 선언 할 수 있다. 특히 Func, Action 이란 특수 델리게이트 들을 통해서 확장 가능한 프로그램 작성이 가능하다.

 

// C# 3.0 람다 표현식(Lambda Expression)

Thread thread1 = new Thread

(

() =>

{

Console.WriteLine("Do work");

}

);

 

언어의 발전 방향을 살펴 보면 작성되는 코드를 좀더 적게 작성하면서, 직관적인 구문 형태로 변화 되는 것을 볼 수 있을 것이다.


[스레드 각 버전별 처리 예]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace SqlerCSharp.Ch01_01
{
    class Program
    {
        static void Main(string[] args)
        {
            //C# 1.0 명시적(Explicitly) 선언
            //C# 1.0 에서는 스레드 실행시 파라미터를 직접 넘길 수 없으므로 별도 처리가 필요
            ThreadExample tExam = new ThreadExample("C# 1.0 명시적(Explicitly) 선언");
            ThreadStart tStart = new ThreadStart(tExam.DoWork);
            Thread thread1 = new Thread(tStart);
            thread1.Start();
 
            //C# 2.0 묵시적(Implicitly) 선언
            //C# 2.0 부터 ParameterizedThreadStart 가능 
            ParameterizedThreadStart tStart2 = DoWork2;
            Thread thread2 = new Thread(tStart2);
            thread2.Start("C# 2.0 묵시적(Implicitly) 선언");
 
            //C# 2.0 무명 메서드(Anonymous Method) 이용
            Thread thread3 = new Thread
            (
                delegate(object data)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine("{0} : {1}", data, i);
                    }
                }
            );
            thread3.Start("C# 2.0 무명 메서드(Anonymous Method) 이용");
 
            //C# 3.0 람다 표현식(Lambda Expression)
            Thread thread4 = new Thread
            (
                (data) =>
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine("{0} : {1}", data, i);
                    }
                }
            );
            thread4.Start("C# 3.0 람다 표현식(Lambda Expression)");
        }
          
        public static void DoWork2(object data)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("{0} : {1}", data, i);
            }
        }
    }
 
    class ThreadExample
    {
        string _Data = "";
 
        public ThreadExample(string data)
        {
            this._Data = data;
        }
 
        public void DoWork()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("{0} : {1}"this._Data, i);
            }
        }
    } 

}