JAVA/자바 문법
[Java] 연산자
isfp_yykkng
2023. 8. 28. 21:41
연산자
연산자(Operator)와 피연산자(Operand)
- 연산자 : 사칙연산을 비롯해서 다양한 연산을 수행하게끔 하는 기호
- 피연산자 : 연산되어지는 연산의 대상 (ex. x+y 식에서 x, y)
* 일반적으로 식이 평가되어서 결과를 얻더라도 쓰이지 않으면 사라지기 때문에 연산자 중 대입 연산자(=)를 사용하여 값을 저장한다. 단순 출력 목적으로는 출력 메서드( System.out.print() ) 에 직접 작성한다.
연산자 종류
종류 | 연산자 | 설명 |
산술 연산자 | 부호(+,-), 증감(++, --), +, -, *. /, % | 부호, 사칙연산과 나머지 연산, 증감 (부호, 증감 연산자는 단항 연산자) |
비교 연산자 | >, <, >=, <=, ==, != | 크고 작음, 같고 다름을 비교 |
논리 연산자 | &&, ||, !, &, |, ^, ~ | AND와 OR 등 조건 연결 |
대입 연산자 | = | 우변 값을 좌변에 저장 ⭐ |
기타 연산자 | (type), ? : , instanceof 등 | 형변환 연산자, 삼항 연산자, instanceof |
* 증감, 부호 연산자와 삼항 연산자를 제외하고는 대부분 이항 연산자이며 단항 연산자와 대입 연산자를 제외하고 모든 연산의 방향은 왼쪽에서 오른쪽!
산술 연산자
- 부호 연산자 : 부호를 결정하는 연산자 (피연산자의 부호를 그대로(+) / 반대로(-) 변경)
- 증감 연산자 : 1씩 증가하거나 감소시키는 연산자
- 전위형(prefix) : 값이 참조되기 전에 증가/감소시킴 ( ++i / --i )
- 후위형(postfix) : 값이 참조된 후에 증가/감소시킴 ( i++ / i-- )
- 사칙연산, 나머지 : +, -, * (곱셈), / (나눗셈), % (나머지)
- 나누는 수가 0이면 에러 발생
- 피연산자가 모두 int형인 나눗셈 식( / ) 은 나머지를 버린 정수 값만 결과로 나옴.
- 나눗셈의 올바른 계산을 위해 float 타입으로 일치시킨 후에 연산을 수행해야 함.
- 정수형, 실수형 모두 계산시 각 범위를 넘는 값이 나온다면 에러 (-> 더 큰 범위로 변경하기)
//부호 연산자
int i1 = -5;
int i2 = +i1; //-5 (i1 그대로 나옴)
int i3 = -i1; //5 (i1의 부호를 반대로)
//증감 연산자
int i4 = ++i3; //6
int i5 = i3++; //6
int i6 = --i3; //6
int i7 = i3--; //6
//산술 연산
int i = 5;
int j = 2;
System.out.println(i + j); //7
System.out.println(i - j); //3
System.out.println(i * j); //10
System.out.println(i / j); //2
System.out.println((float)i / (float)j); //2.500000
System.out.println(i % j); //1
* 반올림 (Math.round())
소수점 첫째 자리에서 반올림한 결과를 정수로 반환 (10^n으로 적절히 곱하고 나누는 작업 필요)
비교 연산자
두 피연산자를 비교하는데 사용되는 연산자로 결과는 오직 true와 false 둘 중 하나이다.
- 대소 비교(>, >=, <, <=) : boolean, 참조형을 제외한 자료형 모두 사용 가능
- 등가 비교(==, !=) : 기본형과 참조형 각각 사용 가능하지만, 서로 형변환이 불가능하기 때문에 서로 비교 불가
- 문자열(String) 비교 (== / !=, equals() )
- == / != 연산자는 두 문자열이 모든 비교 사항이 완전히 같은 지를 비교
- equals() 메서드는 내용이 같은지를 비교할 때 용이
int i = 10; // = 대입연산자
int j = 10;
// i 와 j 가 같은지 비교 하는 비교 연산자
System.out.println(i == j ); //true
System.out.println(i == j ); //true
System.out.println(i != j ); //false
System.out.println(i < j); //false
System.out.println( i <= j); //true
System.out.println(i > j); //false
System.out.println(i >= j); //true
논리 연산자
논리 연산자는 논리곱( &&, & ) 논리합( ||, | ), 배타적 논리합 ( ^ ), 논리부정( ! ) 연산을 수행한다. 논리 연산자의 피연산자는 논리형(불린형)만 사용 가능하다. 결과 또한 불린값이다.
- 논리곱(&&, &) : 피연산자가 모두 true일 경우에만 연산 결과가 true, 그 외는 false
- 논리합( ||, | ) : 피연산자 중 하나만 true이면 연산 결과가 true, 피연산자 모두 false이면 false
- 배타적 논리합( ^ ) : 피연산자가 서로 다른 값일 경우만 연산 결과가 true, 서로 같으면 false
- 논리 부정( ! ) : 피연산자의 논리값을 바꿈. ( true <-> false )
연산 순서는 피연산자와 가까운 것부터 먼저 연산된다.
대입 연산자
대입연산자의 연산 진행 방향은 오른쪽에서 왼쪽 => 좌측 피연산자는 값을 변경/저장할 수 있는 변수 등이 들어가고 우측 피연산자는 변수, 식, 상수 등 모두 가능하다.
- 단순 대입 연산자 : 오른쪽에 있는 피연산자의 값을 왼쪽 피연산자의 변수에 저장
- 복합 대입 연산자 : 정해진 연산을 수행한 후에 결과를 대입
i = 10; // 단순 대입 연산자
i += 10; // 복합 대입 연산자
// i = i + 10; 과 같은 연산 (i == 20)
조건 연산자 (삼항 연산자)
조건식 ? 피연산자1 : 피연산자2
조건식의 연산 결과가 true이면 결과는 피연산자1 이고, 조건식의 연산 결과가 false이면 결과는 피연산자2 (피연산자1, 피연산자2 에는 주로 값이 오지만, 경우에 따라 연산식이 올 수 있음.)
int b1 = (5 > 4) ? 50 : 40 ; //연산결과가 true이기 때문에 50이 b1에 들어감.
연산자 우선순위 ⭐
- 최우선연산자 ( ., [], () )
- 단항연산자 ( ++,--,!,~,+/- : 부정, bit변환>부호>증감)
- 산술연산자 ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
- 비교연산자 ( >,<,>=,<=,==,!= )
- 비트연산자 ( &,|,,~ )
- 논리연산자 (&& , || , !) : 논리 연산자 중 and 연산과 or 연산이 나왔을 때 and 연산이 먼저 수행
- 삼항연산자 (조건식) ? :
- 대입연산자 =,*=,/=,%=,+=,-=
예시 1
int a = 5;
int b = 10;
int c = 5;
System.out.println( a-b*c );
//곱셈이 우선순위가 높기 때문에 b와 c를 먼저 곱하고 뺀다. 결과는 -45
예시 2
int a = 5;
System.out.println( ++a - 5);
//단항 연산자인 증감 연산자가 먼저이기 때문에 a가 6이 되고 5를 빼면 결과는 1
예시 3
int a = 5;
System.out.println(a++ - 5);
//단항 연산자이면서 후위 연산자인 ++ 가 나중에 연산되면서 a는 5인 상태에서 5를 빼게 되어 결과는 0
System.out.println(a);
//a++(a = a+1) 이 실행되므로 결과는 6
증감 연산자 경우 전위 연산자인지 후위 연산자 인지에 따라서 우선 순위가 바뀔 수 있다. ⭐
(전위 연산자 ++ 는 먼저 연산되지만, 후위 연산자 ++ 는 나중에 연산됨. )