지난 시간에는 Visual Studio 2019 설치와 더불어 Hello, World!를 출력해봄으로써 대략적인 구조를 확인했습니다. 이번 시간에는 지난 시간에 했던 Hello, World!의 소스코드를 하나씩 확인하며 어떠한 내용이 존재하는지 그리고 어떤 의미를 지니는지 간략하게 살펴보도록 하겠습니다. 기억이 안나시는 분은 지난 시간 포스트를 확인해보고 오시기 바랍니다.

 

  앞으로도 이러한 방식으로 하나하나 살펴보도록 할 예정입니다. 힘들수도 있지만, 머릿속으로 어떤 의미인지 확인이 안된다면 주먹구구식의 프로그래밍이 될 수밖에 없습니다. 그러니 하나씩 정확하게 배워가도록 하겠습니다. 

 

using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 

  우리는 이러한 코드를 작성해보았습니다. C#과 같이 고수준 언어의 특징은 마치 사람이 쓰는 말을 간결하게 풀어놓은 듯한 느낌을 받습니다. 실제로도 컴퓨터에게 명령하듯이 코드를 작성합니다. 예를 들면, '사용해라', '만약 아니라면 ~를 해라' 이러한 형태로 컴퓨터에게 명령한다는 느낌으로 코드를 작성합니다. 

using System;

  Visual Studio IDE는 우리의 눈을 편하게 만들어주는 역할을 해줍니다. 보라색으로 보이는 것은 키워드(Keyword)입니다. 키워드는 프로그래밍을 하기 위해서 컴퓨터에게 내리는 명령어라 생각하시면 됩니다. 내가 정한 말인지 아니면 사전에 약속된 말인지 구분이 되어야 겠죠? 그러한 구분을 해놓은 단어들을 Keyword(키워드)라 합니다. 

 

  위에 코드 상에서 using, namespace, class, static, void, string은 모두 다 사전에 정의된 키워드가 되는 것이죠!

 

그렇다면 using 키워드의 의미는 무엇인지 생각해보면, '사용한다' 겠죠? 무엇을 사용한다? System을 사용하겠다는 의미입니다. 마지막으로 ; (세미콜론)은 컴퓨터에게 명령어 한 줄 한 줄을 구분시켜주는 역할을 하는 구분자 역할을 해주는 칸막이 같은 역할을 합니다. 컴퓨터가 봤을 때 사람의 언어는 구분이 안되는 외계어처럼 보이게 될 것입니다. (물론 세미콜론을 없애고자 하는 움직임이 없었던 것은 아닙니다. 그런데 세미콜론을 남겨둠으로써 얻는 이점이 많다고 생각해서 세미콜론을 남겨둔 형태로 지금도 사용되고 있습니다.)

 

실제로 우리가 컴퓨터의 기계어를 보면 010001010100111101 의 형태로 보이는데, 우리는 이 말이 무슨 말인지 모릅니다. 그리고 컴퓨터는 알 수 있는 것이죠. 

 

뒤에 나오는 System은 클래스(class)를 담고 있는 네임스페이스(namespace)가 됩니다. 

 


 

네임스페이스

  네임스페이스는 특정 클래스라 하는 것이 어디에 속해 있는지 알려주는 역할을 합니다. A라는 네임스페이스에 add 클래스가 있고, B라는 네임스페이스에 add라는 같은 이름의 클래스가 있으면 이를 구분지어주기 위한 역할을 하는 것이 네임스페이스가 됩니다. 

 

  예를 들어, A네 자전거, B네 자전거, C네 자전거라 하면 이를 구분지어주는 역할을 하는 것이 네임스페이스가 되는 것이죠. A씨 네 자전거입니다! B씨 네 자전거입니다. C씨 네 자전거입니다. 이렇게 소속을 구분지어주는 역할을 합니다.

 

  왜 이렇게 하냐? 그 이유는 변수이름을 짓기 어렵기 때문이죠. 그래서 프로그래머들은 비슷한 이름을 쓰게 되는데, 문제는 이름들끼리 충돌하기 시작한다는 것입니다. 위에 예에서도 " 자전거다!" 라고 지칭하면 누구네 자전거? 라는 의문이 따라오는 것처럼 어디에 속해 있는지가 중요한 문제이기 때문이죠. (물론 더 다양한 문제를 해결하기 위해서 도입했지만, 대략적인 이유는 이렇습니다.)

 

