본문 바로가기
카테고리 없음

C#이란 무엇인가?

by Lihano 2022. 6. 19.
반응형

처음 소개 하기

C#은 MicroSoft가 .NET 프레임워크와 함께 발표한 프로그래밍 언어입니다.

JAVA의 등장이 C#이 만들어지게 된 배경이기 때문에 두 언어는 유사한 점이 정말 많습니다.

C# 또한 JAVA와 같이 객체 지향 언어입니다.

JAVA를 사용했던 유저라면 알고있을 Garbage Collector, Nullable 형식, Exception 처리, Generic, Labmda식의 개념이 당연히 C#에도 존재합니다.

 

- JAVA와의 차이점

원시 타입의 차이.

JAVA가 불완전한 객체 지향 언어라고 지적받은 이유 중 하나가 원시 타입의 존재였습니다.

int, boolean과 같은 기본형 타입들은 Object로부터 상속받은 참조 타입이 아니었기 때문에 별도로 Wrapper Class의 존재를 만들어내야했죠.

하지만 C#은 JAVA의 이런 단점을 보완하여 기본형 타입도 전부 Object로부터 상속받는 형식으로 정의했습니다.

뿐만 아니라 기본 자료형에 unsigned와 decimal 타입도 추가하여 C언어의 특성도 적절히 조화시켰죠.

좀 더 자세한 JAVA와 C#과의 차이점은 다음 링크에서 자세히 다루도록 하겠습니다.

 

.NET 프레임워크와의 관계

C#을 사용하기 위해서는 먼저 .NET 프레임워크부터 알아야 합니다.

.NET 프레임워크는 FCL과 CLR 양쪽을 아울러 이르는 말입니다.

FCL(Framwork Class Library)은 .NET 프레임워크를 대상으로 하는 언어들이 사용할 수 있는 Class들의 Library입니다.

CLR(Common Language Runtime)은 공통 언어 런타임 클래스로 가상 머신의 기능을 합니다.

더보기

CLR은 국제 표준인 CLI(Common Language Infra)를 준수하여 MicroSoft가 만든 가상 실행 시스템입니다.

언어와 라이브러리가 함께 원활하게 동작하는 실행 및 개발 환경을 만듭니다.

JAVA가 다른 프로그래밍 언어와 차별되는 이유는 운영체제에 의해 실행되는 게 아니라 가상머신을 통해 실행됨으로서 운영체제 독립성을 가진다는 점입니다.

C#도 이와 마찬가지로 .NET 프레임워크를 통해 가상머신의 기능을 수행함으로서 운영체제 독립성을 확보할 수 있습니다.

 

MicroSoft가 .NET 프로젝트를 출시하고 이 특성을 잘 살리기 위해 동시에 C# 언어를 함께 발표했습니다.

그렇기 때문에 C#을 공부하기 위해서는 .NET을 함께 공부하는 게 맞습니다.

C#으로 작성된 코드는 .NET에 의해 실행되게 됩니다.

그 흐름을 살펴보자면 다음과 같습니다.

 

  1. 우리가 만든 C# 코드
  2.  IL 언어로 컴파일 되어 .dll 확장명으로 리소스(비트맵, 문자열 등)와 함께 어셈블리에 저장
  3.  프로그램 실행시에 .dll 파일은 CLR에 로드
  4.  CLR은 JIT(Just In Time) 컴파일을 수행하여 기계어로 번역

이런 흐름을 통해 실행되게 됩니다.

중간 언어인 IL 코드는 CTS(Change and Transport System)라는 규격을 따릅니다.

그렇기 때문에 .NET을 대상으로 하는 F#, Visual Basic, C++에서 생성된 IL 코드와 상호작용 가능합니다.

그 외에도 CTS 규격언어가 20개 이상 더 있습니다.

그렇기 때문에 단일 어셈블리는 다른 언어로부터 작성된 여러 IL 코드들을 포함할 수 있습니다.

그렇기 때문에 다른 언어지만 형식은 같은 언어인 것처럼 서로 참조할 수 있어요.

 

.NET 프레임워크에 대한 자세한 내용은 다음 링크에 더 자세히 정리하도록 하겠습니다.

 

프로그램 구조

C#의 주요 조직 개념은 다음과 같이 나누어집니다.

 

  • Program
  • Namspace
  • Type
  • Member
  • Assembly

Program이라는 건 말그대로 하나의 서비스. 동작하게 되는 프로그램을 의미하게 됩니다.

하나의 Program은 0개 이상의 Namespace로 구성되게 됩니다.

 

그리고 Namespace는 C#의 카테고리 시스템입니다.

무수히 많은 Class가 있다면 서로 충돌을 일으킬 수 있고 관리하기 힘들어집니다.

그렇기에 JAVA의 Package처럼 클래스들을 카테고리화하여 그룹으로 묶어 관리하는 겁니다.

다만 JAVA와의 차이점이라면,

 

  1. Namespace의 구조가 디렉토리의 구조와 일치할 필요가 없다.
  2. Namespace에 별칭을 지정하여 사용할 수 있다.
  3. 하나의 프로그램이 여러 Namespace와 매칭될 수 있다.

이런 차이가 있습니다.

 

그리고 Type과 Member에 대한 개념은 Java와 다를게 없기 때문에 굳이 설명할 필요가 없습니다.

Java와 C#의 Type의 차이점은 위에서 설명했죠.

 

그리고 어셈블리는 C# 코드 파일의 컴파일의 결과물입니다.

파일의 확장자는 .exe와 .dll이 있습니다.

어셈블리에는 IL 명령 형식의 실행 코드와 메타 데이터 형식의 기호 정보가 포함됩니다.

C/C++의 경우에는 다른 파일의 코드를 참조하고 싶을 때는 컴파일러에 Header 파일을 통해 "나는 이 파일의 내용을 참조하고 싶다"고 말해줘야 합니다.

하지만 C# 컴파일러는 이런 헤더 파일이 필요하지 않습니다.

어셈블리 파일 안에 필요한 실행 코드 정보와 메타 데이터 정보가 다 포함되어 있기 때문입니다.

그저 다른 어셈블리를 참조하는 것만으로도 사용가능합니다.

 

다음 글에서는 C#의 이런 조직 구성 요소에 대해서 알아보도록 하겠습니다.

반응형

댓글