C#, 닷넷에서 변수에 값이 null 인지를 제대로 체크하지 않고 사용하면 NullReferenceException 예외가 발생할 수 있다. 생각보다 자주 발생하는 에러이다.

 

java에서도 nullpointerexception은 가장 쉽게 만나볼 수 있는 친근한 에러이다.

 

그래서 C#에서는 이를 잘 처리 할 수 있도록 다양한 문법들을 제공해주고 있다.

어려운 문법들도 있으나 아래의 예시정도만 정확히 알고 적재적소에 사용한다면 안정적인 코드를 작성할 수 있을 것이다.

 

우선 int나 double 과 같은 일반적인 변수에는 null을 대입할 수 없다.

그러나 아래 코드와 같이 변수 타입 뒤에 ? 를 붙이면 null값을 대입할 수 있다.

int? 와 같은 변수는 Nullable 타입이다. int? test2 는 컴파일 단계에서 Nullable<int> test2로 변경된다.

 

 

아래 코드와 같이 null값 뿐만 아니라 다른 데이터도 넣을 수 있다.

 

 

 

 

 

1
2
3
4
5
6
7
int? test2 = null//정상             
if(test2 == null//참
    Console.WriteLine("null");
 
test2 = 3;
if(test2 == 3//참
    Console.WriteLine(test2);
cs

 

변수의 필드나 속성을 구할때 null이 반환되는 경우도 있다. 이때 아래 코드와 같이 ?. 연산을 사용하여 처리하면된다. str이 null이라면 에러를 발생시키지 않고 null을 리턴하게 된다.

 

1
2
3
4
string str = null;
int? strLen = str?.Length; // int에 null 대입
if (strLen == null//참
    Console.WriteLine("null"); //출력
cs

 

 

위에 코드에서 해당 결과값이 null일때 null을 변수에 대입하는 대신 다른 값을 넣고 싶을 때는 ?? 연산자를 사용해서 아래 코드와 같이 사용하면 된다. str이 null이라면 에러를 발생시키지 않고 0을 대입하란 의미이다.

 

1
2
3
4
5
6
string str = null;
int strLen = str?.Length ?? 0//str이 null이면 0반환
if(strLen == //참
    Console.WriteLine("zero"); //출력
else  //거짓
    Console.WriteLine("not zero"); 
cs

 

항상 변수나 객체를 선언할 때 null이 참조되지 않도록 하는 습관이 중요하고 혹시라도 null에 가능성이 있다면 변수나 객체 선언을 할 때 ? 연산자를 사용하고 사용할때에는 if문으로 null값인지 검사하는 코드를 넣는 습관을 들이자.

 

Posted by 꿈만은공돌
,




C#/닷넷에 자료형에는 소수를 저장하는 변수가 double과 decimal 두가지가 존재


double은 부동소수점 방식을 이용하고 


decimal은 고정소수점 방식을 이용


부동소수점 방식 장점으론 작은 메모리공간에 큰 소수를 저장 가능하나 정확성이 떨어진다.


고정소수점 방식은 연산 속도가 빠르고 수의 정확성이 높은데신 큰수를 저장할때 메모리를 많이 잡아먹게 된다. 


C#에서 double은 8byte 메모리를 사용하며 decimal은 16byte에 메모리를 사용한다.


- 부동소수점의 원리를 잘 설명한 블로그 : https://blog.naver.com/chdb57/221146120811


- 고정소수점의 원리를 잘 설명한 블로그 : https://chogahui05.blog.me/221246891984




- 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//부동소수점 double 사용
double double1 = 0.1;
double double2 = 1;
 
if (double1 + double2 == 1.1)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");
   
 
//고정소수점 decimal 사용         
decimal decimal1 = 0.1M;
decimal decimal2 = 1.1M;
 
if (decimal1 + decimal2 == 1.1M)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");



위의 예제처럼 부동 소수점은 == 연산을 사용해서 비교를 하면 안된다.


Posted by 꿈만은공돌
,

닷넷 네이티브(.NET Native)란

 

보통의 C#은 CLR(Common Language Runtime)이 C#의 소스코드를 컴파일 해서 생성된 IL(Intermediate Language) 코드를 만든다. 그리고 이 IL 코드를 가지고 런타임에 JIT(Just In Time) 컴파일러가 네이티브 소스코드를 만든다.


이런 방식에 장점은 개발자가 코드를 작성해서 배포할 때 사용자의 실행환경(OS, CPU 등)을 고려하지 않아도 된다.


하지만 이러면 단점이 메모리를 많이 사용하게 되고 속도 또한 떨어지게 된다.

그래서 이를 해결하기 위해 나온 것이 닷넷 네이티브 이다.


닷넷 네이티브는 AOT(Ahead of time) 컴파일을 사용해 대상에 CPU와 OS에 맞는 네이티브 코드가 생성이된다.


그러면 실행 속도가 빨라지고 메모리 사용량 역시 감소 한다.


이미지 출처 : https://www.slideshare.net/AlexThissen/net-core-new-platform-bern-lucerne-2016-final



자세한 사용 방법 및 내용은 아래 출처 참고

https://blogs.msdn.microsoft.com/dotnet/2014/04/02/announcing-net-native-preview/



참고 자료 : 크로스 플랫폼 개발을 위한 C#7 과 닷넷 코어 2.0 책


Posted by 꿈만은공돌
,


.NET Framework(닷넷 프레임 워크)

 - 윈도우 전용

 - 다양한 기능과 확장을 지원


.NET Core(닷넷 코어)

 - 윈도우, 리눅스, macOS 에서 사용가능

 - 경량화 하여 매우 가볍움

 - Docker 사용 가능


Xamarin 

 - 모바일 환경에 제한된 기능

 - 안드로이드, IOS, 윈도우 모바일 등을 지원


공통적으로 .NET Standard Library 2.0 을 공유한다. 




출처 : 크로스 플램폼 개발을 위한 C# 7과 닷넷 코어 2.0 책, 

https://blogs.msdn.microsoft.com/cesardelatorre/2016/06/27/net-core-1-0-net-framework-xamarin-the-whatand-when-to-use-it/


Posted by 꿈만은공돌
,