0629

윾띵진·2022년 6월 29일
0

//#define EXAMPLE_TYPE_VALUE
//#define EXAMPLE_TYPE_REFERENCE
#define EXAMPLE_TYPE_NULLABLE

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

/*
▶ C# 언어 자료형의 특징
- C# 언어는 기본적으로 모든 데이터가 클래스 또는 객체로 인식이 된다.
ㄴ C / C++ / C# 자료형의 차이점에 대해서
ㄴ 즉, int, float, double 등의 기본 자료형에도 C#에서는 내부적으로
클래스로 표현된다는 것을 의미한다.

★
- 또한, C# 언어의 자료형의 데이터 타입에 따라서 값 타입과 참조 타입으로 나뉜다.
- 그리고 데이터의 형식에 따라서 기본 데이터 형식과 복합 데이터 형식으로 구분된다.

복합 데이터 형식:
ㄴ 구조체와 클래스 + 배열

< C# 필수 지식 > 
▷ 값 형식 데이터 타입의 특징 (깊은 복사)
-값 형식의 데이터 타입은 스택 메모리에 할당된다.
ㄴ 즉, 시스템에 의해서 메모리가 관리된다. (정적)
- 박싱, 언박싱이 발생한다.

▷ 참조 형식 데이터 타입의 특징 (앝은 복사)
 - 참조 형식의 데이터 타입은 실제적인 값을 스택에 할당하는 값 형식과는 달리
실제 값은 힙 메모리에 할당되며 해당 메모리에 대한 참조 값을 스택에 할당하는 변수에 보관한다.
ㄴ 즉, 함조 형식의 데이터 타입은 가비지 컬렉션에 의해서 메모리가 관리된다.

이는 C# 언어는 기본적으로 다른 언어와의 호환성을 지닐 필요가 있기 때문에 
C# 언어의 자료형이 CTS 표준을 따르고 있기 때문

*최선을 다해 최적화 해야하는 부분은 힙이다

                
C++ STL         C# STL
Vector     ->     array List
Q          -> 
map        ->     Dictionary
List       ->     L
bitset     -> 
func       ->     E.V           

▶ C# 언어의 변수 특징
- C# 언어의 모든 클래스는 Object 클래스를 직 / 간접적으로 상속하는 것이 원칙이다
ㄴ 즉, Object 타입의 변수로 모든 데이터를 보관하는 것이 가능

- Object 타입을 다른 데이터 형식의 값으로 제어하는 것을 박싱/ 언박싱이라고 지칭한다.

- 박싱은 데이터를 보관하는 행위
- 언박싱은 데이터를 읽어들이는 행위

- 박싱 언박싱을 최대한 배제시키는 것이 중요

Object 타입의 변수는 기본적으로 참조 타입이기 때문에 해당 변수에 참조 타입의 값을 보관할 때는
퍼포먼스 저하를 일으키지 않지만, 값 형식의 데이터를 보관할때는 박싱/ 언박싱이 수행되기 때문에
퍼포먼스 저하가 발생한다.

▷ 값 형식의 종류
- byte / sbyte
- int, uint, long
- float(정밀도:7), double(정밀도: 15), decimal (정밀도: 29 / 연산 느림 / 메모리 : 16Byte)
- char
- enum
- struct
- Nullable (값 형식에서도 null 체크가 가능하게 해줌)

- C 계열 언어는 타입에 매우 엄격한 언어이다.
ㄴ 오류를 방지하기 위해 

▷ 참조 형식의 종류

- 기본적으로 참조 형식은 null 대입이 가능하다.
- null은 쓰레기값 오류를 방지하기 위함

- Object
- string
- Class
- Delegate

▷ 값 형식과 참조 타입의 차이점
- 기본적으로 C#의 Object 타입은 모든 데이터를 가르키는 것이 가능하지만
Object 타입은 참조 타입에 해당되기 때문에 해당 타입의 변수에 값 타입의 데이터를 할당할 경우
내부적으로 방식 / 언박싱이 발생한다.

- 값 타입의 자료형은 스택에 할당되기 때문에 시스템에 의해서 메모리가 관리되고
값을 할당할 때는 내부적으로 복사가 발생한다 (즉, 값 자체가 복사된다.)

- 반면 참조 타입의 자료형은 힙에 해당되기 때문에 가비지 컬렉션에 의해서 메모리가 ㄱ
관리되고 값을 할당할 때 참조 값의 복사가 이뤄진다. (메모리 주소 할당)

- 단, C# 언어의 문자열은 기본적으로 변경이 불가능하기 때문에 (권한이 없기때문)
기본 문자열을 편집한 새로운 문자열을 얻기 위해서는 새로운 메모리 공간에 문자열을
생성해야 한다.
(즉, 한번 할당되어 만들어진 문자열은 더 이상 편집이 불가능하다.)

* 
Nullable 타입이란? 
- 기본적으로 C# 언어는 참조 타입 데이터의 유효하지 않는 여부를 null 키워드를 통해서 구분할 수 있는
반면에 값 타입의 데이터는 null 키워드를 이용하는 것이 불가능하다. 
(이는 오류를 미리 방지 할 수 없음을 의미)

- 그렇기 때문에 Nullable 타입이라는 자료형이 주어지며 해당 자료형은 값 타입에 
null 키워드를 사용할 수 있게 하는 기능을 제공한다.

- Nullablie 값 타입의 데이터에만 사용하는 것이 가능하다.


C++ 11 (모던 C++) 14, 17 b 
C# 6.0 (10까지 나옴)



2D에서는 int가 압도적이지만
3D에서는 float이 우세다.
float은 소수점 7자리까지

7자리는 컴파일러가 뽑은 근사치
C++은 
double은 15자리
decimal은 c++에 없음 대략적으로 29자리 
중첩에 중첩

라운딩에러 (컴파일러가 잘라먹어요)

 */

