본문 바로가기
C#/C# 학습 (TIL)

C# 자료형의 특징 , 변수의 특징 - 값 형식 / 참조 형식 데이터 타입

by jjiing 2022. 6. 29.

 

▶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("정수형 값이 유효하지 않다.");