안녕하세요 삽잡이입니다.
이번 시간에는 지난 시간에 이어서
기본적인 닷넷 프레임워크의 기본에 대해서 알아보도록 하겠습니다.
이 그림을 보면 모든 기능을 닷넷에서는
기본 클래스인 BCL에서 제공한다는 것을 확인할 수 있습니다.
닷넷 이전에는 API를 활용해서 클래스 라이브러리를 만들었습니다.
그런데 닷넷은 그런 라이브러리를 사용하는 것이 아니라
자신만의 핵심적이고 독립적인 라이블러리르 사용하는 것이지요...
또한 Runtime Library라는 CTS를 닷넷은 가지고 있습니다.
이는 Type System으로써 공용으로 사용 가능한 타입 시스템이라는 의미를 가지고 있습니다.
닷넷에서는 모든 언어의 라이브러리, 문법에서 사용할 수 있는 기능을 '타입'이라고 부릅니다.
타입을 논하기 이전에 우선 객체에 대해서 생각해보는 시간을 가져보려고 합니다...
컴퓨터 프로그램을 크게 두 가지로 분류하자면 '명령'과 '데이터'로 분류할 수 있습니다.
명령은 일반적으로 메소드인 함수로 만들어져있으며
데이터는 일반적인 타입들로 만들어져 있습니다.
객체지향은 객체의 단위를 뭐로 만듭니까?
객체 지향은 데이터와 명령을 연결지어서
'데이터와 데이터를 다루는 명령들'을 하나로 묶어 단위로 만듭니다.
객체라는 단어를 여러가지로 정의 내릴 수 있지만,
프로그램 언어 측면에서는
같은 성향의 명령어와 데이터를 묶어서 단위로 만든 것이 객체라고 할 수 있다는 것입니다.
왜냐? 관련성이 있기 때문이지요...
즉, 특정 데이터는 특정 명령들과만 놀고,
특정 명령들은 특정 데이터들과만 노는 것을 말하는 것입니다...
모든 데이터가 모든 명령들과 혹은 그 반대의 경우는 없기 때문이지요...
아무튼... 이와 같이 객체를 만들려면 정의가 필요합니다.
즉, 하나의 단위로 가지고 놀 수 있는 정의 말입니다.
그게 바로 class 이지요...
객체 지향이라는 용어가 들어가는 곳에서는 모든 애들을 클래스로 바라봅니다.
아무것도 바라보지 않고 오직 class로만 바라본다는 것입니다.
여기서 알 수 있는 것은 class는 어떤 객체를 정의하는 형식이라고 할 수 있다는 것입니다.
어떤 객체의 정보를 보는것... 이게 바로 위에서 언급한 '타입'이라는 것이지요...
그래서 객체 지향 언어가 아닌 곳에서 타입은
일반적으로 데이터의 형식, 정의라고 하기 때문에 데이터의 타입이라고 부릅니다.
하지만, 객체 지향에서는 그냥 타입이라고 부릅니다.
이는 데이터의 타입만을 말하는 것이 아니기 때문입니다.
타입에 대해서 알아보려고 하니 이렇게 까지 왔군요...
아무튼... 다시 말씀드리지만,
객체지향에서는 모든 놈들을 클래스로 바라봅니다. 왜냐하면 객체에 대한 정의이기 때문이지요.
그리고 이 클래스를 '타입'이라고 부르는 것입니다.
결론적으로, 타입 라이브러리라는 것은 클래스 라이브러리라는 뜻입니다.
Java와 같은 계열에서는 Class의 집합으로 바라보지만,
.Net에서는 Class를 다른 이름들로 분류를 시켜놨습니다.
클래스, 이노머레이션, 구조체 등등으로 말입니다...
그래서 객체지향에서는 CTS는 클래스이지만, 닷넷에선는 그냥 타입이라고 부릅니다.
아무튼... 그렇다면 CTS는 Common Type System의 약자인데
Common Class System이라고 불러도 되겠군요...
그런데 클래스보다는 좀 더 범용적으로 넓힐 수 있기 때문에 CTS라고 부르는것이지요...
자... 닷넷의 Type은 5개입니다.
1. 인터페이스
2. 클래스
3. 구조체
4. 딜리게이트
5. Enum(열거형)
이렇게 말입니다...
그런데 우선 이 인터페이스는 왕따입니다... 왜냐하면 혼자 클래스가 아니기 때문입니다...
C++에서는 인터페이스도 class 였는데 말입니다.
인터페이스라는 용어 자체가 없기 때문에 C++에서는 인터페이스도 클래스였는데...
아무튼... 나머지 type들은 클래스입니다...
왜냐면 정의를 클래스로부터 시작하기 때문입니다.
모든 타입의 부모는 Class Object 입니다.
이 놈이 닷넷 BCL의 가장 최상위 클래스이지요...
모든 떨거지들은 이 놈으로 부터 파생됩니다.
즉, 어떤 객체가 만들어진다고 하면 무조건 부모는 Object입니다...
모든 클래스, Enum, 구조체, 딜리게이트 등등 Object로부터 파생해서 만들어지는 것입니다.
하지만, 오직 인터페이스만이 Object로 파생되지 않습니다.
인터페이스는 인터페이스이지 Object가 아니기 때문입니다.
객체지향에서 가장 중요한 단어가 여러가지 있는데 꼽으라고하면
인터페이스, 클래스, 객체, 추상화, 메시지 를 꼽을 수 있습니다.
그정도로 인터페이스는 중요한 것입니다...
아무튼... Type은 다섯가지입니다.
그리고 인터페이스는 그냥 인터페이스일 뿐입니다...
누구로부터 상속받지 않고 누구로부터 구현되어있지 않습니다.
그리고 그 외에 나머지는 클래스입니다.
Class Object를 모두 다 최상위 부모로 가지고 있기 때문에 중요합니다.
자... 그래서 CTS가 뭐냐면 말입니다... (참 오래도 왔습니다...) 공용적인 체계를 뜻합니다.
닷넷은 여러개의 언어가 닷넷을 쓸 수 있게 만들었기 때문에
언어마다 사용할 수 있는 모든 타입을 제공합니다.
그리고 우리가 프로그램을 한다는 것은 CTS의 타입을 가져다 쓴다고 생각하시면 됩니다.
즉, 프로그램을 할 때에 CTS를 가져다 쓴다 이겁니다...
따라서 CTS를 만든것입니다...
이 CTS에는 내장 타입이라는 타입이 있습니다.
내장 타입은 닷넷이 이미 정해놓은...
즉, 컴파일러가 알고 있는 아무것도 정의하지 않고 사용하지 않아도 되는 의미를 가지고 있습니다.
결과적으로 그대로 사용을 하면 컴파일러는 이미 알고 있기 때문에
아무런 문제 없이 사용할 수 있습니다.
다시 말씀드리지만 이를 내장 타입이라고 부르는 것이구요...
내장 타입은 수치타입, 문자 타입, 참조 타입으로 나눌 수 있습니다.
수치타입은 정수 및 실수 등을 표현하고,
문자 타입은 char를 표현합니다.
그리고 참조 타입은 딱 두가지 있습니다...
바로 Object와 String 입니다...
수치 타입, 문자 타입들은 이 참조 타입 외에 것들이라고 보셔도 무방합니다.
즉, Object, String 외에는 참조 타입이 아닌 값 타입(수치 타입 + 문자 타입)으로 부를 수 있다는 것입니다.
CLS는 약속입니다.... 즉, 사양을 말하지요...
Language에 대한 사양, 스펙, 규칙이라고 볼 수 있습니다.
왜 필요할까요?
CTS는 타입에 대한 정의라고 했습니다.
여기에는 대략 50여개의 프로그램 언어에 대한 타입이 들어있습니다.
그런데 언어는 다릅니다...
만약, C#에서 제공하는 것을 VB에서는 제공을 하지 않고,
VB에서 제공하는 것을 Python에서 제공하지 않는다면...
즉, 어떤 언어에서든 개발해도 다른 언어에서 사용하는 기능을 닷넷에서 추가하는데
A라는 언어에서 K를 제공하고, B라는 언어에서 K를 제공하지 않는다면
B라는 언어에서 K를 가져다 쓸 수 없지 않습니까...
그러니까 CLS를 만들어서 내가 만들어 놨던 기능이나
클래스, 메소드, 인터페이스를 다른 언어에서 쓸 수 있도록 해야되지 않습니까...
즉, 모든 언어가 공용으로 사용되는 타입만으로 구현해야 기능을 사용할 수 있다는 것입니다...
그게 바로 CLS이구요...
예를 들어서 unsigned의 경우 CLS에서 사용하지 못하도록 정의되있습니다.
왜냐하면 어느 언어에서는 unsigned를 제공하지 않기 때문이지요.
계속 해서 예를 들도록 하겠습니다...
VB에서 만든 프로그램을 다른 곳에서 쓰게 만드려면
C#에서는 내부적으로 unsigned를 사용하지만...
외부적으로는 unsigned를 쓰지 않는 것처럼 하는 것입니다..
그러면 다른 곳에서도 사용할 수 있게 되겠지요... 이러한 규칙들이 CLS에 들어가있는 것입니다...
마지막으로 하나만 더 확인해보도록 하겠습니다...
실제 BCL과 CLR은 어디에 위치해있을까요?
기본 클래스 라이브러리인 BCL은 mscorlib.dll 파일에 들어있습니다.
그리고 CLR의 물리적인 파일명은 mscoree.dll에 들어있지요...
지금까지 가장 중요한 3개의 개념인
CLR(Common Language Runtime), CTS(Common Type System),
CLS(Common Language Specification)
에 대해서 간략(?)하게 알아봤습니다.
이상 삽잡이였습니다!
<참고 : C# and the .Net 4 Platform>
'삽질의 현장 > - .NET' 카테고리의 다른 글
#006_닷넷(.NET)_.Net Framework 기본 - namespace & 타입 & 가시성 (0) | 2015.10.22 |
---|---|
#005_닷넷(.NET)_.Net Framework 기본 - 문자열 (1) (0) | 2015.10.22 |
#004_닷넷(.NET)_.Net Framework 기본 - 인터페이스 (0) | 2015.10.22 |
#003_닷넷(.NET)_.Net Framework 기본 - 어셈블리 (0) | 2015.10.21 |
#001_닷넷(.NET)_.Net Framework - 기본 & CLR & CIL (0) | 2015.10.21 |