연산자에는 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/
최근댓글