프로그래밍 농장

C# 프로그래밍_1 본문

C#

C# 프로그래밍_1

Tennessee201 2022. 7. 4.
728x90

Why C#? 

-> 유니티의 경우도 실제로는 C++로 되어있지만, C#으로 한번 Wrapping하여 사용하는 방식으로 구동된다. 

"CLR" (Common language Runtime)

-CLR is the basic and Virtual Machine component of the .NET Framwork

-컴파일된 c# 코드를 실행하는 역할 

 

-> 자바에서 jvm과 같이 c#에서는 .NET Framwork 위에서 구동된다 

-> why? 리눅스 , 윈도우, 맥과 같이 다양한 os상에서 구동되어야 하기떄문에 위와같은 프레임워크 위에서 사용된다.

원래 .NET Framwork는 윈도우상에서만 가능하였다. -> 이후 mono라는 개인재단에서 .NET 프레임워크를 오픈소스화 시켜서 닷넷 자체를 안드로이드나 리눅스, 아이폰에서 돌아가도록 하였다. 

Mono Framework 를 통하여 ONECODE가 실행되었다 !

-> 2010년 이후에서 MONO재단이 자마린 재단으로 이름이 바뀌고, 이를 윈도우가 직접 인수하면서 오픈소스로 전환하였다.

 

.NET Platform

Home of the open source .NET platform. .NET Platform has 218 repositories available. Follow their code on GitHub.

github.com

C# 코드를 컴파일한 코드 -> DLL 파일로 제공 -> DLL 파일 형식으로 제공 

 

Mono framwork(Tamatrin) : 멀티플랫폼에서 구동가능하도록한것이다.


유니티 파일에서는 .cs 파일과 .meta 파일이 존재한다. 

항상 파일네임과 같은 이름으로 생성된다. 하지만 깃허브에서는 항상.meta파일을 gitignore을 사용하여 제거해주어야한다. 

자바의 경우 Main 이라는 클래스가 별도로 존재하는데 유니티-c#에서는 이것을 내장시켜놓은것이다. -> unity DLL 

-> 그렇기에 유니티 C#에서는 main이라는 개념이 별도로 없다.

- Monobehavior 란? : 유니티에서 가장 기본이 되는 클래스이며, Gameobject를 사용하기위해서는 꼭 클래스에 상속시켜주어야한다. -> Monobehavior가 없다면 유니티상에서 컴포넌트 등등.. 을 Gameobect에 붙히지를 못한다. 

Monobehavior의 생성주기 : Awake() -> [ onEnable() ]  Start() -> update()  ->  [ TriggerEnter()/ CollisionEnter()/OnDisable() 과 같은 물리]  -> onDestory()

 

onEnable() : setActive()와 비슷한 유형 

update() : 프레임당 수행 -> 컴퓨터의 사양에 따라 달라질수있음.


- 자료형 ( ex. bool , byte, char, int . . . ) : 메모리에 어떤식의 변수를 할당할것을 정해주는 것 

         signed : 0부터 시작되는 양의 정수 / unsigned : - 부터시작되는 음의 정수  

           부동소수점(Float) : 

           고정소수점(Decimal) : 최대 16byte까지 잡을수있다. (but, 메모리를 많이 잡아먹는다.)

           부동(Foating(뜰 부: 떠다닌다))소수점  /  고정(Fixed) 소수점

 

 

- 변수 (메모리에 할당(적재))  ex. 숫자, 문자, 문자열 . . 

 

- 리터럴 : 별도의 선언을 한하고 사용하는 리터럴 상수 

 

프로그래밍을 할떄,  변수=명사 / 함수=동사 라고 가정하면 편하다. 

ex) FPS게임에서 '총을 쏴서 적군을 맞춘다'  

-> 총 , 적군 = 명사(변수 생성)

-> 쏜다, 맞춘다 = 동사(함수 생성)


Debug.Log(_numberWithFloat3 - 0.1m); // m:decimal(부동소수점)을 표현 

-> 부동소수점을 타 형식과 연산하면 에러가 난다.

 

ex) A(소수점) == B(소수점)  :  이와같은 소수점 비교는 비주얼스튜디오에서 하는것은 비추 

-> 정 하고싶다면 이를 문자열화 시킨후 글자를 비교하는 방법이있다. (자리수를 잡고 TWIN이라는 작업을 실제로 현업에서 함)


