Section 3.13: 비트 시프트 (Bit-Shifting) 연산자

시프트 연산자는 프로그래머로 하여금 integer 의 모든 비트를 왼쪽 혹은 오른쪽으로 시프트 (shift) 시킴으로써 값을 조절할 수 있다. 아래의 예제는 특정 숫자만큼 시프트 시켰을 때 값이 어떻게 변경되는지를 보여주고 있다.

왼쪽 시프트

uint value = 15; // 00001111 uint doubled = value << 1; // 결과 = 00011110 = 30 uint shiftFour = value << 4; // 결과 = 11110000 = 240

Right-Shift

uint value = 240; // 11110000 uint halved = value >> 1; // 결과 = 01111000 = 120 uint shiftFour = value >> 4; // 결과 = 00001111 = 15
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 3.12: ?? Null 병합 (coalescing) 연산자

Null 병합 연산자인 ?? 는 좌측항이 null 이 아닌경우 좌측항을 반환한다. 만약 좌측항이 null 인 경우에는, 우측항을 반환한다.

object foo = null; object bar = new object(); var c = foo ?? bar; // foo 가 null 이므로 c 는 bar 가 될 것이다.

?? 연산자는 if 확인 문구를 제거할 수 있도록 연결하여 (chained) 사용될 수 있다.

// config 는 첫번째로 null 이 아닌 반환값이 될 것이다. var config = RetrieveConfigOnMachine() ?? RetrieveConfigFromService() ?? new DefaultConfiguration();
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

'번역 > C# Notes for Professionals' 카테고리의 다른 글

3.14: => Lambda 연산자  (0) 2020.11.10
3.13: 비트 시프트 (Bit-Shifting) 연산자  (0) 2020.11.06
3.11: sizeof  (0) 2020.11.05
3.10: 대입 (assignment) 연산자 '='  (0) 2020.11.05
3.9: 기본 (default) 연산자  (0) 2020.11.04

Section 3.11: sizeof

타입이 차지하는 크기를 바이트 단위로 나타낸 int 값을 반환한다.

sizeof(bool) // Returns 1. sizeof(byte) // Returns 1. sizeof(sbyte) // Returns 1. sizeof(char) // Returns 2. sizeof(short) // Returns 2. sizeof(ushort) // Returns 2. sizeof(int) // Returns 4. sizeof(uint) // Returns 4. sizeof(float) // Returns 4. sizeof(long) // Returns 8. sizeof(ulong) // Returns 8. sizeof(double) // Returns 8. sizeof(decimal) // Returns 16.

safe context 에서는 특정 기본 (primitive) 타입들만 지원된다.

unsafe context 에서는, sizeof 가 기타 다른 기본 타입들과 구조체 (struct) 에 대해서도 사용될 수 있다.

