2020년 7월 22일 수요일

1-4. C#, 연산자, NULL결합연산자, 조건연산자, 논리/비트연산자, SHIFT연산자, IS, AS

1-4. C#, 연산자, NULL결합연산자, 조건연산자, 논리/비트연산자, SHIFT연산자, IS, AS

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=380

구분

연산자

기본 연산자

x(), x.y, f(x), a[x], x++, x--,

new, typeof, sizeof, default<T>, checked, unchecked, ->

단항 연산자

+, -, !, ~, ++x, --x, (T)x,

산술 연산자

+, -, *, /, %

쉬프트 연산자

<<, >>

관계/형식테스트 연산자

<, >, <=, >=, is, as

비트 연산자

&, ^, |

논리 연산자

&&, ||

Null 결합 연산자

??

조건 연산자

?

같음

==, !=

할당 연산자

=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

기본연산자

연산자

이름

의미

(x)

괄호

연산자 우선순위를 지정하기 위한 것

x.y

점(.dot)

클래스의 메소드나 속성을 접근하기 위한 것

f(x)

메소드괄호

메소드의 인자를 넣을 괄호

a[x]

대괄호

배열이나 인덱서의 인덱스

default(T)

기본값을 돌려준다. 참조 형식에 대해서는 null을 반환하고 숫자 값 형식에는 0을 반환

checked

 

형변환시 오버플로우를 체크

unchecked

 

형변환시 오버플로우 체크 않음

typeof()

 

객체에 대한 타입정보(System.Type)을 리턴

sizeof()

 

객체의 크기를 얻음.

주어진 데이터형식의 크기를 byte 단위로 리턴, 가능한 형식은 Value Type이며 int, float, enum, struct 등이다.

using System;

using System.Runtime.InteropServices;

class OperatorTest1

{

public static void Main()

{

Console.WriteLine(default(int));

int iSize = sizeof(int);

Console.WriteLine("int형 바이트길이 : {0}", iSize);

Type myType1 = typeof(int);

Console.WriteLine("typeof(int) : {0}", myType1);

int i = 10;

Type myType2 = i.GetType();

Console.WriteLine("i.GetType() : {0}", myType2);

int j = 99; //변수의 사이즈 구할 때

Console.WriteLine("Size of j : {0}", Marshal.SizeOf(j));

}

}

[결과]

0

int형 바이트길이 : 4

typeof(int) : System.Int32

i.GetType() : System.Int32

Size of j : 4

산술 연산자

구분

연산자

예 설명

단항

+x, -x, !x,

!true

True의 부정인 false

~x

byte x=10; ~x

비트 보수 연산을 수행, 각 비트를 반전(-11이 됨)

(T)x

int x=50000;

int y=(short)x;

캐스팅 연산

이항

+, -, *, /, %

a=b % 2;

2로 나눈 나머지

증감

++

j++;

1증가

--

j--;

1감소

할당연산자

+=, -=, *=, /=, %=

j+=3;

j=j+3과 동일

j%=3;

j=j%3과 동일

using System;

class OperatorTest2

{

static void Main(string[] args)

{

Console.WriteLine(+3); // unary plus, 3

Console.WriteLine(3 + 3); // addition, 6

Console.WriteLine(3 + .3); // addition, 3.3

Console.WriteLine("3" + "3"); // string concatenation, 33

Console.WriteLine(3.0 + "3"); // 3.0을 문자열로 변환,string concatenation, 33

//!는 피연산자를 부정하는 연산자.

Console.WriteLine(!true); //false

//~ : 비트 보수 연산을 수행, 각 비트를 반전

byte x = 10;

Console.WriteLine(~x); //-11

Console.WriteLine(unchecked((short)50000)); //overflow, -15536

}

}

비교연산자

연산자

기능

x=10일 경우

==

값이 같은가 비교

x == 3(거짓)

!=

값이 다른가 비교

x != 3(참)

>, >=, < .<=

대소 관계를 비교

x>11(거짓) x>=9(참)

is

객체 타입비교 연산자

왼쪽을 오른쪽에 지정된 형식(정적형식)으로 캐스팅할 있는 경우 true 반환.

int x = 10;

if (x is int) … (참)

l x가 int 타입인 경우 x is int를 테스트 하면 true가 된다. 기본 타입 뿐만 아니라 사용자에 의해 정의된 클래스도 테스트 된다.

기타연산자

연산자

기능

as

객체형식변환

오른쪽에 지정된 형식(정적 유형)으로 캐스팅된 왼쪽 피연산자를 반환하지만 오른쪽 형식으로 캐스팅 되지 안는 경우 null 반환.

using System;