public class Example_2 : MonoBehaviour
{
private void Awake()
{
#if EXAMPLE_TYPE_VALUE
int nValue = 10;
float fValue = 3.14f;
double dValue = 3.14;
decimal mValue = 3.14m;

    Debug.LogFormat("데이터 출력: {0}, {1}, {2}, {3}", 
        nValue, fValue, dValue, mValue);

#elif EXAMPLE_TYPE_REFERENCE
objuct oValue = 10;
string oString = "Hell Fire";

    /*
    $:
    ㄴ C# 6의 추가된 기능
    ㄴ 문자열 보간 (보간된 문자열로 식별하는 기능)
    ㄴ {0}, {1}, ...과 같이 서식 항목들의 순서를 정해주는 Format()방법과는 달리,
    문자열 보간은 string 안에 직접 변수 이름을 할당한다.
    */
    
    Debug.Log($"데이터 출력 : {oValue}, {oString}");

#else
//C# Nullable 타입은 Null을 가질 수 없는 데이터 타입을 Null을 가질 수 있도록 새롭게 만든 타입이다.
// 선언하는 방법 2가지 1. 데이터 타입? // 2. Nullable

    int? nValue = null;
    float? fValue = null;
    System.Nullable<int> nValueB = 10;

    // HasValue : 값이 있으면 t 없으면 (null) f
    if (nValue.HasValue)
    {
        Debug.Log("정수형 값이 유효하다.");
    }

    else
    {
        Debug.Log("정수형 값이 유효하지 않다");
    }

    if (fValue != null)
    {
        Debug.Log("실수형 값이 유효하다");
    }

    else
    {
        Debug.Log("정수형 값이 유효하지 않다");
    }

    if (nValueB.HasValue)
    {
        Debug.Log("정수형 값이 유효하다.");
    }

    else
    {
        Debug.Log("정수형 값이 유효하지 않다");
    }

#endif
}
}

profile
Sprezzatura

0개의 댓글