2장 닷넷 프레임워크
C# 언어 C# 언어란? C# 언어와 C++ 비주얼 베이직과 C++ 언어가 가지는 장점을 모아서 만든 언어가 바로 C# 언어 객체 지향 특성을 완벽하게 구현할 수 있도록 디자인되어 있기 때문에 비주얼 베이직에서 컴포넌트 프로그래밍을 하듯이 간단하게 프로그램을 작성 거의 비주얼 베이직 개발 환경과 비슷한 방식을 따름 C# 언어와 C++ 아직은 C# 언어로 만들 수 있는 프로그램에 한계가 있기 때문에 C/C++ 언어의 강력함을 넘어설 수는 없다 C++ 언어와 C# 언어는 프로그램 사용 분야가 많이 다르다 C# 언어와 C/C++ 언어로 만든 컴포넌트를 함께 사용하는 프로그램 방식이 쓰일 것이라 추측 사용자 인터페이스를 쉽게 만들어 낼 수 있다
C# 언어 C# 언어와 자바 C# 언어를 이용하면... C# 언어는 자바 언어와 굉장히 흡사하게 만들어진 언어 프로그램 종류 설명 콘솔 프로그래밍 Console 객체를 이용하며 도스 창에서 입출력을 할 수 있는 프로그램으로, 처음에 나오는 모든 예제는 콘솔 프로그램을 이용 Windows Form 객체를 이용하며 일반적인 윈도우 프로그램을 작성윈도우 폼에는 버튼, 리스트 박스, 텍스트 박스, 메뉴와 같은 다양한 컨트롤을 추가 ASP.NET Page 객체를 이용한 웹 프로그래밍 웹 폼과 웹 서비스를 만들 수 있다.
닷넷 C# 언어와 닷넷 닷넷 C# 언어를 배운다는 것은 곧 닷넷 프레임워크를 이해하고 배우는 것 닷넷에서 제공하는 기능을 그대로 사용 닷넷 닷넷(.NET)이란 마이크로소프트에서 내세우는 차세대 프로그램 웹을 기반으로 하는 애플리케이션에 좀 더 초점을 맞추어서 소프트웨어 제품과 웹 서비스를 개발할 수 있도록 도와주려는 의도 닷넷 언어 닷넷 프레임워크를 기반으로 실행되는 언어 현재 제공되는 닷넷 언어에는 C#, VB, 매니지드 C++ 프로그램 프로그래밍 언어와 무관하게 런타임을 이용해서 프로그램을 작성할 수 있다 어떤 프로그래밍 언어라도 닷넷 프레임워크를 사용 가능 닷넷 런타임을 사용하는 언어를 닷넷 언어
닷넷 CLR 닷넷 C# 언어를 배운다는 것은 곧 닷넷 프레임워크를 이해하고 배우는 것 닷넷에서 제공하는 기능을 그대로 사용 닷넷 CLR(Common Language Runtime)이란 닷넷 프레임워크 애플리케이션을 실행하는데 필요한 실행 엔진을 부르는 이름 애플리케이션을 실행하기 위해 필요한 것들이 있는데 이것을 런타임(runtime) 이라고 한다 다음과 같은 서비스를 제공 코드 및 메모리 관리 안정된 데이터형 관리 IL를 원시 코드로 변환 데이터형에 대한 정보 구하기 (메타 정보) 매니지드 객체에 대한 메모리 관리 예외 처리
닷넷 매니지드 코드와 매니지드 데이터 어셈블리 매니지드 코드(managed code)는 CLR에서 제공되는 서비스를 쓰도록 만들어진 코드 C# 언어나, VB.NET으로 작성된 코드는 모두 매니지드 코드 매니지드 코드에서 다루는 데이터가 곧 매니지드 데이터 모든 매니지드 데이터는 CLR 런타임에 의해서 자동으로 할당되고 관리 C# 언어와 같은 닷넷 언어는 특별한 키워드를 이용해서 특정 부분에 대해 매니지드 데이터가 아니더라도 다룰 수 있도록 할 수 있다 어셈블리 어셈블리(assembly)는 닷넷 프레임워크 애플리케이션의 기본 블록 단위 보통 DLL 파일 단위로 다루어지며 하나 또는 여러 파일로 구성 프라이빗 어셈블리(private assembly)는 하나의 애플리케이션에서만 사용 공유 어셈블리(shared assembly)는 하나 이상의 애플리케이션에서 참조 어셈블리를 공유해서 쓰려면 공유 이름을 지정하고 버전 번호와 함께 명시적으로 선언
닷넷 프레임워크 닷넷 프레임워크 닷넷 프레임워크는 닷넷 런타임(.NET Runtime) 환경을 제공하며, 닷넷 런타임은 여러 언어에서 공유할 수 있도록 디자인 닷넷 프레임워크는 CLR(Common Language Runtime)과 BCL(Base Class Library)로 구성 런타임이란 어떤 특정 언어로 만들어진 프로그램을 실행하기 위해서 시스템에 있어야하는 컴포넌트 각 언어별 런타임은 그 언어로 만들어진 프로그램을 실행하는데 필요한 기본적인 특성을 구현 프로그램이 실행되었을 때 자동으로 연결되어 실행되며 런타임의 기본 기능으로 실행
닷넷 프레임워크 CLR 런타임 CLR(Common Language Runtime)이란 닷넷 런타임을 부르는 명칭 모든 .NET 언어들이 하나의 런타임을 공유함으로써 다른 언어로 만들어진 컴포넌트나 프로그램이라 할지라도 바로 실행될 수 있도록 만든 것 컴파일러를 이용해서 소스 코드를 컴파일하면 IL(Intermediate Language) 코드를 생성 IL를 매니지드 코드(managed code)라고 부른다
닷넷 프레임워크 CLR 런타임 실행을 하면 클래스 로더(class loader)가 소스를 컴파일한 결과와 함께 필요한 기본 클래스 라이브러리를 읽어와서 조합 조합한 IL 코드는 실행 단계를 거쳐 닷넷 런타임에 의해 실행 C#에서 DLL은 컴파일러 옵션을 어떻게 주느냐에 따라 EXE 형태 또는 DLL 형태로 저장
닷넷 프레임워크 CLS 어떤 프로그래밍 언어이든지 닷넷 런타임을 사용할 수 있으며 닷넷 언어가 될 수 있다 CLR(Common Lanaguage Runtime)은 닷넷 언어에서 사용하는 런타임 어떤 프로그래밍 언어이든지 닷넷 런타임을 사용할 수 있으며 닷넷 언어가 될 수 있다 CLS(Common Lanaguage Specification)는 닷넷 런타임을 쓸 수 있는 언어가 되기 위한 규약 닷넷 언어가 되기 위한 일종의 스펙
닷넷 프레임워크 닷넷 언어 닷넷 런타임을 쓰는 프로그램을 닷넷 프로그램 대표적인 예가 C# 언어 그리고 VB.NET, C++.NET 언어 각 언어마다 컴파일러가 달라도 하나의 런타임을 사용하고 서로 컴파일한 결과를 이해할 수 있기 때문에 다른 닷넷 언어와 호환이 가능
닷넷 프레임워크 IL 코드 컴파일 단계 설명 IL(Intermediate Language) 코드는 말 그대로 중간 언어 코드 닷넷 프로그램을 실행하려면 두 단계를 거쳐야 한다. 서로 다른 언어라 할지라도 컴파일한 결과가 중간 언어 코드(IL)로 저장되기 때문에 닷넷 언어간에 호환이 가능 모든 닷넷 언어는 기본 클래스 라이브러리(BCL, Base Class Library)를 이용 IL 코드를 생성해주는 컴파일러는 C#.NET, VB.NET, 비주얼 C++.NET 컴파일 단계 설명 컴파일 과정 컴파일러를 이용해서 소스 코드를 컴파일 생성된 결과는 중간 언어(Intermediate Language) 코드 출력 파일은 exe 파일 실행 과정 IL 코드 파일을 실행했을 때 CLR 런타임이 자동적으로 프로세서가 이해할 수 있는 기계어로 변환
닷넷 프레임워크 IL 코드 형태 IL 코드는 기계어 셋과 바로 맵핑될 수 있도록 구성되어 있기 때문에 실행 과정이 아주 짧은 시간에 처리되어 실행 ILDASM.EXE 프로그램을 실행해서 간단한 프로그램의 IL 코드 IL 코드는 명령 셋으로 구성되어 있으며 단순한 기계어 명령 셋 뿐만 아니라 객체를 다루는 명령 셋도 포함
닷넷 프레임워크 IL 코드 형태 어떤 문자열을 읽고 어떤 메서드를 부르는지 어떤 클래스 라이브러리를 쓰고 있는지 볼 수 있다 클래스 라이브러리 중에서 항상 디폴트로 포함되는 어셈블리 mscorlib.dll을 사용 ILDASM 프로그램은 IL 역어셈블러 프로그램으로, 실행 파일에 있는 IL 코드를 직접 볼 수 있다 ildasm.exe hello.exe
가비지 콜렉팅 C++ 언어 메모리 관리 C/C++ 프로그램에서 메모리를 쓰려면 먼저 메모리를 할당하고 다 쓴 후에는 반드시 해제 필요 메모리 관리 코드는 항상 많은 버그를 유발하는 부분 메모리 리크(Memory Leak)로 발생 우려 메모리 리크 메모리를 할당한 후 해제하지 않아서 시스템에서 쓸 수 있는 메모리가 조금씩 줄어드는 것을 의미 C/C++ 프로그램에서는 메모리를 개발자가 직접 관리해주어야 하는데, 개발자의 실수로 실행 도중에 메모리가 조금씩 줄어드는 문제가 발생 서버 프로그램과 같이 장시간 실행되는 프로그램은 시간이 지나면 다시 실행 // C++ 언어에서 메모리 할당 예 char arr = new int [32]; .... delete [] arr; // 메모리를 다 쓴 후, 해제한다.
가비지 콜렉팅 메모리 관리 닷넷에서 사용하는 메모리 관리 방법은 가비지 콜렉션(Garbage Collection) 가비지 콜렉터는 힙에서 더 이상 쓰이지 않는 객체를 찾아서 제거 가비지 콜렉터는 System 네임스페이스에 GC(Garbage Collector)로 제공 GC 객체의 Collect 메서드를 불러서 임의로 가비지 콜렉팅을 요구 메모리가 가비지 콜렉터에 의해 관리 더 이상 메모리를 풀어주는 고민이나 메모리 리크(Memory Leak)와 같은 문제를 생각할 필요가 없다 // 가비지 콜렉팅 요구 System.GC.Collect();
가비지 콜렉팅 C# 언어 메모리 관리 C# 언어에서 할당하는 객체는 모두 가비지 콜렉터에 의해 관리 프로세스가 가질 수 있는 메모리 한계를 넘거나 메모리 리소스가 부족하다고 판단되는 경우 가비지 콜렉터가 메모리를 모으기 시작 가비지 콜렉터는 코드에서 사용했던 객체의 레퍼런스 카운트를 검사하고 더 이상 참조되지 않는 객체를 메모리에서 제거 { Point pt = new Point(); pt = null; // 객체 null 할당 // 임의로 가비지 콜렉팅을 하는 경우 GC.Collect(); // 가비지 콜렉터 부른다. GC.WaitForPendingFinalizers(); // 가비지 콜렉팅이 끝날 때까지 기다린다. }
닷넷 클래스 System 네임스페이스 System 네임스페이스는 시스템 라이브러리로, 기본 기능을 담고 있는 네임스페이스 string 형, int 형과 같은 기본 데이터형을 비롯해서 많은 클래스를 제공 네임스페이스 네임스페이스(namespace)는 같은 클래스 이름을 사용할 때 충돌을 줄이기 위한 것 클래스를 그룹으로 묶어놓은 것에 불과하지만 클래스 이름 앞에 접두어처럼 붙어서 클래스를 인식하는데 구별자로 사용 Console 클래스를 사용하는 경우, 실제로는 System.Console 클래스를 사용하는 것
닷넷 클래스 닷넷 클래스 닷넷 클래스에는 많은 기본 클래스가 있다 제공되는 클래스는 직접 사용하거나 상속받아 사용 윈도우 프로그래밍을 하는 경우, Form 객체를 상속받아 새로운 Form 객체를 정의 필요한 컨트롤을 추가하고 컨트롤 속성을 바꾸어 윈도우 프로그램을 작성
닷넷 클래스 폼 프로그래밍 윈도우 폼(Windows Form)은 윈도우 응용 프로그램을 개발할 때 사용하고, 웹 폼(Web Form)은 웹 프로그래밍을 할 때 사용 웹 폼은 기존 웹 프로그래밍 방식과 달리 폼을 기반으로 웹 페이지를 디자인하는 개발 환경을 제공 윈도우 폼 웹 폼
닷넷 클래스 리플렉션 어트리뷰트 리플렉션(reflection)은 실행 타임에 Type 객체로부터 클래스 정보를 구하는 방법 실행 타임에 클래스에 정의된 필드, 메서드 정보를 구하는 방법 어트리뷰트 어트리뷰트(attribute)는 클래스, 메서드 등등에 기타 정보를 더 추가하는 것 컴파일할 때 컴파일러에 의해 쓰일 수도 있고, 리플렉션을 이용해서 실행 도중에 어트리뷰트 정보를 구할 수도 있다 Type type = pt.GetType(); FieldInfo [] finfo = type.GetFields(); // 필드 정보 [Obsolete("이 메서드는 더 이상 사용되지 않습니다.")] public static void Method() {} [STAThread] void Main()
닷넷 클래스 콜렉션 클래스 웹 메서드 콜렉션 클래스는 데이터를 저장하는 데이터 구조 클래스 웹 서비스 프로그래밍에서 웹 메서드를 사용 웹 메서드는 다음과 같이 어트리뷰트를 이용해서 정의 콜렉션 클래스 콜렉션 클래스는 데이터를 저장하는 데이터 구조 클래스 자주 쓰이는 데이터 구조를 구현해서 라이브러리로 제공 ArrayList BitArray HashTable Queue SortedList Stack StringCollection [WebMethod] void string HelloWeb( string name ) {}
오류 처리 기존 오류 처리 오류 처리하는 방법은 리턴 값을 이용해서 성공적으로 실행이 되었는지 아닌지 판단 메서드를 성공적으로 실행했으면 true 값을 리턴하고, 오류가 있으면 false 값을 리턴하도록 프로그램을 구현 bool DoIt() { nError = 0; if ( nError ) return false; else return true; }
오류 처리 기존 오류 처리 DoIt()을 부를 때, 리턴 값을 받아서 오류 발생 여부를 구분해서 처리 기존에 많이 사용하던 오류 처리 방법 오류가 발생했는데도 불구하고 계속 실행을 계속할 것이기 때문에 결국 잘못된 값을 갖거나 프로그램이 멈춤 bool bSuccess = DoIt(); if ( !bSuccess ) { // 실패한 경우 } // 리턴값을 무시하는 경우 Dolt()
오류 처리 예외 처리 기존 오류 처리 방식이 갖는 단점을 보완하면서 좀 더 보강된 오류 처리 방법이 예외 처리 방식 메서드 안에서 오류가 발생하는 경우, 다음과 같이 예외 처리 오류가 발생했을 때 오류를 처리할 수 catch 문 코드로 이동 오류 처리 코드가 없다면 시스템에서 제공하는 예외 처리가 불려지면서 프로그램이 종료 bool DoIt() { nError = 0; if ( nError ) throw new System.Exception; }
오류 처리 예외 처리 예외 처리 방식은 라이브러리를 구축할 때 유용하게 사용 리턴 값으로 오류를 처리하는 것이 아니기 때문에, 연산자 메서드와 같이 리턴 값으로 오류를 확인할 수 없는 경우에도 오류 처리가 가능 C#에서 오류 처리 방법은 try/catch 문을 이용한 예외 처리 방식 try { DoIt(); } catch ( Exception e ) // 오류 처리
데이터형 닷넷과 C# 데이터형 C# 데이터형은 닷넷 클래스 라이브러리에서 정의한 데이터형을 바탕으로 정의 닷넷 플랫폼을 기반으로 실행되는 모든 닷넷 언어는 결국 같은 데이터형을 사용 C# 데이터형이 어떤 닷넷 데이터형과 연결되는지 데이터형 이름을 비교
데이터형 닷넷과 C# 데이터형 데이터형마다 크기가 다르며, 크기에 따라 가질 수 있는 값의 범위가 달라진다 Int32 형은 4바이트(32비트)를 필요로 하고, 범위는 -2,147,483,648 ~ 2,147,483,647 갖는다 C# 데이터형 C# 데이터형은 닷넷에서 제공하는 데이터형에 대한 별칭 int 형 변수를 선언할 때, int를 쓰거나 직접 System.Int32를 쓸 수 있다 int x = 123; System.Int32 x = 123;
데이터형 값형과 레퍼런스형 비교 종류 설명 닷넷에서 제공하는 데이터형은 변수가 어떤 값을 갖느냐에 따라 분류 두 가지 종류의 데이터형을 비교 값을 저장하는 메모리 영역이 다르다 할당 연산을 했을 때 동작하는 방식이 다르다. 값(value) 형은 스택(stack) 메모리 공간에 저장되며, 할당 연산을 했을 때 별도의 메모리 영역에 할당 종류 설명 값(value) 형 변수가 실제 데이터 값을 직접 가지고 있는 경우 레퍼런스(reference) 형 변수가 실제 데이터 값이 있는 곳을 가리키는 값을 갖는 경우 int v1 = 100;
데이터형 값형과 레퍼런스형 비교 레퍼런스(reference) 형은 힙(heap) 메모리 공간에 저장 할당 연산을 했을 때 힙 메모리 공간을 가리키는 레퍼런스 변수 값 사이에서 할당이 일어남 IntObj r1 = new IntObj();
데이터형 값형과 레퍼런스형 비교 종류 메모리 공간 스택(stack)과 힙(Heap) 스택(Stack) 힙(Heap) 데이터 값을 임시로 저장하는 메모리 영역으로, 보통 메서드의 인자, 메서드 안에 선언한 변수들이 스택 공간에 할당 힙(Heap) 일반적인 데이터 값을 할당하는 메모리 영역으로, 변수에 바로 데이터 값이 있는 것이 아니라 new 연산자를 사용해서 메모리를 할당하고 값을 저장
데이터형 값(value) 형 다음은 값(value) 형 데이터형 중에서 int 형을 사용한 예 v2에 값을 할당하는 경우 v2 값만 바뀌므로, v1 값과 v2 값이 별도의 메모리 공간을 갖고 저장되기 때문의 이유 class Test { static void Main() { int v1 = 100; int v2 = v1; Console.WriteLine( "v1 : {0} v2 : {1}", v1, v2 ); // 100, 100 v2 = 200; Console.WriteLine( "v1 : {0} v2 : {1}", v1, v2 ); // 100, 200 } }
데이터형 레퍼런스(Reference) 형 int 형 멤버를 갖는 클래스를 하나 정의 멤버 값을 바꾸게 되면 해당 변수뿐만 아니라 다른 변수에도 영향을 준다 r2에 값을 할당하는 경우, r1과 r2가 값이 동시에 바뀌며, 이유는 같은 힙 메모리 공간을 가리키고 있기 때문 using System; class IntObj { public int val = 100; }
데이터형 레퍼런스(Reference) 형 using System; class IntObj { public int val = 100; } static void Main() { IntObj r1 = new IntObj(); IntObj r2 = r1; Console.WriteLine( "r1 : {0} r2 : {1}", r1.val, r2.val ); // 100, 100 r2.val = 200; Console.WriteLine( "r1 : {0} r2 : {1}", r1.val, r2.val ); // 200, 200 }
마무리 마무리 C# 프로그램은 닷넷 프레임워크 없이 실행될 수 없다 프로그램 실행부터 메모리 관리까지 모든 것을 CLR 런타임이 관리 매니지드가 붙은 것들은 CLR 런타임에 의해 관리 C# 데이터형은 닷넷 데이터형을 바탕으로 하며, C#에서 말하는 int 형은 곧 System.Int32 형과 같은 데이터형 데이터형은 크게 값형과 레퍼런스형으로 분리 값형은 자체가 데이터 값이며 스택에 저장 레퍼런스형은 데이터 값이 있는 곳을 가리키는 값으로 실제 데이터는 힙에 저장