▶C# 언어 자료형의 특징
- C# 언어는 기본적으로 모든 데이터가 클래스 객체로 인식된다.
int , float, double 등 기본 자료형도 C#에서는 내부적으로 클래스로 표현된다.
- C#언어는 자료형의 데이터 타입에 따라서 값 타입과 참조 타입으로 나뉜다.
그리고 데이터의 형식에 따라서 기본 데이터 형식과 복합 데이터 형식으로 구분된다.
기본데이터형식 : 숫자 형식, 문자열 형식, 논리 형식, 오브젝트 형식 등으로 나누어지는 것.
복합데이터 형식 : 구조체, 클래스, 배열
▷값 형식 데이터 타입의 특징
값 형식의 데이터 타입은 스택 메모리에 할당된다.
즉, "시스템"에 의해서 메모리가 관리된다.
▷참조 형식 데이터 타입의 특징
참조 형식 데이터 타입은 실제저인 값을 할당하는 값 형식과는 달리,
실제 값은 힙 메모리에 할당되며 해당 메모리에 대한 참조 값을 스택에 할당하는 변수에 보관한다.
즉, 참조형식의 데이터 타입은 가비지 컬렉션에 의해서 메모리가 관리된다.
참고로 c계열 언어는 타입에 매우 엄격한 언어이다.
▶C# 언어 변수의 특징
C# 언어의 모든 클래스는 object 클래스를 직/간접적으로 상속하는 것이 원칙이다.
즉, object 타입의 변수로 모든 데이터를 보관하는 것이 가능하다.
object타입을 다른 데이터 형식의 값으로 제어하는 것을 박싱/ 언박싱이라고 지칭한다.
박싱 : 데이터를 보관하는 행위
언박싱 : 데이터를 읽어들이는 행위
Object 타입의 변수는 기본적으로 참조타입이기 때문에 해당 변수에
참조 타입의 값을 보관할 때는 퍼포먼스 저하를 일으키지 않지만,
값 형식의 데이터를 보관할때는 박싱/ 언박싱이 수행되기 때문에 퍼포먼스 저하가 발생한다.
C#에서의 데이터 관리 방법의 핵심
1. 가비지컬렉션 2. 박싱/언박싱
▷값 형식과 참조 타입의 차이점
기본적으로 C#의 object 타입은 모든 데이터를 가르키는 것이 가능하지만
object 타입은 참조 타입에 해당되기 때문에 해당 타입의 변수에 값 타입의 데이터를 할당 할 경우 내부적으로 박싱 / 언박싱이 발생한다.
값 타입의 자료형 : 스택에 할당되기 때문에 시스템에 의해서 메모리가 관리되고, 값을 할당할 때는 내부적으로 복사가 발생한다.(즉, 값 자체가 복사된다.)
참조타입의 자료형 : 힙에 할당되기 때문에 가비지 컬렉션에 의해서 메모리가 관리 되고 값을 할당할 때 참조 값의 복사가 이뤄진다.(메모리 주소 할당)
단, c#언어의 문자열은 기본적으로 변경이 불가능하기 때문에(권한이 없기 때문)
기본 문자열을 편집한 새로운 문자열을 얻기 위해서는 새로운 메모리 공간에 문자열을 생성해야한다.
(말인즉슨 한번 할당되어 만들어진 문자열은 더 이상 편집이 불가능하다.)
▷값 형식의 종류
-byte / sbyte
-int, uint, long(정밀도 차이)
-float(정밀도 : 7 = 소수점 7자리), double(정밀도 : 15), decimal(정밀도 : 29 / 연산느림/ 메모리 16byte, c++엔 없음)
(*라운딩 에러 : 컴파일러가 소수점 잘라서 생기는 오류)
-char
-enum
-struct
-Nullable
▷참조 형식의 종류
기본적으로 null 대입이 가능하다. (null 대입 => 쓰레기값 들어가는 것 방지 => 오류방지)
-Object
-string
-Class
-Delegate
Nullable 타입이란?
null을 가질 수 없는 데이터 타입을 null을 가질 수 있는 새롭게 만든 타입이다.
(선언방식)
1. 데이터 타입?
2. Nullable<int>
int? nValue = null;
float? fValue = null;
System.Nullable<int> nValueB = 10;
기본적으로 C#언어는
참조 데이터가 유효한가의 여부를 null키워드를 통해서 구분할 수 있는 반면에
값 타입의 데이터는 null키워드를 이용하는 것이 불가능하다. (이는 오류를 미리 방지 할 수 없음을 의미)
그렇기 때문에 Nullable 이라는 자료형이 주어지며, 해당 자료형들은 값 타입의 데이터들에 NULL 키워들 사용할 수 있게 하는 가능을 제공한다.
따라서 Nullable 은 값 타입의 데이터에만 사용하는 것이 가능하다.
그 외 참고 정리
1. Debug.LogFormat
Debug.LogFormat("데이터 출력 : {0}, {1},{2},{3}", nValue, fValue, dValue, mValue);
로그포맷 - 중괄호 별로 매칭
{0},{1}과 같이 서식 항목들의 순서를 정해준다.
(예시)
2. $
Debug.Log($"데이터 출력 : {oValue}, {oString}");
C#의 추가된 기능 : 문자열 보간 (보간된 문자열로 식별하는 기능)
{0},{1}과 같이 서식 항목들의 순서를 정해주는 Format()방법과는 달리
문자열 보간은 string 안에 직접 변수 이름을 할당한다.
(예시)
3. HasValue
값이 있으면 T, 없으면 F
int? nValue = null;
if (nValue.HasValue)
Debug.Log ("정수형 값이 유효하다");
else
Debug.Log("정수형 값이 유효하지 않다.");
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# 컬렉션 - 딕셔너리 / 해쉬테이블 (0) | 2022.06.30 |
---|---|
C# Array 배열/ Static Class 정적 클래스 / Extend Method 확장메서드 / 변수 표기법 / StringBuilder (0) | 2022.06.29 |
C# CLR(공통언어런타임) / CIL(공통 중간 언어) / C#의 메모리 관리 방식 (0) | 2022.06.28 |
C# 오브젝트 풀링 (0) | 2022.06.26 |
C# OverlapSphere / 콜라이더 배열 (0) | 2022.06.26 |