그렇다면 다시 돌아와서

using System;

기존에 보았던 이 코드에서 System은 System으로 되어 있는 네이스페이스에 있는 것들을 쓰겠다는 소리가 되는 거겟죠?

 

그렇다면 이렇게 다양한 네임스페이스를 외워야 하냐? 그건 아닙니다. 기본적으로 우리에게는 찾아볼 수 있도록 준비된 사전이 있습니다.

 

docs.microsoft.com/ko-kr/dotnet/api/system?view=net-5.0

 

System 네임스페이스

일반적으로 사용되는 값과 참조 데이터 형식, 이벤트와 이벤트 처리기, 인터페이스, 특성, 예외 처리 등을 정의하는 핵심 클래스 및 기본 클래스가 포함되어 있습니다. Contains fundamental classes and b

docs.microsoft.com

우리가 궁금한 내용이 있을 때마다 Docs를 찾아보면서 쓰면 됩니다. 일단은 이러한 것이 있구나 정도로 생각하면 됩니다. 

 

위의 코드에서 using System;을 빼면

 

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine("Hello World!");
        }
    }
}

 코드가 조금 더 길어집니다. 네임스페이스를 사용하면 길어지는 현상도 줄일 수 있는 장점이 있죠.


using System;

namespace MyFirstApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 자 다시 코드로 돌아와서 생각해보도록 하겠습니다.

이제 다음은

namespace MyFirstApp

이 부분은 이제 이해하기 쉽습니다. namespace는 소속을 정해주는 것이죠. 마찬가지로 앞으로 만들 클래스는 MyFirstApp 이라는 네임스페이스에 속하게 만들겠다는 것입니다. 

 

using System;

namespace MyFirstApp
{ 이 부분부터 들어가는 곳은 MyFirstApp의 네임스페이스에 속해있는 것입니다.
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

 

그 다음으로 

 

Class

class Program

  class란 기본적인 객체를 정의하는 하나의 틀을 의미합니다. 객체는 나중에 이야기하겠지만, 우리가 세상을 바라보는 물체를 객체라 부릅니다. 물론 물체 뿐 아니라 무형의 형태도 객체로 바라볼 수 있습니다. 객체지향에 대한 이야기는 이야기하면 이야기할 수록 많은 이야기가 필요하니 이후에 다시 이야기하도록 하겠습니다. 

 

  클래스는 이러한 기본이 되는 형태를 class라 부릅니다. 여기에는 변수메소드라 불리는 것이 정의되는 공간입니다. 클래스는 한 개만 존재할 수도 있고, 여러개가 존재할 수도 있습니다. 

 

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }

class Program 안에는 Main 이 있습니다. Main은 모든 프로그램이 흘러가는 중심이 되는 곳이라고 생각하시면 됩니다. 그래서 Main은 한 개만 있어야 하며, 두 개 이상이 되면 프로그램에서 오류가 발생합니다. 

 

Main은 실제로 프로그램이 실행되는 공간이며, 그 외에 메소드(함수)는 Main에서 불러주어야 실행이 됩니다.

 

static(정적) : static이 선언되어 있으면, 프로그램 시작시에 해당 속성이 붙어있는 클래스가 메모리에 올라가게 됩니다. 프로그램 시작과 함께 초기화되며, 메모리에 처음부터 올라가있는 상태가 됩니다. 더 자세한 이야기는 나중에 하도록 하겠습니다. 

 

  void는 자료형을 의미합니다. 컴퓨터는 자료형을 지정해줘야 합니다. 예를 들어, 12와 "12"를 보고 사람은 같은 숫자 12를 생각하지만, 컴퓨터는 이를 보고 다르게 생각합니다. 12는 숫자 12이며, "12"는 문자 12로 인식합니다. 그래서 프로그래머는 명시적으로 컴퓨터에게 어떤 자료형임을 알려주어야 합니다. 그래서 여러 자료형이 주어져 있습니다. 예를 들어, int, char, string등등 이 존재합니다. 

 

  class는 일반적으로 돌려주는 return 값이 있을 수 있습니다. 메인에서 프로그램이 실행될 때, 다양한 class를 지속적으로 호출하게 됩니다. 그러면 다른 class에 갔다가 다시 메인으로 돌와서 프로그램을 실행해야 합니다. 이러한 상황에서 다시 돌아올 때, 값을 가지고 오는 class가 있는 반면, 가지고 오는 값이 없는 class가 있습니다. 이 중에서 가지고 돌아오는 값이 없는 class에서 사용되는 것을 void라 합니다. 가지고 돌려주는 값이 정수형이면 int를 붙여서 사용합니다. (이러한 부분은 뒤에 다시 설명하도록 하겠습니다.)

 

