[C#]_C#구조

윾띵진·2022년 6월 28일
0

게임개발

목록 보기
7/7

//C# 언어에서 전처리기 명령어를 사용하기 위해서는 반드시 파일 최상단에 위치시켜야 한다.

#define EXAMPLE_TYPE_VALUE
#define EXAMPLE_TYPE_REFERENCE
#define EXAMPLE_TYPE_NULLABLE

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region C# Basic
/*
▶ C# 언어의 문법을 숙지해야 하는 이유

  • 유니티 엔진에서 기본적으로 스크립트는 대부분 C# 스크립트를 이용하기 때문에
    유니티 엔진의 활용성을 높이기 위해서는 C# 언어에 대한 지식이 필수로 필요하다.
    C / C++ 스타일로 C# 문법을 모르고 작성하는 것도 가능하지만 결국엔 한계에 부딪히기 된다.

중요
▶ C# 프로그램 동작 방식

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

▶ CLR(Common Language Runtime)// 기계어로 변환해주는 가상머신

  • 마이크로 소프트에서 개발한 가상 머신의 구성요소(Windows 전용)
  • 기능은 크게 2가지로 말할 수 있다.
  1. 중간 언어를 JIT 컴파일러를 이용해서 기계어로 변환 가능
  2. 가비지 컬렉션을 통한 동적 메모리 관리

닷넷 프레임워크
박싱 / 언박싱
가비지 컬렉션은 2세대까지 있다.
애딧 타임
런타임
메모리가 오버플로우 될 것같으면 0세대에서 1세대로 간다
0세대는 동면시킨다
1세대가 다 차면 2세대를 부른다
2세대가 불러지면 재앙이 시작된다.
프레임이 떨어진다.

지울 거 없나 하고 다시 읽을 프레임 드랍.

가상 머신(Virtual Machine) :
ㄴ 컴퓨터에서 가상으로 사용하는 컴퓨터
ㄴ 컴퓨터에서 1대 이상의 컴퓨터를 구동하는 것으로 하드웨어 등 모든 컴퓨터 자원을 가상화 시킨 것

ㄴ C#은 CLR이라는 중간 과정을 거쳐서 다른 언어를 사용할 수 있게 지원을 한다.
ㄴ CLR은 CIT 코드를 읽어들여 OS가 이해할 수 있는 Native Code로 변환하는 역할을 한다.
ㄴ 이때 서로 다른 언어들이 만나는 지점이 IL이라는 중간 언어이며 이 언어로 쓰여진 코드를 다시
CLR이 자신이 실핸한 플랫폼으로 맞춰서 컴파일 하는 구조

※ 요약하면 CLR은 따로 컴파일을 해서 실행을 시키고 그걸 해당 플랫폼에 다시 맞춰서
컴파일을 하게 하는 기능을 뜻한다.
※ C / C++은 컴파일을 진행해서 프로그램을 바로 만들어 낸다.(컴파일러가 있어서 바로 실행을 해준다.)

트리플 A 게임?

CIL (Common Intermediate Language: 공통 중간 언어)
ㄴ 닷넷 프레임워크에서 실행되는 언어
ㄴ 닷넷 프레임워크 언어로 개발된 프로그램 코드는 컴파일 시 바이너리 형태로 CIL이라는 파일로 작성된다.

※ .Net FrameWork:
ㄴ Windows 프로그램 개발 및 실행 환경
ㄴ 네트워크 작업, 인터페이스 등의 많은 작업을 캡슐화하여 코딩의 효율을 올려준다.
특징으로는 CLS (닷넷 프레임워크의 언어가 반드시 지켜야하는 언어 스펙)을 따르는 언어라면
어떠한 언어라도 닷넷 프레임워크에서 실행이 가능하며 ClR이라는 가상 기계위에서 작동하기
때문에 플랫폼에 독립적이며 궁극적으로는 프로그래머가 코딩을 하는데 더 편한 환경을 제공한다.

그리고 CLR구동중에 IL 코드를 읽어 들여서 특정 운영체제에 맞는 네이티브 코드로 변환시켜주는
작업을 JIT(Just In Time 컴파일 방식) 이라고 한다.


즉, C# 프로그램은 컴파일 방식 + 인터프리트 방식의 혼합 하이브리드 방식으로 구동된다.

★ 실행순서 :
C# 컴파일 -> IL 생성 -> CLR -> 실행파일

▶ JIT 컴파일 방식의 장점

  • 프로그램이 구동 중에 즉시 네이티브 코드를 생성하기 때문에 특정 운영체제에 맞는 최적화
    코드를 만들어 내는 것이 가능하다.

▶ JIT 컴파일 방식의 단점

  • 프로그램이 구동중에 네이티브 코드를 생성하기 때문에 해당 코드를 생성하기 위한 시간이
    필요하다.

▶ CLR의 두드러지는 3가지 역할
ㄴ 메모리 관리(가비지 컬렉션)
ㄴ 예외처리
ㄴ 프로그래밍 언어간의 호환성
ㄴ .Net FrameWork는 C# 언어만을 위한 프레임 워크가 아니기 때문에 C# 언어를 제외한
다른 언어에서도 닷넷 프레임워크를 이용하는 것이 가능하다.
이때 발생하는 언어간의 문법적 차이를 CLR을 통해서 통일화 시키는 것이 가능

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

  • C# 언어는 내부적으로 CTS(Common Type System) 규칙에 따라 데이터 타입을 구현하기 때문에

※ CTS (Common Type System):
ㄴ 공용 타입 시스템
ㄴ 닷넷 호환 언어가 지켜야 할 타입의 표준 규격으로 닷넷 호환 언어를 만든다면 CTS 규격을
반드시 지켜야 한다.
ㄴ CTS를 모두 만들 필요는 없지만 필요한 규격만 지원해도 되며 CTS 규격을 벗어나는 새로운
타입은 만들 수 없다.

▶ C# 프로그램의 메모리 관리 방식(가비지 컬렉션):
1. 스택 메모리 관리 (정적)
2. 힙 메모리 관리 (동적)

  • C# 언어는 힙 메모리를 프로그래머가 직접적으로 관리하는 C / C++ 언어와 달리
    C# 언어의 힙 메로리는 가비지 컬렉션에 의해서 관리가 된다.
    (즉, 메모리 릭을 염두하지 않고 프로그램 로직을 구성하는 것이 가능하다.)

▶ 스택 메모리의 특징

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

▶ 힙 메모리의 특징

  • C / C++ 언어와는 달리 C# 언어에서 힙 메모리는 프로그래머에 의해서 직접적으로 관리되지 않는다
    (즉, 해당 영역 메로리 영역은 가비지 컬렉션에 의해서 관리가 된다.)

▶가비지 컬렉션에 의한 메모리 관리 방식의 장점

  • 메모리 릭을 염두하지 않고 프로그램 로직을 구성하는 것이 가능하기 때문에 편하다.

▶가비지 컬렉션에 의한 메모리 관리 방식의 단점

  • C# 언어는 힙 메로리를 할당하는 것은 가능하지만 직접적으로 관리되지 않기 때문에 불필요한 메모리 공간이
    있다는 것을 알아도 즉시 제거하는 것이 불가능하다.

  • 권한이 없이 때문에 가비지 컬렉션이 구동 될 때까지 해당 데이터는 메모리에 계속 상주한다.

  • 그렇기 때문에 가비지 컬렉션에 의한 메모리 관리는 많은 부하를 일으키는 원인이 된다.

그래서 프로그램을 작성할 때는 가비지 컬렉션의 상태를 신경써야 한다.(프로그램 로직)
또한, 높은 퍼포먼스를 요구하는 프로그램에서는 최적화에 대한 많은 노력이 필요하다.

<유니티 프레임 워크>

엔진의 정의
라이버러리의 집합 + 툴 ex) 유니티 에디터
엔진 사용하는 기능을 캡슐화해서 라이브러리화 해둔 것들
*/

#endregion

public class Example_01 : MonoBehaviour
{

public void Awake()
{

#if EXAMPLE_TYPE_VALUE
Debug.Log
#else EXAMPLE_TYPE_REFERENCE
//레퍼런스 타입을 보고 싶으면 선택적 컴파일
//기능을 선택적으로 불러올 수 있다.
#endif EXAMPLE_TYPE_NULLABLE

}
//<게임개발>

//네이티브 언어
//플랫폼 개발
//엔진
//3개를 관통하는 언어 : C++

//<유니티>
// C#을 쓰지만
// C++로 이루어져있다 
// transform은 DX
// 프로그래머는 엔진을 만들 수 있어야한다.

//프레임워크

// C# Script를 쓰는 것이다
// C# 네이티브 랭귀지보다 하이랭귀지

}

profile
Sprezzatura

0개의 댓글