public struct CustomType { public int value; } static void Main() { unsafe { Console.WriteLine(sizeof(CustomType)); // 출력 결과: 4 } }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 3.10: 대입 (assignment) 연산자 '='

대입 연산자 = 는 오른쪽 피연산자의 값을 왼쪽 피연산자에 설정한 다음, 해당 값을 반환한다:

int a = 3; // 값 3 을 변수 a 에 대입한다. int b = a = 5; // 우선 값 5 를 변수 a 에 대입한 다음, 동일한 작업을 변수 b 에 대해서도 수행한다. Console.WriteLine(a = 3 + 4); // 7 을 출력한다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 3.9: 기본 (default) 연산자

값 (Value) 타입 (where T : struct)

내장 기본 데이터 타입인 char, int, 그리고 float 을 비롯하여, structenum 으로 선언된 사용자 정의 타입들의 기본 값은 new T() 와 동일하다 :

default(int) // 0 default(DateTime) // 0001-01-01 12:00:00 AM default(char) // '\0' - "null 문자" 를 나타내는 것으로써, 숫자 0 이나 행바꿈 문자가 아니다. default(Guid) // 00000000-0000-0000-0000-000000000000 default(MyStruct) // new MyStruct() // 주의: enum 의 기본값은 해당 enum 의 첫번째 *key* 가 아닌 0 이 된다. // 따라서 이 결과는 잠재적으로 Enum.IsDefined 테스트를 통과하지 못할 가능성이 있다 default(MyEnum) // (MyEnum)0

참조 (Reference) 타입 (where T : class)

어떠한 class, interface, array 혹은 delegate 타입이든 그 기본 값은 null 이 된다:

default(object) // null default(string) // null default(MyClass) // null default(IDisposable) // null default(dynamic) // null
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

'번역 > C# Notes for Professionals' 카테고리의 다른 글

3.11: sizeof  (0) 2020.11.05
3.10: 대입 (assignment) 연산자 '='  (0) 2020.11.05
3.8: 배타적 논리합 ("exclusive or") 연산자  (0) 2020.11.04
3.7: ?. (Null 조건부 연산자)  (0) 2020.11.03
3.6: ? : 삼항 연산자  (0) 2020.11.02

Section 3.8: 배타적 논리합 ("exclusive or") 연산자

^ 은 배타적 논리합 (짧게 XOR 이라고도 부른다) 연산자이다.

이 연산자는 주어진 두 bool 값 중 오직 단 하나의 값이 true 일때만 true 를 반환한다.

true ^ false // true 를 반환한다. false ^ true // true 를 반환한다. false ^ false // false 를 반환한다. true ^ true // false 를 반환한다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 3.7: ?. (Null 조건부 연산자)

Version ≥ 6.0

C# 6.0 에서 추가된 Null 조건부 연산자 (Conditional Operator) 인 ?. 는, 좌측항의 표현식이 null 로 평가 (evaluate) 될 경우 NullReferenceException 을 throw 하는 대신 null 값을 반환하여 준다. 또한 좌측항이 null 이 아닌 값으로 평가되는 경우에는, 일반적인 . 연산자와 동일하게 취급될 것이다. 유의할 점은, 해당 연산자가 null 을 반환할 수 있기 때문에, 반환 타입이 항상 nullable 타입이어야 한다는 것이다. 이것이 의미하는 바는, 구조체 (struct) 혹은 기본 형식 (primitive type) 에 대해서는 그 값이 Nullable<T> 로 싸여질 것이라는 의미이다.

var bar = Foo.GetBar()?.Value; // GetBar() 가 null 을 반환할 경우 bar 에 null 값이 할당될 것이다 var baz = Foo.GetBar()?.IntegerValue; // baz 는 Nullable<int> 타입이 될 것이다, 예: int?

이는 이벤트를 발생시키는 경우에 편리하게 사용할 수 있다. 통상적으로 사용자는 이벤트 호출 코드를 null 검사를 수행하는 if 문으로 감싼 후 이벤트 발생을 시켜야 하나, 이는 경쟁 상태 (race condition) 를 유발할 수 있다. Null 조건부 연산자를 이용하면 이러한 문제를 아래와 같은 방법으로 해결할 수 있다:

event EventHandler<string> RaiseMe; RaiseMe?.Invoke("Event raised");
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 3.6: ? : 삼항 연산자

주어진 Boolean 표현식의 값에 따라서 두가지 값 중 하나를 반환한다.

문법:

condition ? expression_if_true : expression_if_false;

예제:

string name = "Frank"; Console.WriteLine(name == "Frank" ? "The name is Frank" : "The name is not Frank");

3항 연산자는 우측 우선 결합 (right-associative) 방식의 복합 연산식 (compound expression) 을 지원한다. 이 기능은 상위 3항 연산의 true 혹은 false 위치에 또다른 3항 연산을 추가함으로써 이용할 수 있다. 가독성을 훼손하지 않기 위해서는 많은 노력이 필요하겠지만, 경우에 따라 이러한 기능은 유용한 단축 표현을 제공해 줄 수 있다.

역주: 3항 연산자의 우측 우선 결합에 따른 장점은 이곳에 잘 소개되어 있습니다.

이 예제에서는, 복합 3항 연산이 범위 제한 함수 (clamp function) 에 구현되어 값이 범위 안에 있으면 본래 값을, 최소값보다 작으면 최소값을, 최대값보다 크면 최대값을 반환해 주게 된다.

light.intensity = Clamp(light.intensity, minLight, maxLight); public static float Clamp(float val, float min, float max) { return (val < min) ? min : (val > max) ? max : val; }

3항 연산자는 아래와 같이 중첩되어 (nested) 사용될 수도 있다:

a ? b ? "a is true, b is true" : "a is true, b is false" : "a is false" // 이는 왼쪽에서 오른쪽 방향으로 평가되며 괄호를 포함했을때 좀 더 알아보기 수월하다: a ? (b ? x : y) : z // 이 식의 결과는 a && b 인 경우 x, a && !b 인 경우 y, !a 인 경우 z 가 된다

복합 3항 연산 구문을 작성하는 경우, 괄호나 들여쓰기를 활용하여 가독성을 높이는 것이 일반적이다.

expression_if_trueexpression_if_false 의 타입은 동일해야 하며, 그렇지 않은 경우에는 한 타입으로부터 다른 타입으로의 묵시적 변환이 존재하여야 한다.

condition ? 3 : "Not three"; // int 와 string 간의 묵시적 변환이 존재하지 않으므로 컴파일이 되지 않는다. condition ? 3.ToString() : "Not three"; // 가능한 두가지 결과가 모두 string 타입이므로 OK. condition ? 3 : 3.5; // int 로부터 double 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 double 이 될 것이다. condition ? 3.5 : 3; // int 로부터 double 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 double 이 될 것이다.

타입 및 변환 관련한 요구사항은 사용자 정의 클래스에 대해서도 동일하게 적용된다.

public class Car {} public class SportsCar : Car {} public class SUV : Car {} condition ? new SportsCar() : new Car(); // SportsCar 로부터 Car 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다. condition ? new Car() : new SportsCar(); // SportsCar 로부터 Car 로의 묵시적 변환이 존재하므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다. condition ? new SportsCar() : new SUV(); // SportsCar 로부터 SUV 로의, 혹은 SUV 로부터 SportsCar 로의 묵시적 변환이 존재하지 않으므로 컴파일이 되지 않는다. 컴파일러는 두 타입 모두가 Car 로의 묵시적 변환이 존재함을 알아차릴 정도로 똑똑하지는 않다. condition ? new SportsCar() as Car : new SUV() as Car; // 두 표현식이 모두 Car 타입의 reference 로 평가 (evaluate) 되므로 OK. 삼항 연산자의 결과값은 Car 타입의 reference 가 될 것이다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts