Java operator

sycho·2023년 9월 15일
0

Java

목록 보기
6/18

operator / operand

  • 연산자 (operator) : 수행하는 연산을 나타내는 기호

  • 피연산자 (operand) : 연산자 작업 대상

  • ex : 1 + 2 에서 +는 연산자, 1, 2는 피연산자다.

  • 연산 후 언제나 결과값이 나온다. (return value)

  • 연산자당 필요 피연산자가 꼭 2개일 필욘 없고 하나나 3개일 수도 있다. ++가 대표적.

expression

  • operator과 operand를 모아서 어떤 결과값을 구하는걸 나타낸 것.

  • ex : 4*x+3

  • Java의 경우, 매 expression 끝에 ;을 붙여야 한다.

= operator

  • 계산된 값을 사용할거면 =을 사용해 어딘가에 저장해야 한다.
x = 3
y = 4 * x + 3;
System.out.println(y); //15

types of operators

  • arithmetic operator : 사칙 연산, 나머지 연산 등을 수행

  • comparison operator : 대소관계 비교 수행

  • logic operator : true/false 값 계산 수행

  • assignment operator : =. 값 저장에 사용

  • ternary operator, casting operator, instanceof operator 등이 있다.

operator precedence

  • 여러 연산자 존재시, 무엇을 먼저 할지 순서가 정해져있다.

  • 연산 우선순위가 낮은 애를 먼저 수행할거면 ()을 사용하면 된다.

operator associativity

  • 동일 우선순위의 연산자가 존재시 좌에서 우로 수행할지, 우에서 수행할지가 연산자마다 다르다.

  • Java operator precedence/associativity table. 위에서 아래로 갈수록 우선순위가 낮다.

arithmetic conversion

  • Java에서 피연산자가 두개인 연산자, binary operator은 둘의 type이 같아야만 연산이 진행된다.

  • 연산 과정에서 이루어지는 자동 형변환을 산술 변환이라고 한다.

  • 피연산자가 int보다 범위가 적은 type들이면 전부 int로 자동 형변환을 한다. 여기서 주의해야하는게 charint보다 범위가 더 작아서 int로 자동 형변환된다. 이걸로 컴파일 에러 발생이 가능하니 주의.

char a = 'c';
char b = a + 1; //compile error
  • 본인이 직접 형변환을 지정해도 상관 없다.
5 / 2; //2
5 / (float)2; // 2.5f
  • literal과 상수로만 이루어진 expression은 컴파일러에서 미리 다 연산을 해서 type에 맞게 저장하는 특징도 있다. arithmetic conversion이라고 하긴 애매하나, 참고하길
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'.

unary operator

++, --

  • 연산자의 값을 1만큼 증가/감소 시킨다.

  • 상수가 아닌 정수, 실수에 사용 가능하다.

  • 연산자 앞에 붙으면 참조 전에 증가/감소 시킨다

  • 연산자 뒤에 붙으면 참조 후에 증가/감소 시킨다.

i = 1;
j = 1;
System.out.println(i++); //1
System.out.println(++j); //2

+, -

  • +, -는 unary operator로서도 작동이 가능하다.

  • +는 부호 유지, -는 반대 부호값을 return.

  • 정수, 실수에 사용 가능하다.

arithmetic operator

+, -, *, /

  • 덧셈, 뺄셈, 곱셈, 나눗셈을 한다.

  • 정수 나눗셈은 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이 들어가면 안된다.

comparison operator

<, >, <=, >=

  • 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.

logic operator

&&, ||, !

  • &&은 두 연산자가 모두 truetrue를 반환, 아니면 false 반환

  • ||은 두 연산자 중 하나가 truetrue를 반환, 둘 다 falsefalse 반환.

  • !은 unary operator이며, 연산자가 truefalse반환, falsetrue 반환.

  • 연산자에 들어가는 녀석은 무조건 boolean type이어야 한다. boolean결과인 expression도 당연히 상관없다.

short circuit evaluation

  • &&에서 첫번째 operand가 false면 뒤의 operand는 확인 안하고 false 반환.

  • ||에서 첫번째 operand가 true면 뒤의 operand는 확인 안하고 true 반환.

  • 연산 횟수가 줄어들고, null관련 정책도 안전하게 처리가 가능하다.

!

  • !은 unary operator이며, 대상 연산자가 truefalse, falsetrue를 반환한다.

  • 만약 !!a와 같이 사용하면 그냥 a가 나온다.

bit operator

&, |, ~

  • bit 단위 논리 연산자다. bit 단위의 &&, ||, ~이라고 생각하면 된다.
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를 반환한다.

  • truetrue, falsefalse의 경우 false 반환. truefalse, falsetrue의 경우 true 반환. 그리고 ^은 이걸 bit 단위로 한다.

int a = 1;
int b = 3;
System.out.println(a ^ b); //2
  • bit단위 논리 연산자는 주로 bit masking 등의 활용을 위해 자주 사용된다. 일부 데이터를 추출하거나, 표시를 훨씬 적은 용량으로 하는데 사용이 됨.

<<, >>

  • bit 단위 shifting을 한다. <<은 left shift, >>은 right shift
int a = 1;
System.out.println(a << 3); //8
  • 부호가 있는 type은 right shift때 sign extension이 적용되며, 부호가 없는 type은 right shift 때 zero extension이 적용된다.
int a = -2;
System.out.println(a >> 1); //-1
char b = (char)32768;
System.out.println((int)(b >>1)); // 16384
  • left shift는 언제나 빈자리를 0으로 채운다.

  • 참조형에는 적용이 안된다.

  • 주로 2의 제곱에 대한 곱셈 및 나눗셈을 할 때 쓰인다.

ternary operator

  • 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
profile
안 흔하고 싶은 개발자. 관심 분야 : 임베디드/컴퓨터 시스템 및 아키텍처/웹/AI

0개의 댓글