이것은 제가 기억하기 위한 노트입니다. 혹시 질문이 있으신분은 댓글 달아주세요.
저도 시작하는 입장이지만.. 열심히 찾거나 같이 공부해서 알려드릴 수 있으면 좋겠습니다.
마지막에 질문사항이 있는데 아시는 분 말씀좀 부탁드립니다 ㅠ.ㅠ
자동 형변환
- 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
- 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선한다.
- byte > short + char > int > long > float > double
명시적 형변환
- 기본적으로 JAVA는 정수형 계산을 int형으로 계산한다.
short num1 = 1;
short num2 = 2;
short num3 = num1 + num2 // 컴파일 오류가 발생한다.
그러므로 short num3 = (short) (num1 + num2) 혹은 int num3 = num1 + num2 로 변환하여야 한다.
이항 연산자
|
연산기호 |
결합방향 |
우선순위 |
|
[], . |
> |
1 |
|
expr++, expr-- |
< |
2 |
|
++expr, --expr, +expr |
< |
3 |
|
*, /, % |
> |
4 |
|
+, - |
> |
5 |
|
<<, >>, >>> |
> |
6 |
|
<, >, <=, >=. instance of |
> |
7 |
|
==, != |
> |
8 |
|
& |
> |
9 |
|
^ |
> |
10 |
|
| |
> |
11 |
|
&& |
> |
12 |
|
|| |
> |
13 |
|
? expr : expr |
< |
14 |
|
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= |
< |
15 |
대입 연산자와 산술연산자
|
연산자 |
연산자의 기능 |
결합방향 |
|
= |
연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입 예) val = 20; |
< |
|
+ |
두 피연산자의 값을 더한다. |
> |
|
- |
왼쪽의 피연산자 값에서 오른쪽의 피 연산자 값을 뺀다. |
> |
|
* |
두 피연산자의 값을 곱한다. |
> |
|
/ |
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다. |
> |
|
% |
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. |
> |
관계연산자
|
연산자 |
연산자의 기능 |
결합방향 |
|
< |
n1 < n2 : n1이 n2보다 작은가? |
> |
|
> |
n1 > n2 : n1이 n2보다 큰가? |
> |
|
<= |
n1 <= n2 : n1이 n2보다 같거나 작은가? |
> |
|
>= |
n1 >= n2 : n1이 n2보다 같거나 큰가? |
> |
|
== |
n1 == n2 : n1과 n2가 같은가? |
> |
|
!= |
n1 != n2 : n1과 n2가 다른가? |
> |
논리연산자
|
연산자 |
연산자의 기능 |
결합방향 |
|
&& |
A && B 모두 True 이면 결과는 True (AND) |
> |
|
|| |
A || B 둘 중 하나라도 True 이면 결과는 True(OR) |
> |
|
! |
!A 연산결과는 A가 true이면 false, A가 false이면 True(NOT) |
< |
※ 논리연산자 사용 시 주의할 점 SCE(Short-Circuit Environment)
앞 연산자의 결과가 정답이라면(True 든 false 든 간에) 뒤에는 수행을 안하므로 +, - 등과 같은 사칙연산을 적용하지 않는다. 그러므로 애초에 변수에 변경사항을 적용하고 결과값만 비교기준과 비교하는 것이 좋다.
Prefix ++ --
|
연산자 |
연산자의 기능 |
결합방향 |
|
++ |
피연산자에 저장된 값을 1 증가 / val = ++n; |
< |
|
-- |
피연산자에 저장된 값을 1 감소 / val = --n; |
< |
Postfix ++ --
|
연산자 |
연산자의 기능 |
결합방향 |
|
++ |
피연산자에 저장된 값을 1 증가 / val = n++; |
< |
|
-- |
피연산자에 저장된 값을 1 감소 / val = n--; |
< |
비트 연산자
|
연산자 |
연산자의 기능 |
결합방향 |
|
& |
비트 단위로 AND 연산 n1 & n2 |
> |
|
| |
비트 단위로 OR 연산 n1 | n2 |
> |
|
^ |
비트 단위로 XOR 연산 n1 ^ n2 |
> |
|
~ |
피연산자의 모든 비트를 반전시켜서 얻은 결과 반환 ~n |
< |
AND 는 양 비트가 모두 1일 때 1, 혹은 모두 0일 때 0을 반환한다.
OR 은 양 비트 중 하나라도 1이면 1을 반환한다.
^ 은 비트가 서로 같으면 0, 다르면 1을 반환한다.
~ 은 비트를 반전시킨다.
비트 쉬프트 연산자
|
연산자 |
연산자의 기능 |
결합방향 |
|
<< |
피연산자의 비트 열을 왼쪽으로 이동 이동에 따른 빈 공간은 0으로 채움 예) n << 2 |
> |
|
>> |
피연산자의 비트 열을 오른쪽으로 이동 이동에 따른 빈 공간은 음수의 경우 1, 양수의 경우 0으로 채움 예) n >> 2; |
> |
|
>>> |
피연산자의 비트 열을 오른쪽으로 이동 이동에 따른 빈 공간은 0으로 채움 예) n >>> 2; |
> |
비트 쉬프트 연산자 예시 코드


num = 2는 byte 형 비트로 00000010 이다.
이것을 << 1 칸 밀면 맨 왼쪽의 0이 탈락되고 왼쪽으로 한칸씩 모두 이동한다.
그리고 빈 bit(오른쪽) 공간에는 0이 들어온다.
그러므로 00000100 , 4 가 나오는 것이다.
num = 8 는 byte 형 비트로 00001000 이다.
이것을 >> 1 칸 밀면 맨 오른쪽의 0이 탈락되고 오른쪽으로 한칸씩 모두 이동한다.
그리고 빈 bit 공간(왼쪽)에는 양수의 경우이므로 0이 들어온다.
그러므로 00000100, 4 가 나오는 것이다.
num = -8 는 byte 형 비트로 11111000 이다.
비트 8의 1의 보수(반전)를 한 후 1을 더하면 음의 값이다. 그러므로 11111000이 된다.
여기서 >> 1칸 밀면 맨 오른쪽의 0이 탈락되고 오른쪽으로 한칸씩 모두 이동한다.
그리고 빈 bit 공간(왼쪽)에는 음수의 경우이므로 0이 들어온다.
그러므로 11111100, -4가 되는것이다.
질문사항
번외로 num = -8; 선언을 한 후
num >>> 1을 했는데 -4가 나왔습니다.
원래라면 음,양수의 관계없이 빈 공간을 0으로 채워야 하는데.. 왜 안채우는 지 모르겠습니다.
아시는 분은 답변 부탁드립니다 ㅠ.ㅠ (이클립스에서 했습니다.)