연산자 (ch3)

IT/JAVA / / 2021. 5. 23. 17:16

연산자에는 4가지 종류로 구분이 된다.

산술 연산자는 사칙연산 을 하는 도구들에 % 나머지값을 구하는 연산자를 더해 5가지로 구성된다.

http://tcpschool.com/javascript/js_operator_arithmetic

 

위의 산술연산자는 학교 수학시간에 배우는 정도로 알면 충분할듯 하다.

 

예제 나머지 연산자를 통한 재미있는 수식

Decimal to Octal

Static long ToOactal (long x)
{
	if ( x == 0)
	{
		return;
	}
	return x % 8 + 10 * ToOactal( x / 8 );
}

 

 

 

비트 연산자

비트연산자는 다음과 같다 비트 연산자는 2진법의 두수를 비트로 표현하여 연산을 하는 것인데

http://tcpschool.com/javascript/js_operator_arithmetic

 

비트 1 에는 0011

비트 2 에는 0101 이 있다고 해보겠다.

 

비트 1 & 비트 2 는

0011

0101 에서 1이 켜져있는 애들만 1로 반환한다 (서로 다른 경우 0을 반환한다)

즉 0001 이 되는 것이다.

 

비트1 | 비트 2 는 or 문으로서

0011

0101 을 보았을때 둘중 하나라도 켜져있으면 1을 반환한다

즉 0111 이 된다.

 

비트1 ^ 비트2 여기서 조금 헷갈린다 ^ 는 xor 로 표현되며 서로 다를때 1을 표현하고 서로 같으면 0을 돌려준다

0011

0101

→ 0110이 되는 것이다.

 

~ 은 not 으로서 반대로 바꾸어 주는 기능이다

0011 → 1100 이렇게 바뀌게 된다

 

<< 은 지정한 수만큼 왼쪽으로 비트를 옮기는 기능이다

0011 << 2 칸 이라고 지정하면 1100 으로 움직인다

0011 << 1 칸이면 0110 이다.

ex << = 3 이면 1000이 된다. (overflow 생김) 은 지정한 수만큼 오른쪽으로 옮긴다.

1100 >> 1 칸 이면 0110 으로

1100 >> 2 칸 이면 0011 으로

1100 >> 3 칸 이면 0001 으로

1100 >> 4 칸 이면 0000 으로 1이 오른쪽으로 움직이는걸 볼 수 있다.

 

 

관계 연산자 는 다음과 같다.

프로그램에서 '=' 표시는 대입이란 표시이기 때문에 값이 '같다' 로 생각하지 말자. 값이 같음을 물어볼때는 == 을 나타내는것이다.

그리고 처음 보는 ! = 는 둘이 불일치 하면 true를 반환하는 말이다. 즉 서로 다르면 맞다 라고 말해! 라는 것.

 

 

논리 연산자

논리 연산자는 위와 같으며 아마 어렵지 않은 지식일 것이다.

 

 

 

주의해서 이해해야 할 연산자는 바로 증감 연산자 이다.

++위치에 따라 전위형 후위형으로 나뉘는데 ++x 는 전위형 ++x 는 후위형으로 불린다.

이 차이는 크다

 

예제를 보자.

int num1 = 0;
int num2 = 10;

int result3 = num1-- + num1-- - --num2;

System.out.println("num1: " + num1); // num1 = -2
System.out.println("num2: " + num2); // num2 = -9
System.out.println("result3: " + result3); // result = -10


// 2번째 예제
int x = 10;
int y = x-- + 5 --x;

// x = 8
// y = 10 + 5 + 8 = 23이 된다.
// --x 와 x-- 를 통해서 값이 달라지게 된다.

 

**연산자 사용시 알아두어야 할점.

연산자를 사용하게 되면 사칙 연산자를 많이 사용하게 된다.

앞서 보았던 자동 형변환 (Promotion) 과 같은 부분에서 꼭 알아두어야 할 부분이 있다면 다음과 같다.

int a = 10;
float b = 10.0f;

// sum = a + b 를 하게되면 어떤 일이 일어날까?

float c = 0.0f

c = a + b = 20.0f가 나온다

//정확히 말하면 a 가 묵시적 형변환 (승격)이 되면서 int 형이 float 형으로 바뀌어 계산이된다.
// float + float 형이 된다는 것이다. 컴퓨터 안에서는 이렇게 같은 형으로 계산을 하기 위해서
// 더 큰값이 있으면 그 값으로 승격시켜 계산을 한다.
// 만약 작은 값 byte + short 를 더하면 int + int 로 자동 승격시켜 서로 더해주게 한다. 

 

화살표(->) 연산자

 

람다식 연산자 이다.

식 람다 (입력 매개변수) -> 식 x → x+1
문자열 람다 (입력 매개변수) → 문자열 x → {return +1;}

이런식으로 구성할 수 있으며 다음 예제를 보면 한눈에 확인할 수 있다.

Func<int,bool> isEven = x => x%2 == 0;
isEven(2) 
-> true
isEven(3)
-> false 

Action<string>greet = name => {var message = $"Hello {name}"; Console.WriteLine(message);};
greet("you")

-> Hello you 

 

 

3항 연산자

삼항 연산자의 기본 수식은 다음과 같다

조건문 ? 참(표현값) : 거짓 (표현값); 

 

이 문법으로 if 문을 대신할 수 있지만 중첩 3항 연산자는 되도록이면 쓰지 않는것이 좋다. 그 이유로는 코드를 읽기 힘들기 때문에

 

int b = (5 < 4) ? 50 : 40; 
System.out.println(b); // 40 출력

 

연산자 우선 순위

연산자 우선순위는 위의 표와 같지만 위의 표에서 우리가 알고 있는 사칙연산이나 대입연산과 같은 연산자들을 주로 기억하는 것이 좋다. 그리고 & 연산자가 | 연산자보다 우선순위가 높음을 상식적으로 알고있자.

 

참고

자바의 정석

https://thebook.io/006890/part03/ch30/03/

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기