대략적으로 설명하자면 이러한 형태가 됩니다.

  우리가 아직 많은 부분을 배우지 않아서 정확한 설명은 아니지만 대략적으로 이러한 느낌으로 흘러갑니다. Main이라는 프로그램의 큰 흐름에서 필요한 Class를 호출하고 흐름이 잠시간 넘어가는 형태로 프로그램이 진행됩니다. 이럴 때 void는 넘겨주는 값이 없는 형태이며, int는 정수를 넘겨주며, float은 실수값을 넘겨주는 것이죠. 무엇을 넘겨주는 지에 대해 알려주는 역할을 한다고 보시면 됩니다.


마지막으로 

Console.WriteLine("Hello, World!");

앞서 이야기한 Class에 대해 흐름이 넘어간다고 했죠? 여기서도 System이라는 네임스페이스에 있는 Console Class에 있는 WriteLine이라 불리는 메소드를 통해서 우리는 "Hello, World"의 문자열을 출력해줍니다. 

 

그리고 WriteLine은  출력이 끝난 후에 다음줄로 넘어갑니다. (Enter를 누르는 효과가 나옵니다.)

만약 줄 바꿈을 하고 싶지 않다면, Write라고 사용하면 됩니다.

Console.Write("Hello, World");

한번 써보신다음에 출력을 해보세요!

 


아직 static void Main(string[] args) 에서 string[] args는 이야기하지 않았습니다. 하지만 이는 나중에 이야기하도록 하겠습니다. 뒤에서 배울 내용을 먼저 배운 다음에야 이해가 됩니다. 일단은 이러한 구조를 갖는구나 생각을 하시면 됩니다. 

 

마지막 과제를 드리면서 이번 장을 마무리 짓도록 하겠습니다.

 

#1. 

안녕하세요. 저는 * * 입니다.
앞으로 우리의 프로그랭을 재밋게 해보도록 하겠습니다.
다음에 뵙겠습니다!

 

#2. 

이 줄은 첫번째 줄 입니다.

이 줄은 세번째 줄 입니다.

이 줄은 다섯번째 줄 입니다.

이 문제에 대한 답은 다음 시간에 올리도록 하겠습니다. 감사합니다.

 

 

  우리가 사용할 IDE는 Visual Studio를 활용해서 C#을 배워보도록 할 예정입니다. IDE를 없이도 충분히 사용할 수도 있지만, IDE가 가지는 편안함을 이용하기 위해서 IDE를 사용할 예정입니다. 아직은 어떤 것도 모르르는 상태이기 때문에 하나하나 따라오시면서 익혀보는 것에 관점을 두고 시작하시기 바랍니다. 

 

  Visual Studio는 마이크로소프트에서 만든 IDE로 전문가용(Professinal)을 사용하고자 한다면, 일정 금액을 내고 사용해야 합니다. 하지만 우리는 엄청난 기능까지는 필요없으므로 Community(커뮤니티)버전이면 충분합니다. 

 

링크를 타고 들어가서 다운로드를 받아보도록 합시다. visualstudio.microsoft.com/ko/downloads/

 

Windows 및 Mac용 Visual Studio 2019 다운로드

Visual Studio Community, Professional, Enterprise를 다운로드하세요. 지금 Visual Studio IDE, Code 또는 Mac을 무료로 사용해 보세요.

visualstudio.microsoft.com

* 링크가 안나올 경우, 구글에 'Visual studio 다운로드'를 타이핑 하면 다운로드 받을 수 있는 링크가 준비되어 있습니다. [잘 모르겠다 싶으시면 물어보세요!]

 

다운로드를 해주도록 합시다.

혹은 아래로 들어가서 다운로드 -> Community 2019로 다운로드 하셔도 됩니다.

visualstudio.microsoft.com/ko/vs/

 

Visual Studio 2019 | 무료 다운로드

