[C#] C# 언어 동작 방식과 특징

한승호·2022년 6월 16일

C# 공부

목록 보기
2/13

유니티 엔진에서 기본적으로 다루고 있는 스크립트는 C# 스크립트를 이용하고 있다.
따라서, 유니티 엔진의 활용성을 높이기 위해서는 C# 언어에 대한 지식이 필수적이다.

당연하게도 C / C++ 언어 스타일로 C# 문법을 모른 채 작성하는 것도 가능하지만, 개발을 할 수록 한계에 부딪히게 된다.

C# 프로그램의 동작 방식

  • C# 프로그램은 CLR (Common Languager Runtime) 이라는 자바의 가상 머신과 비슷한 프로그램 위에 구동이 된다.
  • C / C++ 언어와 달리 결과물을 컴퓨터가 바로 실행할 수 있는 실행 파일로 생성되지 않는다는 것을 의미한다.

CLR (Common Languager Runtime)란?

마이크로 소프트에서 개발한 가상 머신의 구성요소이다.
이는 Windows 전용이라는 뜻이며, 기능은 크게 2가지가 있다.

  • 중간 언어를 JIT 컴파일러를 활용해 기계어로 변환
  • 가비지 컬렉션을 통한 동적 메모리 관리

CLR은 따로 컴파일을 실행시켜 해당 플랫폼에 다시 맞추어 컴파일을 하도록 하는 기능을 말한다.
그러나 C#과 다르게 C / C++은 컴파일을 진행해 프로그램을 바로 만들어 낸다.

그리고 CLR에는 꼭 알아야할 역할이 존재한다.

CLR의 3가지 중요 역할

  • 가비지 컬렉션을 활용한 편리한 메모리 관리
  • 예외 처리
  • 프로그래밍 언어간의 호환성
    호환성에 대한 자세한 얘기는 아래에서 다루도록 하겠다.

가상 머신

  • 컴퓨터에서 1대 이상의 컴퓨터를 구동하는 것으로 하드웨어 등의 모든 컴퓨터 자원을 가상화 시킨 것을 의미한다.
  • C# 언어는 CLR이라는 중간 과정을 거쳐 다른 언어를 사용할 수 있게 지원한다.
  • CLR은 CIT라는 코드를 읽어들여 OS가 이해할수 있는 Native Code로 변환하는 역할을 한다.
  • 이 때, 서로 다른 언어들이 만나는 지점을 IL 즉, 중간 언어라고 하며,
    이 언어로 쓰여진 코드를 CLR이 자신이 실행한 플랫폼으로 다시 맞추어 컴파일을 하는 구조이다.

CIL (Common Intermediate Language)란?

공통 중간 언어라고 부르며, 닷넷 프레임워크에서 실행되는 언어이다.
닷넷 프레임 워크 언어로 개발된 프로그램 코드는 컴파일시 바이너리(0과 1) 형태로 CIL 파일로 작성된다.

닷넷 프레임 워크 (.Net FrameWork)란?

Windwos 프로그램 개발 및 실행 환경을 말한다.
네트워크 작업, 인터페이스 등의 다양한 작업을 캡슐화하여 코딩의 효율을 상승시켜준다.
ex) 유니티 프로그램 내에서 큐브를 생성하는 것.

닷넷 프레임워크의 특징은 CLS라고 하는 닷넷 프레임워크의 언어가 반드시 지켜야 하는 언어스펙을 따르는 언어라면,
그 어떤 언어라고 해도 닷넷 프레임워크에서 실행이 가능하며, 이는 CLR이라는 가상 기계위에서 작동하기 때문에
플랫폼에 독립적이며, 프로그래머가 코딩을 하는데이 있어서 더 편리한 환경을 제공하는 것이 특징이다.

참고로, CLR 구동 중, IL 코드를 읽어 특정 운영체제에 맞는 Native Code로 변환시켜주는 작업을 JIT라고 한다.

즉, C# 프로그램은 컴파일 방식과 인터프리트 방식이 혼합된 하이브리드 방식으로 구동되며, 그 실행 순서는 다음과 같다

C# 컴파일 -> IL 생성 -> CLR -> 실행 파일

Net FrameWork는 C# 언어만을 위한 프레임 워크가 아니기 때문에 C# 언어를 제외한 다른 언어에서도 닷넷 프레임워크를 이용하는 것이 가능하다. 이때 발생하는 언어간의 문법적인 차이를 CLR을 통해서 통일화 시키는 것이 가능.

이는 CLR의 프로그래밍 언어의 호환성을 말한다.

그럼 JIT는?

Jist IN Time 컴파일 방식이라고 하며, 프로그램이 구동 중에 즉시, Native Code를 생성하기 때문에 특정한 운영체제에 맞는 최적화된 코드를 만들어내는 것이 특징이다.
그러나 프로그램이 구동 중에 생성하기 때문에 어느정도 시간이 필요하다는 단점이 존재한다.

C# 언어가 다른 언어와 호환이 가능한 이유

C# 언어는 내부적으로 CTS 규칙에 따라 데이터 타입을 구현하기 때문에 호환이 가능하다.

CTS?

Common Type System - 공용 타입 시스템이라고 부른다.

  • 닷넷 호환 언어가 지켜야할 타입의 표준 구격이다.
  • 닷넷을 호환하는 언어를 만든다면 반드시 CTS 규격을 지켜야 한다.
  • 그렇기 때문에 CTS를 모두 만들 필요는 없지만, 필요한 규격만 지원해도 되며, CTS 규격을 벗어나는 새로운 타입은 만들 수 없다.

C# 프로그램의 메모리 관리 방식

위에 가비지 컬렉션이라는 말을 꺼낸 적이 있다.
C#에서는 이 가비지 컬렉션이 메모리 관리를 해주고 있다.

  • 스택 메모리 관리 (정적)
  • 힙 메모리 관리 (동적)

C / C++은 메모리를 직접 적으로 관리해야 하지만, C# 언어는 가비지 컬렉션에 의해 자동으로 관리가 된다.
이는 메모리 릭을 염두하지 않고 프로그램 로직을 구성하는 것이 가능하다는 뜻이다.

스택 메모리

  • 스택 메모리는 지역적인 특징을 지니고 있기 때문에 시스템에 의해서 메모리가 관리되기 때문에 스택에 할당된 메모리는 따로 관리하기 위한 로직이 불필요하다.

힙 메모리

  • C# 언어에서는 계속 언급한 것 처럼 프로그래머에 의해 관리되지 않으며, 가비지 컬렉션에 의해 관리가 된다.

가비지 컬렉션

가장 큰 장점은 메모리 릭을 염두하지 않아도 된다는 것이다.
그러나 직접적으로 관리할 수 없기 때문에 불필요한 메모리 공간이 있다는 것을 프로그래머가 안다고 해도 즉시 제거하는 것이 불가능하다. 왜? 권한이 없기 때문에 가비지 컬렉션이 구동될 때 까지 불필요한 데이터는 메모리에 남아있게 된다.

그렇기 때문에 가비지 컬렉션에 의한 메모리의 관리는 프로그램의 부하를 일으키는 원인이 된다.
그래서 C# 프로그래머라면 프로그램을 작성할 때, 가비지 컬렉션의 상태에 신경을 많이 써야 한다. 또한, 높은 퍼포먼스를 요구하는 프로그램에서는 최적화에 대한 많은 노력이 필요하다.

profile
모든 실수를 경험해 더 발전하고 싶은 개발자입니다.

0개의 댓글