C#과 .NET에 관해서는 다수의 글을 통해 이미 여러분에게 전달한 바 있습니다. 현재 이 글은 .NET 9와 C# 13이 최근 발표됨에 따라 여기에 맞춰 다시 작성하였습니다.
C#은 가능한한 쉽고 효율적인 Programming언어가 되기 위해 끊임없이 발전하고 있습니다. C#을 다른 객체지향 Programming언어처럼 설명하기는 쉽지만 사실 C#은 .NET세계에서 전체 개발과 실행기반에 있어서 필수적인 언어에 해당합니다. C#에 대한 전체적인 개요로 먼저 가볍게 시작해 보겠습니다.
1. Programming 언어의 흐름
Programming에서 문제가 되는 것은 Computer그 자체입니다. 사람은 단어로 소통하는 반면 Computer는 기계어라고 표현하는 숫자(정확히 말하면 0과 1)만을 생각하기 때문입니다. 초기에 개발자는 기계어 Code를 직접 입력함으로써 Programming작업을 수행했고 이는 많은 노고가 필요하며 오류를 발생시키기도 쉬웠습니다. 이것이 한 단계 발전하여 동일한 기계어 Code를 사람이 읽을 수 있는 명령어형태로 사용하게 되었는데, 예를 들어 MOV명령은 하나의 Microprocessor Register에서 다른 쪽으로 이동시킬 수 있는 명령이 되며 이러한 명령은 Assembler라는 Software에 의해 기계어 Code로 변환될 수 있었습니다. 그리고 이러한 방식에서 Assembly언어라는 명령어 문법이 탄생하게 되었습니다.
그다음으로 읽고 쓰기가 쉽도록 설계된 현재의 고수준언어들이 등장하였습니다. 이들 언어는 사람이 읽을 수 있는 형태로 Code가 작성되면 Compiler에 의해 Compile 되거나 Processor를 대신하여 Interpreter가 해석하게 됩니다. Interpreter언어로는 BASIC, COBOL, Pascal, Fortran 등이 존재하며 Compiler언어로는 대표적으로 1970년대 AT&T Bell 연구소에서 만들어진 C언어가 존재합니다. 1970년대 후반, 1980년대 초에 이르러서 C언어에 대한 객체지향 연구가 시작되었고 그 결과 C++라는 객체지향 언어가 탄생하게 됩니다.
C++은 C언어에서 객체지향이라는 놀라운 성과를 이뤄내긴 했지만 실수를 유발하기가 쉽다는 문제를 여전히 안고 있었습니다. 이는 언어 자체가 너무 세밀하다고 느낄정도로 많은 것을 허용하면서 생긴 문제인데 예를 들어 Code상에서 Buffer Overflow나 Memory위치를 임의로 덮어쓰도록 하는 경우를 모두 허용했습니다. 이로 인해 Application이 System상의 전체 물리적 Memory와 Swap공간을 모두 사용할 정도로 Memory관리에 취약한 부분을 드러내게 되었습니다. 뿐만 아니라 C와 C++, 그리고 다른 모든 Compile언어가 마주하게 된 또 다른 문제는 Source Code가 Processor유형이 달라지면 재 Compile과정을 거쳐야 한다는 것입니다. 이는 하나의 Hardware Platform에서 다른 쪽으로 Application을 이식하기가 어렵게 만드는 가장 큰 요인중 하나였습니다.
C와 C++의 이러한 문제를 해결하기 위해 Sun Microsystems사에서는 1990년대에 새로운 Programming언어와 실행환경에 대한 연구를 시작했고 그 결과 Java언어가 탄생하게 되었습니다. Java는 C++에서의 다수의 결점과 어려운점을 제거하고 이식 가능한 중간 Byte Code형식을 사용하며, 이러한 Byte Code를 실행하고 Memory관리와 같은 Issue사항을 처리하는 가상 Machine이라는 실행환경을 도입하게 되었습니다. 또한 Networking이나 file처리, Database접근, Graphic과 같은 Enterprise급 Application개발에 필요한 모든 기능을 포함하는 방대한 Library를 제공함으로써 개발자들 사이에 큰 인기를 끌게 되었습니다.
이러한 장점에 힘입어 Java는 급속하게 성장하게 되었고 Microsoft조차 Java를 포용하려는 움직임을 보였습니다. 하지만 곧 독점과 관련된 법적 분쟁이 발생하였고 정치적인 문제가 이어지면서 Microsoft는 Java를 떠나게 됩니다. 이후에 Microsoft는 C#이라는 Programming언어와 함께 .NET이라는 개발 Platform을 발표하게 됩니다.
2. C# 언어
위에서 이야한 것들이 C#과는 무슨 관련이 있을까? C# Programming의 본래 구문은 C/C++로 연결될 수 있습니다. C/C++(또는 Kotlin나 Swift라도)을 이미 경험해 보았다면 C#을 시작하기에 유리할 수 있습니다. Java, C/C++, C#의 언어는 구문자체가 서로 비슷하다고 말할 수 있는데 특히 C#은 Java의 이점을 그대로 가져가면서 Garbage Collection이라는 Memory관리방식을 갖고 있고, 중간언어를 도입함으로써 대상 Hardware platform마다 다시 Compile 해야 하는 필요성을 제거했습니다. 또한 여러 Scenario에 따라 사용가능한 Solution들과 함께 개발자들을 위한 방대한 Framework Library를 제공하고 있습니다.
서로 비슷하다고 하더라도 Java와 C#간에 차이는 분명 존재할 것입니다. 이 부분은 향후에 C#을 사용해 나가면서 조금씩 알게될 것입니다.
3. C#의 사용
비록 C#이 도입된 이 후 Swift나 Kotlin같이 몇 가지 중요한 Programming언어가 출시되긴 했지만 C#은 하나의 언어로서 여전히 성장해 가고 있으며 방대한 사용자층을 확보하고 있습니다.
C#은 2024년 현재 TIOBE Index에서 가장 많이 사용되는 Programming언어 상위 50개 중 5위로 rank 되어 있으며 Desktop, Mobile, Server 및 Web기반 Application과 Service의 개발에도 사용되고 있습니다. 사실상 모든 Microsoft Platform을 위한 언어이며 Unity Real-Time 개발 Platform에도 사용되고 있습니다.
'.NET > C#' 카테고리의 다른 글
[C# 13과 .NET 9] C# 구조 - 2 (1) | 2024.11.19 |
---|---|
[C# 12와 .NET 8] 11. LINQ (0) | 2024.03.11 |
[C# 12와 .NET 8] 10. Entity Framework Core (1) | 2024.03.07 |
[C# 12와 .NET 8] 9. File, Streams, Serialization (0) | 2024.02.28 |
[C# 12와 .NET 8] 8. 공용 .NET Type (0) | 2024.02.23 |