Visual Studio에서 코드 완성, 디버깅, 테스트, Git 관리, 클라우드 배포를 사용하여 코드를 작성할 수 있습니다. 지금 Community를 무료로 다운로드하세요.

visualstudio.microsoft.com

 

  다운로드를 하는 동안 아래쪽으로 내려가면 Visual Studio Code가 있습니다. Visual Studio Code도 강력한 IDE 중 하나입니다. 필자는 Code를 더 많이 사용합니다. 하지만 Code는 완전 초보자가 처음부터 쓰기에는 너무 힘듭니다. 하나부터 열까지 자신이 커스터마이징을 할 수 있다는 점이 장점이지만, 초보자에게 너무 많은 것이 주어지면 오히려 힘들어지죠? 그래서 일단은 다른 셋팅 없이도 할 수 있는 Visual Studio Community 2019로 시작하도록 합시다! IDE는 우리의 프로그래밍을 도와주는 '수단'임을 잊으시면 안됩니다. 

 


다운로드가 완료되면 바로 실행시켜 주도록 합시다. 

실행시키면 어떤 용도로 작업할지에 대해 묻습니다. 그러면 우리가 .NET 데스크톱 개발이 우리가 하려는 C#을 만들 수 있는 것이 들어있는 패키지입니다. 

 .NET 데스크톱 개발을 체크표시하고 '설치'를 눌러주시면 됩니다. 생각보다 시간이 필요합니다. 설치 완료 이후에는 딱히 필요한 부분이 없습니다. 사용하는데는 로그인도 필요없지만, 차후 로그인하지 않고는 사용기간이 정해짐니다. 그래서 로그인을 해주고 넘어가면 편합니다. (나중에 하셔도 상관없습니다.)

 

완료하고 나면 이러한 화면이 나옵니다. 

 

새 프로젝트 만들기를 눌러줍니다. 

 

먼저, 프로그래밍 언어를 C#으로 바꾼다음 -> Console Application -> 다음 을 눌러줍니다. 

 

이 화면에서의 구성은 총 3가지 입니다. 

  • 하나는 프로젝트 이름
  • 두번째는 위치, 위치는 이 프로젝트를 저장할 위치를 선정해주는 것 입니다. 저장하고 싶은 위치를 선정해주시면 됩니다. 저는 C:\Users\one-math\Desktop\Test\ 에 저장을 하기 위해 지정해주었습니다. (저장하고자 하는 폴더에 넣으면 됩니다.)
  • 솔루션 이름

마이크로소프트의 비주얼 스튜디오는 프로젝트와 솔루션이라는 특별한 구조를 갖습니다. 이는 프로젝트 시에 관리를 용이하게 해줍니다. 

  • 솔루션 : 솔루션은 여러 프로젝트를 관리하기 위해 있는 하나의 큰 컨테이너입니다. 프로젝트와 프로젝트를 연결할 수 있는 연결 고리를 만들어주는 역할을 하는 것이지요.
  • 프로젝트 : 현재는 1개의 파일만을 가지고 실습을 진행하겠지만, 개발의 규모가 커지게 되면 파일의 갯수도 늘어나게 됩니다. 그래서 여러 소스 파일과 파생되는 여러 파일을 묶어서 관리하기 위한 것이 프로젝트입니다.

프로젝트는 여러 소스파일과 파생되는 파일을 묶어서 관리하는 개념, 이러한 프로젝트가 많아졌을 때, 이를 묶어서 관리하는 솔루션이라는 개념이라 생각하시면 됩니다. 

이러한 형태가 나오게 됩니다. 실제로 저장된 폴더에 들어가서 확인해보면,

이러한 형태로 생성이 됩니다. 확장자가 sln은 솔루션 파일, 확장자가 csproj이면 C-sharp-Project 파일이 됩니다.

 

우리가 사용하는 프레임워크는 .NET 5.0을 사용할 예정이니 .NET 5.0인지 확인하고 만들기를 누르면 됩니다. 

 

성공했다면, 이러한 화면이 나오게 됩니다. 

 


 

화면구성

기본적인 화면 구성은 코드 편집기, 솔루션 탐색기, 콘솔로 이루어져 있으며, 처음에는 3가지만 기억하고 계시면 됩니다. 

  • 코드 편집기 : 실제로 코드를 작업하는 공간이며, 코드를 작성할 공간입니다. 
  • 솔루션 탐색기 : 우리가 작업하고 있는 소스 파일과 그에 따른 종속성 프로젝트에 대해 전반적으로 보여주는 공간입니다. 기본적인 프로그램 흐름을 배울 때는 필요없지만, 나중에 규모가 큰 프로그램을 만들게 되면 자주 사용하는 공간이기도 합니다.
  • 콘솔 : 시스템 메시지가 나오는 공간으로 에러가 생기면 알려줍니다. 

