Written by coh at home
[C#] 3장 데이터 타입 본문
primitive type, constant, enumerator, complex data type(Array, Class, Structure) 와 같이 4가지 타입이 있다고 볼 수 있다.
사실 오늘 하고 싶은 것은 int, float 등등에 타입에 대해 씨샵을 배울 때 헷갈렸던 이야기에 대해 해보려고 한다.
using System;
namespace StringConversion{
class MainApp{
psvm(string[] args){
int a = 123;
string b = a.ToString();
Console.WriteLine(b);
float c = 3.14f;
string d = c.ToString();
Console.writeLine($"{d}");
string e = "12345";
int f = Convert.ToInt32(e);
Console.WriteLine(f);
string g = "1.234";
float h = float.Parse(g);
Console.WriteLine(h);
}
}
}
값타입 vs 원시타입
내가 가장 궁금했던 것은 이거다. float.함수() int.Parse() 이런 식으로 사용하던데 int는 원시타입이 아니었던 것인가?!
결론부터 말하면 값타입과 원시타입이 다른 것에서 온 혼동이었다.
값타입
값타입은 메모리(스택)에 직접 값이 저장되는 데이터 타입이다. 원시타입 뿐만 아니라 구조체 등 사용자 정의 타입도 포함된다.
원시타입
특정 언어에서 기본적으로 제공하는 데이터 타입. 모든 원시타입은 값타입이지만 모든 값타입은 원시타입이 아니다.
int, float, double 등이 있다.
다시 결론으로
int.Parse()는 구조체의 멤버 함수를 호출한 것이다. C#의 int는 C언어와는 달리 System.Int32라는 구조체로 만들어져 있고 이로인해 해당 메서드를 사용할 수 있었던 것.
그외 데이터 타입에서 중요한 것..
- 참조데이터는 힙에 할당.
- 상수 키워드와 enum상수와 열거 형식을 사용하는 이유는 오류가 없는 코드를 만들기 위해서.
const int a = 3; a = 4 // Error enum ShowMessage = {YES, NO, CONFIRM}; // 컴파일러가 0부터 ++로 할당. 직접 정수값 지정 가능. static void Main(string[] args){ ShowMessage result = ShowMessage.YES; System.Console.WriteLine(result == ShowMessage.YES); // True }
- 상수
- 오버플로우
- 타입변환(Type Conversion)
- 크기가 서로 다른 정수 형식 변환 (4byte to 1byte) -> 오버플로우 발생 가능
- 크기가 서로 다른 부동 소수점 변환 (float to double) -> 정밀도가 달라서 비교(==) 연산시 에러 발생가능. e.g) 0.1f
- uint to int -> 오버플로우 발생 가능
- float to int -> 소수점 아래는 버림
- 문자열을 숫자로(int.Parse(문자열)) 혹은 숫자를 문자로(ToString())
- 부동소수점 원리
- var형식 : 선언과 동시에 초기화 해야함. 컴파일러가 타입을 추론하기 때문. 또한 지역변수로만 사용 가능.
- C#은 전역변수가 없다.
- 씨샵의 데이터 타입은 공용 형식 시스템(CTS)인 .NET의 데이터 형식 체계를 따른다.
Nullable형식
아 Nullable은 좀 짚고 넘어가야 할 듯 싶다.프로그래밍을 하다보면 0이 아닌 어떤 값도 가지지 않는 변수가 필요할 때가 있다. 그때 사용.
값형식에만 사용이 가능하다. 참조형식은 사용이 불가능하다.
음,, 좀 더 나아간 이야기를 해보면 Nullable구조체에 값변수가 담기게 된다.a.HasValue 값읽기 전용 프로퍼티.
a.Value 값읽기 전용 프로퍼티.프로퍼티
```
public struct Nullable<T> where T : struct
{
private readonly bool hasValue;
private readonly T value;
public bool HasValue => hasValue; // 읽기 전용 프로퍼티
// 생성자 및 기타 메서드들
}
```
- 클래스나 구조체 내에서 필드값을 안전하게 읽거나 설정할 수 있게 하는 멤버. HasValue는 get접근자만 있는 읽기전용 프로퍼티.
- 만약 값이 null인데 a.Value를 호출하면 InvalidOperationException을 CLR컴파일러가 발생시킨다.
int? a = null; // Nullable<int>. Nullable<T> 구조체도 값타입이다. if (a.HasValue){ System.Console.WriteLine(a.value); }
'languages > c#' 카테고리의 다른 글
[C#] 문자열 (0) | 2024.11.18 |
---|---|
[C#] 2장 namespace (4) | 2024.11.05 |