- 연산자 

기본연산자( +, -, /, %. . ) / 복합 대입 연산자(+=, -=, . . ) / 증감연산자 ( ++, -- . . )

비교연산자(boolean, <, >=, >, <= . .) / 


- 문자형(char)  . .

- 문자열(string)  . .


- Bool형 : 자료의 참/거짓을 확인하기 위한 자료형  (true / false) 

 


- 논리 연산자  : Boolean IsDead = true;  /  Debuging(!IsDead)

^ : xor / && / & / || / | / |= . . 

 

ex)  false && (Instantiate("Enemy") == null )  -> &&(and)일시 앞의 값이 false면 뒤는 아예 실행을 안하기 때문에 뒤까지 확인을 하고싶으면 & 하나만 사용하면된다. 

 

-> enemy를 생성하라고 시켰는데, enemy가 없다면 프로그램상에서 null을 출력한다. 

 

ex) true || false 

if ( true || ture -> true ) -> 위와 같이 앞이 true면 그냥 뒤를 아예 검사하지않음 .(실행 x) 똑같이 전체적으로 수행시키고 싶으면, 위와 마찬가지로 | 를 하나만 써주면 된다. 

ex) Boolean A = true;

A &= false;  A= false&&A; 

a |= false -> a = false||a;


- 형변환(Casting)

 

ex) int a = 3;

float b = 4f;

a = b 일때 형변환이 일어난다. 

 

-> 암시적 형변환 : int -> float으로의 변환은 상관없음. but, 반대로 float -> int의 경우에는 가수,지수부에서 지수부를 날려야하기에(손실되는 경우가 생길떄)는 암시적 형변환이 이루어진다. 

-> 명시적 형변환 : 위와 마찬가지로 버리는것이 생기는 순간 명시적 형변환이 이루어진다. 


- var : 암시적 자료형 

-> 굳이 형 지정을 안해도 자동으로 잡아줌 

ex) int a =3;  / float b = 1.23f; / char c = 'h'; . . 

var 를 사용할경우 형을 자동으로 잡아줌. 

-> js의 var와는 다름 -> js&python의 경우 JIT(Just-In-Time)컴파일 방식이기 떄문에 되든 안되든 위부터 한줄한줄 수행시킴 

c#에서의 var

- 선언할때 값을 지정해주어야한다

- 자료형을 자동으로 구분해준다

- 지역변수에서만 사용이 가능하다

- 숫자 내장 타입 (int, float, double . .) 사용시는 var는 주의 (지양) 

     : why? -> 형변환 문제가 발생하기 떄문 : ex) var a =1.23f; / var b = 3;   a =b ; -> ? 

왠만하면 var을 사용하는 이유 : 코드를 간결하게 작성하기 위하여 


- 코드 표기법

- 파스켈 케이스

-카멜 케이스 (단어를 대문자로 구분지음) ex. dieCount

- 스네이크 케이스 ( 단어를 _로 구분지음) ex.  die_count


배열 : 같은 자료형만을 사용 + 같은 이름을 사용 + 메모리상에 순차적(ex. int -> 4byte만큼) 으로 저장

-> 메모리상에 일렬로 저장이 되기 때문에 순착적으로 접근이 가능하다 ( index 형식 )

int[5] arrayHp = new int[5];


다차원 배열 : 

public class Day1Ex2 : MonoBehaviour
{
    private int[] _nArrayHp = new int[] { 1, 2, 3, 4, 5 };


    public float[,] _nArrayHp2 = new float[,]
    {
        { 1f, 2f, 3f, 4f, 5f },
        { 6f, 67f, 8f, 9f, 10f}
    };

    public float[,] _nArrayHp3 = new float[2, 5];


    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(_nArrayHp2[0,0]);
        Debug.Log(_nArrayHp2[0,1]);
        Debug.Log(_nArrayHp2[1,0]);

 

 //가변배열 
    public float[][] _nArraryHp3 = new float[5][]
    {
        new float[]{1f,2f,3f,4f,5f},
        new float[]{6f,7f,8f,9f},
        new float[]{1f,2f,3f},
        new float[]{6f,7f},
        new float[]{1f},

    };

 

 

 

 

 

 

 

 

 

728x90