이제 설치에서 프로젝트 생성까지 완료했으니, 실행을 한번 해보도록 하겠습니다. 

실행에는 두 가지 방법이 있습니다. 빌드에 의한 실행, 혹은 디버그에 의한 실행으로 두 가지가 있습니다. 빌드에 의한 방법은 실행 시키기 위해서는 조금 더 복잡하기 때문에 당분간은 디버그에 의한 실행을 사용하도록 하겠습니다.

 

 

실행

상단 메뉴에서 디버그 -> 디버그하지 않고 시작을 눌러줍니다. 혹은 Ctrl + F5를 누르시면 됩니다. 

그러면 

 

이러한 화면이 나옵니다. "Hello World!"를 확인할 수 있습니다. 

 


Hello, World의 유래

  문득 모든 프로그래밍의 시작은 Hello, World로 시작하는데, 그 이유가 궁금하지 않나요? Hello, World는 Brian W.Kernighan(브라이언 커닝헨)과 Dennis M.Richie(데니스 리치)가 쓴 저서인 "The C Programming Language"의 교재에서 첫 번째 예제가 Hello, World를 출력하는 것이었습니다. C언와 함께 유명해지면서 대부분의 프로그래밍 언어에서 첫 번째 예제로 Hello, World!를 사용하는 것이 관행처럼 굳어진 것이죠.

 

  단순히 Hello, World자체가 중요한 것은 아니고, 첫 예제를 실제로 하나하나 따라하다 보면 전반적인 프로그래밍 코드를 실행시키는 구조가 눈에 들어오기 때문에 이러한 코드를 직접 쳐보는 것이지요. 여기서 우리가 얻어야 하는 것은 한번을 직접 실행시켜보는 것이 여러번 책을 들여다 보는 것보다 중요한 점입니다. 

 

  꼭 프로그래밍을 배우실 때는 힘들더라도 직접 하나씩 만져보는 것을 추천드립니다. 

* 28가지의 다른 Hello, World!를 아래에서 확인할 수 있습니다.

excelwithbusiness.com/blog/say-hello-world-in-28-different-programming-languages/


  설치부터 시작해서 Hello World를 실행해보면서 기본적인 실행의 흐름을 따라가 보았습니다. 우리가 생각하는 것보다 프로그래밍은 복잡할순 있지만, 생각보다 그리 복잡하진 않습니다. 우리가 항상 하는 게임과 배우는 수준은 같습니다. 처음에는 하나하나 해보다 보면 어느덧 성장해 있는 우리의 모습을 확인할 수 있습니다. 하루에 하나만 배우자는 마음으로 하나씩 배워가길 바라겠습니다. 

 

  저도 항상 한번에 많은 것을 하려고 했습니다. 그러다보니 마음은 조급한데 생각보다 늘어나는 실력은 너무 작다보니 포기하는 일이 많았습니다. 우리는 분명 오늘을 달리고 있습니다. 어제보다 나은 내가 되었으며, 앞으로 조금씩 나아가면 6개월, 1년 이란 시간이 지나면 멀리 나아가 있는 우리의 모습을 볼 수 있습니다. 그러니 너무 조급해하지 마시고 '하루에 한개는 내가 꼭 알아내겠다.' 라는 목표로 꾸준히 나아가시기 바랍니다. 

 

  저는 프로그래밍을 어렵게하는 이유는 '꾸준함'이라 생각합니다. 프로그래밍은 언제나 거대한 문제를 조그만한 문제로 쪼개서 내가 먹을 수 있게 만드는데 의의가 있습니다. 하지만 하루 이틀로는 이렇게 거대한 문제를 여러번 베어먹는다고 해서 의미가 없죠. 하지만 이러한 날이 하루, 이틀이 모이면 거대한 산 같은 덩어리를 쪼개서 내가 베어 먹을 수 있게 됩니다. 

  C#(씨샵이라 말합니다.) C#은 C라고 이름붙어진 형제에서 마지막으로 나온 언어 중 하나입니다. C# 외에도 C언어, C++(씨플플이라 읽습니다.)가 앞에 존재하지만 업그레이드의 버전은 아닙니다. (어떤 의미로는 업그레이드라고도 볼 수 있지만 엄밀히 다른 부류의 언어이지 업그레이드 된 언어라 보기는 힘듭니다.) 

 

 이러한 C#은 객체지향적 언어이며, 개발자가 사용하기 쉽게끔 나왔습니다. 여러가지 특성이 존재하지만 초보자의 관점에서는 대략 이러한 느낌입니다. 프로그래밍을 접하는데 C#은 어떤가요? 라고 했을 때, C#은 충분히 처음에 배우기 편한 언어임은 분명합니다. (Python과 마찬가지로 강력한 언어이죠.) 문법적 특성은 C언어가 더 적고 사용하기 편할지 몰라도 실제로 메모리 관리나 프로그래머에게 많은 자유를 준 만큼 C언어는 프로그래머가 고려해야할 사항이 많아지는 단점이 있죠. 게다가 C언어로 100줄을 작성해야할 코드가 C#이나 파이썬으로 넘어가면 작성해야할 코드가 20줄로 끝날 정도로 간편해지기도 했습니다. (물론 상황에 따라 다르겠지만, C언어 보다 C#, 파이썬이 사람의 언어(자연어)에 가깝기 때문에 작성하기가 더욱 편리합니다.)

 

  C#을 사용하는 IDE는 여러 가지가 있지만, 대표적으로 Visual Studio와 MonoDevelop 등이 있습니다. 물론 이외에도 다양한 C#을 지원하는 IDE가 존재합니다. 앞으로의 포스팅에서는 Visual Studio를 통해 진행할 예정이지만, 설치가 힘든 분들은 웹에서 제공하는 컴파일러를 사용하셔도 괜찮습니다. 충분히 우리의 실습을 커버할 수 있습니다. OnlineGDB

 

