* 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이 채워짐.
'메타버스기반게임콘텐츠기획 > 스터디(C#이 보이는 그림책)' 카테고리의 다른 글
9장, 부록 (9-2) (0) | 2021.12.20 |
---|---|
9장, 부록 (9-1) (0) | 2021.12.20 |
8장, 문자열의 응용 (문제) (0) | 2021.12.18 |
8장, 문자열의 응용 (8-2) (0) | 2021.12.18 |
8장, 문자열의 응용 (8-1) (0) | 2021.12.07 |