namespace IsAsTest {

class Emp : Object { }

class Programmer : Emp { }

class Program {

static void Main(string[] args) {

Emp p = new Programmer();

//하위클래스 is a 상위클래스 => OK

if (p is Emp) Console.WriteLine("p is Emp");

else Console.WriteLine("p is not Emp");

// p Emp 현변환하고 OK Emp 리턴,

// 형변환 안되면 null 리턴한다.

Emp e = p as Emp;

//Emp e = (Emp)p; //p Emp 형변환하는데 오류나면 종료됨

if (e != null)

Console.WriteLine("p Emp 형변환 OK");

}

}

}

논리연산자

l &&는 AND, ||는 OR

l ^는 XOR, !는 NOT의 의미

A

B

A&&B

A||B

A^B

!A

F

F

F

F

F

T

F

T

F

T

T

T

T

F

F

T

T

F

T

T

T

T

F

F

비트연산자

l &는 AND, |는 OR

l ^는 XOR, ~는 NOT의 의미

A

B

A&B

A|B

A^B

~A

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Shift 연산자

l 비트별 연산이 필요한 경우, 그리고 2의 n제곱배 곱셈이 필요한 경우 사용되는 연산자이다.

l 예) x MB를 bit로 나타내고자 할 때, x*1024*1024*8 을 구하는 것은 복잡하다. 그리고 가독성도 떨어진다. 이럴 때 x<<23 또는 x<<20<<3 으로 표현한다.

연산자

예의 효과

<<

x<<8

왼쪽으로 8 bit shift

1bit shift 마다 값이 2배씩 증가

>>

x>>8

오른쪽으로 8 bit shift

1bit shift 마다 값이 1/2배씩 감소

논리연산자와 비트연산자

l C#에서는 bool 타입만이 논리연산자를 사용할 수가 있다. C에서는 0이나 -1을 false라고 묵시적으로 생각하였으나, C#에서는 반드시 true, false로 명시하고 있다.

l int형은 bit 연산자만을 사용할 수 있는데 bit연산이란 정수를 2진수로 나타낸 후 각 자리의 bit들을 각각 연산하는 것이다.

l bool 타입은 논리 연산(&&, II) 대신 &, | 등을 사용할 수도 있다.

l A&&B의 경우, 만약 A가 false이면 더 이상 B를 계산하지 않고 계산 결과값이 false로 결정된다. A가 true일때만 B를 계산한다.

l A||B의 경우, 만약 A가 true이면 더 이상 B를 계산하지 않고 계산 결과값을 true로 결정한다. A가 false인 경우에만 B를 계산한다.

l A|B나 A&B의 경우, A가 값에 관계없이 계속해서 B를 계산해서 A와 B로 연산을 수행한 후에 계산 결과값 true를 결정한다.

using System;

public class Bitoper

{

public static void Main(string[] args)

{

int i = 10; int j = 20; int a;

a = i & j; i = i >>3; j = i<<3;

Console.WriteLine("a={0}, i={1}, j={2}", a,i,j);

Console.ReadLine();

}

}

using System;

class LogicalAnd

{

static void Main()

{

//Method1이 false라도 Method2 실행

Console.WriteLine("정상적인 AND:");

if (Method1() & Method2())

Console.WriteLine("Both methods returned true.");

else

Console.WriteLine("둘중 하나의 메소드는 fasle");

//Method1이 false면 Method2는 실행 되지 않는다.

Console.WriteLine("\n Short-circuit AND:");

if (Method1() && Method2())

Console.WriteLine("Both methods returned true.");

else

Console.WriteLine("둘중 하나의 메소드는 fasle");

Console.WriteLine("0x{0:x}", 0xf8 & 0x3f); // 0x38

}

static bool Method1()

{

Console.WriteLine("메소드1...");

return false;

}

static bool Method2()

{

Console.WriteLine("메소드2...");

return true;

}

}

조건 연산자

l 간단한 if-then-else의 경우에 조건 연산자를 사용한다.

l 조건의 참, 거짓에 따라 다른 값을 가진다.

연산자

사용 예

의미

?값1:값2

a = x>20 ? 30 : 5

(x>20)인 조건이 참이면 30을 거짓이면 5를 a에 할당한다.

NULL 결합연산자

아래 ??(Null-Coalesce Operator) 연산자는 널을 체크하여 널이 아닌 것을 돌려주는데,

예제로 확인하자.

using System;

class Program

{

static void Main()

{

//Nullable Type, a가 NULL을 허용한다는 의미

int? a = null;

//int b = a.Value; // a.Value값 자체가 null 이므로 int? b도 오류

//Console.WriteLine("Value of b is {0}", b);

int b;

if (a.HasValue) b = a.Value;

else b = 0;

Console.WriteLine("Value of b is {0}", b);

int c = a ?? 0;

Console.WriteLine("Value of c is {0}", c);

Console.ReadLine();

Int i=0;

int? j = i > 0 ? i : null;

if (!j.HasValue) Console.WriteLine("j is null");

else Console.WriteLine(j);

var k = j ?? int.MinValue;

Console.WriteLine(k.ToString());

}

}

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...