Online C# Compiler - online editor

OnlineGDB is online IDE with C# compiler. Quick and easy way to run C# program online.

www.onlinegdb.com

 

C#에 대략적인 이야기는 이 정도만 알고 넘아가셔도 충분합니다. 다만 밑에 적혀질 이야기는 C#에 대해 조금 더 생각해보자란 의미에서 더 적어두도록 하겠습니다. 

 

1. C#


 C#이라는 이름의 유래는 C++에서 C++++ 네 개의 +를 2개씩 쌓아 올리면 # 모양이 되기 때문에 C#으로 만들어졌다.  Java는 JVM(자바 가상머신)을 활용해 어떤 플랫폼에 상관없이 사용할 수 있는 장점을 필두로 생산성 향상을 도모했다. 한번 작성하고 어디서든 사용할 수 있도록 하는 것이 큰 장점으로 다가왔다. 그래서 C# 또한 이러한 양상을 따라가기 위해 만들어졌다. 그래서 Java에서 JVM(자바 가상머신)이 필요했듯, C#은 닷넷 프레임 워크가 필요하다. (정확히는 Java를 MS에서 만들어낼 때, J#이라 만들어냈는데, 저작권 문제로 C/C++, Java의 장점을 모아서 C#으로 다시 출시하게 되었다.)

 

  그렇다면 C#, Java가 무조건 더 좋은가? 라는 질문에는 그렇다고 볼 수도 있고 아니라고 볼 수도 있다. 초기 C#, Java는 성능면에서 불리한 점이 너무나도 많았다. 물론 이는 지금도 비슷하다. C/C++ 이 더 빠른건 설계상 차이점이 생길 수 밖에 없다. 태생적 한계가 분명히 존재한다. 가상 머신을 넣는 순간 느리지는건 어쩔 수 없다. 가상머신이 없는 C/C++은 C#, Java보다는 당연히 빠르다. 하지만 가상머신이 없으므로 윈도우에서 만들어진 것을 다른 운영체제에서 사용할 수 없다. 그래서 이를 바꿔주는 작업을 해야 한다. Java는 이럴 필요가 없는 것이다. 또한 메모리 관리 측면과 자연어에 가까운 언어가 사람이 쓰기 편한 언어이다. Java와 C#은 사람이 쓰기 조금 더 편하다.

 

  그럼에도 불구하고 프로그램 언어의 인기 순에는 항상 C/C++를 빼놓고 이야기할 수 없다. 이는 하드웨어를 컨트롤할 수 있는 언어는 결국 C언어이며, C++은 메모리 관리를 직접할 수 있다는 장점이 있다. 그래서 여전히 사라지지 않고 큰 인기를 누리고 있다. (리눅스의 기반 언어는 C로 이루어져 있으므로 이를 다루기 위해서는 반드시 C를 할 수 밖에 없다.)

 

  초기에는 마이크로소프트 플랫폼에 귀속되어 있어서 사용도가 많이 떨어지기도 했지만, 이후에 개선을 거쳐서 업데이트를 통해 개선을 거쳐가는 중이다. 그래서 C#의 인기도 업데이트와 더불어 그 인기가 늘어가는 중이다. 유니티의 기본 개발 언어이기도 하다.

 

 

