연산자 (operator) : 수행하는 연산을 나타내는 기호
피연산자 (operand) : 연산자 작업 대상
ex : 1 + 2
에서 +
는 연산자, 1
, 2
는 피연산자다.
연산 후 언제나 결과값이 나온다. (return value)
연산자당 필요 피연산자가 꼭 2개일 필욘 없고 하나나 3개일 수도 있다. ++
가 대표적.
operator과 operand를 모아서 어떤 결과값을 구하는걸 나타낸 것.
ex : 4*x+3
Java의 경우, 매 expression 끝에 ;
을 붙여야 한다.
=
operator=
을 사용해 어딘가에 저장해야 한다.x = 3
y = 4 * x + 3;
System.out.println(y); //15
arithmetic operator : 사칙 연산, 나머지 연산 등을 수행
comparison operator : 대소관계 비교 수행
logic operator : true/false 값 계산 수행
assignment operator : =
. 값 저장에 사용
ternary operator, casting operator, instanceof operator 등이 있다.
여러 연산자 존재시, 무엇을 먼저 할지 순서가 정해져있다.
연산 우선순위가 낮은 애를 먼저 수행할거면 ()
을 사용하면 된다.
동일 우선순위의 연산자가 존재시 좌에서 우로 수행할지, 우에서 수행할지가 연산자마다 다르다.
Java operator precedence/associativity table. 위에서 아래로 갈수록 우선순위가 낮다.
Java에서 피연산자가 두개인 연산자, binary operator은 둘의 type이 같아야만 연산이 진행된다.
연산 과정에서 이루어지는 자동 형변환을 산술 변환이라고 한다.
피연산자가 int
보다 범위가 적은 type들이면 전부 int
로 자동 형변환을 한다. 여기서 주의해야하는게 char
도 int
보다 범위가 더 작아서 int
로 자동 형변환된다. 이걸로 컴파일 에러 발생이 가능하니 주의.
char a = 'c';
char b = a + 1; //compile error
5 / 2; //2
5 / (float)2; // 2.5f
char a = 'c'
char b = a + 1; //compile error, since result is int
char c = 'c' + 1; //no compile error since compiler calculates in compile time. result is 'd'.
++
, --
연산자의 값을 1만큼 증가/감소 시킨다.
상수가 아닌 정수, 실수에 사용 가능하다.
연산자 앞에 붙으면 참조 전에 증가/감소 시킨다
연산자 뒤에 붙으면 참조 후에 증가/감소 시킨다.
i = 1;
j = 1;
System.out.println(i++); //1
System.out.println(++j); //2
+
, -
+
, -
는 unary operator로서도 작동이 가능하다.
+
는 부호 유지, -
는 반대 부호값을 return.
정수, 실수에 사용 가능하다.
+
, -
, *
, /
덧셈, 뺄셈, 곱셈, 나눗셈을 한다.
정수 나눗셈은 0으로 나누면 exception 발생 (error)
정수간의 나눗셈은 나머지가 버려지고 정수부분만 남는다.
System.out.println(5/2); //2
실수 나눗셈은 0으로 나누면 무한대가 나오며 오류는 발생하지 않는다.
0.0/0.0
, 무한과 무한의 나눗셈은 NaN
이라는 값이 나온다. (Not a Number)
실수 유한수를 무한으로 나누면 0.0
이 나온다.
무한을 실수 유한수로 나누면 무한이 나온다.
type을 맞추는 것과 범위에 따른 overflow를 조심하자.
byte a = 10, b = 20;
byte c = (byte)(a * b); //-56, by overflow
String
은 +
가 정의되어 있긴한데 concatenation을 한다. 나머지 연산에 대해선 정의가 안된다는 점 참고.
char
은 아무것도 안된다.
%
숫자에 한해 왼쪽을 오른쪽으로 나눴을 때 나머지를 구한다.
오른쪽에 0이 들어가면 안된다.
<
, >
, <=
, >=
boolean
을 제외한 기본형 사용 가능. 참조형 사용 불가.
대소 비교 용도.
이항 연산자라 자동 형변환이 이루어진다.
String
은 참조형이라 사용 불가.
==
, !=
모든 자료형에 사용 가능. 단 기본형과 참조형 간의 연산은 안된다.
기본형의 경우 값이 같은지, 안 같은지를 판별.
참조형의 경우 주소값이 같은지 안 같은지를 판별.
String
은 참조형이라 주소값이 비교되는데, 만일 이 녀석의 내용물이 같은지 안 같은지를 판별할거면 equals()
method를 사용해야 한다는 점 유의.
equals()
는 대소문자가 다르면 다르다고 취급한다. 대소문자만 다르면 같게 취급하고 싶은 경우 equalsIgnoreCase()
를 사용하자.
String
변수에 literal을 저장한 경우, 동일한 literal
을 저장한 변수는 ==
가 true인 것으로 나온다. literal을 저장하는 경우 전부 한 곳을 가리키도록 설정되어 있어서 그렇다고 한다.
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == "abc"); //true, since s1 has literal
System.out.println(s2 == "abc"); //false, since s2 is a reference holding "abc" that didn't came from literal.
System.out.println(s1 == s2); //false, for same reason.
&&
, ||
, !
&&
은 두 연산자가 모두 true
면 true
를 반환, 아니면 false
반환
||
은 두 연산자 중 하나가 true
면 true
를 반환, 둘 다 false
면 false
반환.
!
은 unary operator이며, 연산자가 true
면 false
반환, false
면 true
반환.
연산자에 들어가는 녀석은 무조건 boolean
type이어야 한다. boolean
결과인 expression도 당연히 상관없다.
&&
에서 첫번째 operand가 false
면 뒤의 operand는 확인 안하고 false
반환.
||
에서 첫번째 operand가 true
면 뒤의 operand는 확인 안하고 true
반환.
연산 횟수가 줄어들고, null
관련 정책도 안전하게 처리가 가능하다.
!
!
은 unary operator이며, 대상 연산자가 true
면 false
, false
면 true
를 반환한다.
만약 !!a
와 같이 사용하면 그냥 a
가 나온다.
&
, |
, ~
&&
, ||
, ~
이라고 생각하면 된다.int a = 1;
int b = 2;
System.out.println(a & b); //0
System.out.println(a | b); //3
System.out.println(~a); //-2
^
bit 단위로 XOR이라는 논리 연산을 한다.
XOR은 두 피연산자가 동일한 boolean
값을 가지면 false
를, 서로 다른 boolean
값을 가지면 true
를 반환한다.
즉 true
와 true
, false
와 false
의 경우 false
반환. true
와 false
, false
와 true
의 경우 true
반환. 그리고 ^
은 이걸 bit 단위로 한다.
int a = 1;
int b = 3;
System.out.println(a ^ b); //2
<<
, >>
<<
은 left shift, >>
은 right shiftint a = 1;
System.out.println(a << 3); //8
int a = -2;
System.out.println(a >> 1); //-1
char b = (char)32768;
System.out.println((int)(b >>1)); // 16384
left shift는 언제나 빈자리를 0으로 채운다.
참조형에는 적용이 안된다.
주로 2의 제곱에 대한 곱셈 및 나눗셈을 할 때 쓰인다.
C의 그 ternary operator이다.
?
왼쪽에 조건문, 즉 boolean
value를 뱉어내는 연산자가 들어간다.
?
왼쪽에 :
양측에 2개의 연산자가 들어가는데, 왼쪽은 조건문이 true
반환시 ternary operator이 반환하는 값, 오른쪽은 조건문이 false
반환시 ternary operator이 반환하는 값이다.
int x = 5;
int y = 4;
int max = (x > y) ? x : y; //5;
:
를 사이에 두는, 결과물을 나타내는 식은 서로 자료형이 다를 경우, binary operator들과 똑같은 자동 형변환이 일어난다.double x = true ? 0 : 0.0; //0이 0.0으로 자동 형변환을 한다.
op=
=
연산자. 할당을 담당한다. binary operator.
기본형의 경우 우측의 결과물의 값을 복사를 한다.
참조형의 경우 '보통' 우측의 결과물의 참조의 복사를 한다.
우측은 값, 식, 상수든 뭐든 가능하지만 좌측은 무조건 단일 변수여야 한다.
final
과 조합해 변수를 상수로 만들 수 있다.
다른 binary operator과 조합해 해당 연사을 수행한 후 값을 집어 넣는걸로 변형이 가능하다.
int i = 1;
i += 3; //i == 4
i *= 2; //i == 8
i <<= 1; //i == 16
i |= 2; //i == 18
i ^= 2; //i == 2
i >>= 1; //i == 1
i %= 1; //i == 0
i -= 3; //i == -3
i /= 2; //i == -1
i <<= 1; //i == -2