본문 바로가기
메타버스기반게임콘텐츠기획/스터디(C#이 보이는 그림책)

9장, 부록 (9-3)

by Queenut 2021. 12. 22.

 * null 허용형 (nullable Type)

 : 값형에 null을 대입하고 싶을 때 사용하는 것.

 : null은 본래 어느 곳도 참조하지 않는 것을 나타낸다. 참조형 필드엔 기본으로 갖고 있지만, 값형에는 값이 있으므로 null이 없다.

 

그럼에도 불구하고 넣고 싶다면 다음과 같이 한다.

int? a = null;

미정의 상태를 나타낼 수 있다.

 

 

-속성(읽기 전용)

HasValue: 변수에 null이 저장되어 있는 경우, false를 반환하고, 아닌 경우 true를 반환함.

Value: HasValue가 true일 때, 그 값을 반환함. false인 경우에 참조하면 예외(InvalidOperationException)가 발생.

 

 

- 값형의 값을 직접 대입할 수 있다.

int? a = null;
a = 5;            //묵시적인 형 변환
int? a = 5;
int b = (int)a;   // 명시적인 형 변환

 

- ?? 연산자

값형의 초기 값을 null 허용형으로 정의할 때 사용한다.

int? d;
...
int c = d ?? 0;

d가 null이 아니면 c는 그 값이 되고, null이면 0이 된다.

 

 

 

 

 * null 조건 연산자

 - ?.

 : 앞에 있는 오브젝트가 null인 경우, null이 반환된다. 아닌 경우, ' ?. ' 뒤에 기술된 멤버의 값이 반환된다.

List<int> mylist = new List<int> () {10, 20, 30};
...
int? a = mylist?.Count;

mylist가 null인 경우, 변수 a에는 null이 들어간다.

null이 아닐 경우, mylist.Count의 값이 a 에 들어간다.

 

 

 - ?[

 : 위의 것이 배열일 때에 사용.

int [] myarray = new int [] {10, 20, 30};
...
int? a = myarray?[0];

myarray가 null인 경우, 변수 a에는 null이 들어간다.

null이 아닐 경우, myarray[0]의 값이 a에 들어간다.

 

 

 - ??

List<int> mylist = new List<int> () {10, 20, 30};
...
int a = mylist?.Count ?? 0;

mylist가 null일 경우, 변수 a에는 0이 들어간다.

null이 아닌 경우, mylist.Count의 값이 들어간다.

 

만약 ?. 과 ?? 를 사용하지 않는다면 아래가 된다.

List<int> mylist = new List<int> () {10, 20, 30};
...
int a = (mylist != null) ? mylist.Count 0;

 

 

 

 * 비동기 처리

 : 어떤 처리가 종료되길 기다리지 않은 채, 다음 처리를 실행할 수 있게 하는 방법.

 : 동기 처리는 하나의 처리가 끝나기를 기다렸다가 다음 처리를 실행하는 것이다. 대개의 프로그램은 동기 처리이다.

 

 

 - async, await

 : 비동기로 호출되는 메소드를 만들기 위한 키워드.

static async Task<int> ProcAsync()
{
       int sum = 0;
       await Task.Run( () => { } );
       ...
       return (sum);
}

Task<int> : 반환 값은 다음의 하나가 된다.

   Task, Task<T>, void int를 반환하고 싶은 경우는 Task<int>가 된다.

await : 실행하고 싶은 처리가 종료되길 기다린다.

 

 

>>임의의 수치 10개를 1초 간격으로 가져와서 표시하고, 그 합계 값을 반환하는 메소드를 비동기로 호출한다.

 

 

 

 

 * 비트 연산자

 : 컴퓨터 내의 정보를 비트 단위로 비교하거나 조작할 때 사용하는 것.

 

>> a = 170, b = 245 일때,

 

 - & : 논리곱(and)

      : 각 비트를 비교해 쪽이 모두 1이면 1, 그렇지 않으면 0을 반환.

변수명 10진수 2진수
b8 b7 b6 b5 b4 b3 b2 b1
a 170 1 0 1 0 1 0 1 0
 
b 245 1 1 1 1 0 1 0 1
 
a & b 160 1 0 1 0 0 0 0 0

왜 a & b가 160이지??

 

 - | : 논리합(or)

     : 각 비트를 비교해 한쪽이라도 1이면 1, 그렇지 않으면 0을 반환.

변수명 10진수 2진수
b8 b7 b6 b5 b4 b3 b2 b1
a 170 1 0 1 0 1 0 1 0
 
b 245 1 1 1 1 0 1 0 1
 
a | b 255 1 1 1 1 1 1 1 1

왜 a | b가 (이하생략)

 

 - ^ : 배타적 논리합(xor)

      : 각 비트를 비교해 한 쪽이 1이고 다른 한 쪽이 0이면 1, 그렇지 않으면 0을 반환.

변수명 10진수 2진수
b8 b7 b6 b5 b4 b3 b2 b1
a 170 1 0 1 0 1 0 1 0
 
b 245 1 1 1 1 0 1 0 1
 
a ^ b 95 0 1 0 1 1 1 1 1

왜 a ^ b가 (이하생략)

 

 - ~ : 1의 보수 표현(not)

      : 각 비트를 반전시킨 값을 반환.

변수명 10진수 2진수
b8 b7 b6 b5 b4 b3 b2 b1
a 170 1 0 1 0 1 0 1 0
 
~a 85 0 1 0 1 0 1 0 1

왜 ~a가  (이하생략)

 

 

 

 

 * 시프트 연산자

 : 비트열을 좌우로 지정한 만큼 자리이동(시프트)하는 연산자.

 

 - >> : 오른쪽 시프트 연산자

ex) a >> 2 : 오른쪽으로 2비트 시프트.

1 0 1 1 0 0 1 0  
0 0 1 0 1 1 0 0 1 0

최상위 비트 ---------------------------------- > 최하위 비트

00 : 최상위 비트엔 0이 채워짐(부호가 붙은 형의 변수에 마이너스 값이 대입되어 있을 땐 1이 채워진다.).

10 : 최하위 비트보다 오른쪽으로 시프트되면 폐기됨.

 

 - << : 왼쪽 시프트 연산자

ex) a << 2 : 왼쪽으로 2비트 시프트.

  1 0 1 1 0 0 1 0
1 0 1 1 0 0 1 0 0 0

최상위 비트 < ---------------------------------- 최하위 비트

10 : 대입하는 변수의 상한에 맞춰 잘림.

00 : 최하위 비트엔 0이 채워짐.