2. .NET (닷넷)


  C#은 기본적으로 닷넷에서 실행된다. Java가 JVM이라는 자바 가상 머신 위에서 돌아가는 것과 같은 형태이다. CLR(Common Language Runtime) - 공용 언어 런타임이라 하는 가상 실행 시스템이다. CLI(Common Language Infrastructure) - 공용 언어 인프라를 MS(마이크로소프트)에서 구현한 것이다. 

 

  C#으로 작성된 코드는 IL(Intermediate Language) - 중간 언어 라 불리는 것으로 컴파일 된다. (마이크로소프트에서 개발한 CLI를 준수하는 IL 언어로 컴파일된다고 보는 것이 정확할 것이다.) 그리고 CLR을 통해 기계가 읽어들일 수 있는 형태로 로드 된다. 

 

  C# 프로그램이 실행되면 어셈블리가 CLR에 로드되며, 이러한 CLR은 Just - In - Time으로 컴파일을 수행한 다. (우리나라 말로 그 때 그 때 마다) 

  이러한 CLR에서 나온 코드는 기계어로 바꾸어준다. (기계어는 기계가 해석할 수 언어로써 01010의 형태를 갖는 코드를 의미한다.) 0은 꺼짐, 1은 켜짐의 형태로 반도체를 껏다가 켯다가 할 수 있는 것이다.

  

  정리하면, C# 코드 -> 컴파일 -> CIL -> CLR -> 기계어 형태로 변형해주는 것이다. 

 

 

이것 외에도 CLR은 가비지 컬렉션(Garbage Collection) 자동 실행, 예외 처리, 리소스 관리 등 다양한 서비스를 제공한다. CLR에서 실행되는 코드는 관리 코드(Managed code)라 불린다. 

 

  닷넷의 주요 기능 중 하나는 언어의 상호 호환 가능성이다. C# 컴파일러에서 생성된 CIL 코드는 CTS - 공용 형식 사양)을 따르기 때문에 [한 마디로 표준화가 되어 있다.], C#에서 생성된 CIL 코드 자체는 F#의 .NET 버전과 Visual Basic, C++ 등 CTS(공용 형식 사양)을 따르는 언어와 상호 호환이 가능하다. 그래서 다른 언어로 작서된 것들도 CTS를 따른다면 같은 언어로 작성된 것처럼 서로 참조하며 사용이 가능한 점이 강점이다! 물론 이것 외에도 다양한 라이브러리를 포함하는 것은 당연하다. 

 

.NET 코어에 대해 더 자세한 이야기가 궁금하다면 .NET GitHub을 방문하도록 하자!

.NET은 Winodw, macOS, Linux, RHEL, Tizen (대표적으로 갤럭시 워치 OS) 등을 지원한다. 더 많은 지원이 있지만 이 글에서는 대략 이 정도로 정리하겠다.

 

.NET 언어는 다양한 기능을 지원하는데 

 

  • Type Safety (타입 안정성)
  • Type inference - C#, F#, Visual Basic (
  • Generic Types (제네릭 형식)
  • Delegates (대리자 - C언어나 C++에서 포인터 같은 기능)
  • Lambdas (람다)
  • Events (이벤트)
  • Exceptions (예외)
  • Attributes (특성)
  • Asynchronous code ( 비동기 코드)
  • Parallel Programming (병렬 프로그래밍)
  • Code Analyzers (코드 분석기)

등이 있다. 더욱 자세한 내용은 C#을 배워보면서 하나씩 알아가도록 하겠다.

 

+ Recent posts