C++ 쟁이가 C#을 배워보자 - 변수

개발자로 일하면서 여러 언어를 다루어 보기도 했고 과거 C#을 사용하기도 했지만
요즘은 닷넷코어라는것도 나오고 벌써 C# 버전이 7.1까지 올라가서...
다시한번 공부해보고자 "크로스 플랫폼 개발을 위한 C# 7과 닷넷 코어 2.0"이란 책을 읽기 시작했다.

추후에도 참고하기 위해 C/C++과 비교하며 새롭거나 크게 다른점들을 정리해본다.
오늘은 그 첫번째 변수와 관련된 내용

1. 언더바(_)로 숫자 자리수 구분

int val = 1_000_000; //1백만
int bin = 0b1111_0100_0010_0100_0000; //2진수로 1백만
int hex = 0x000F_4240; //16진수로 1백만
C# 7.2에서는 2진, 16진수 표현시 리터럴의 첫 자리를 _로 시작할 수 있게 개선되었다. 이는 하단의 코드처럼 0b 혹은 0x 바로 다음에 _를 사용할 수 있게되어 가독성이 더욱 향상되는 효과가 있다.
int bin = 0b_1111_0100_0010_0100_0000; //2진수로 1백만
int hex = 0x_000F_4240; //16진수로 1백만

2. 금융, CAD같이 정확한 실수가 필요한 곳에는 float/double이 아니라 decimal을 사용

decimal이 정확도는 높지만 표현 가능한 숫자는 double이 더 큼

3. object 타입과 dynamic 타입

object 타입은 형식 미지정 타입. 값을 대입할 때 아무 것이나 넣을 수 있으나, 대입된 객체의 멤버를 사용하기 위해서는 반드시 형변환을 해야 함
object str = "string";
int len = str.Length; //컴파일 시 에러 ((string)str).Length로 형변환 후 사용해야 함

위 코드를 VS2017에서 빌드하게 되면 아래와 같은 컴파일 에러가 발생한다.
'object'에는 'Length'에 대한 정의가 포함되어 있지 않고, 'object' 형식의 첫 번째 인수를 허용하는 확장 메서드 'Length'이(가) 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.

 dynamic은 다음과 같이 사용할 수 있다.
dynamic str = "string";
int len = str.Length;
object와 달리 컴파일에서는 에러가 발생하지 않으나 잘못된 멤버를 사용하는 경우 런타임에서 에러가 발생함
또한 개발 시 인텔리센스를 사용할 수 없음

4. 지역변수 선언시 var 사용

Modern C++의 auto와 유사한 기능
변수 타입 추론 시, 5.0M은 decimal 타입, 5.0F는 float, 5.0은 double, 5L은 long으로 추론한다.

5. null 값

기본 타입에서 string을 제외한 타입은 값 타입이기 때문에 반드시 값을 가져야 함. (string은 참조 타입이라 null 가능)
그러나 변수 선언 시 타입 뒤에 물음표(?)를 붙이면 값 타입이어도 null 값을 가질 수 있음
변수 사용시 변수명 + 물음표(?)를 붙여서 멤버를 사용하면 null exception을 발생시키지 않고 그냥 null 반환
int? val = null;

string str = null;
int? len = str?.Length; //len에는 null이 대입됨

var result = len ?? 0;
변수가 null인 경우 기본값을 대입하고 싶다면 C++에서는 삼항 연산자를 사용하여 처리를 했지만 C#은 ?? 연산자로 간단하게 가능
위 코드에서 변수 len이 null이므로 result에는 0이 대입됨

댓글

가장 많이 본 글