목차 (클릭시 해당 목차로 이동)
연산자
연산자, 연산을 수행하는 기호
연산자
연산을 수행하는 기호
피연산자
연산자의 작업 대상
예시
x + 3 이라는 식이 있을 때, '+'는 두 피연산자를 더해서 그 결과를 반환하는 덧셈 연산자 이고, 변수 x와 리터럴 3은 피연산자 입니다.
산술 연산자
산술 연산자에는 사칙 연산자와 나머지 연산자가 있습니다.
사칙 연산자
- +
- -
- *
- /
나머지 연산자
- %
특징
1.
피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없습니다. (오류 - "ArithmeticException" 발생)
하지만 0.0f, 0.0d로 나누는 경우 오류가 발생하지 않고 Infinity를 반환합니다.
System.out.println(3/0); // 실행시, 오류 (ArithmeticException) 발생
System.out.println(3/0.0); // Infinity 출력
2.
두개의 피연산자가 int형보다 작다면 연산자는 두 개의 피연산자들의 자료형을 int형으로 변환한 다음 연산을 수행합니다.
그래서 아래 예제 int형을 byte형인 c에 담으려고 하여 오류가 발생합니다.
byte a = 10;
byte b = 20;
byte c = a + b; // 컴파일 에러 발생
byte c = byte(a + b); // 정상 작동
System.out.println(c);
비트 연산자
비트 연산자는 피연산자를 비트단위로 논리 연산합니다.
| | 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻습니다. 그 외에는 0을 얻습니다. |
& | 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻습니다. 그 외에는 0을 얻습니다. |
^ | 피연산자의 값이 서로 다를 때만 1을 결과로 얻습니다. 그 외에는 0을 얻습니다. |
x | y | x | y | x & y | x ^ y |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
연산자 | 설명 |
~ | 피연산자를 2진수로 표현했을때, 0은 1로, 1은 0으로 바꿉니다. |
x | ~x | x << 1 | x >> 1 |
10010100 : 148 | 01101011 : 107 | 1 00101000 : 296 | 01001010 : 74 |
x << n | 피연산자의 각 자리를 왼쪽으로 이동합니다. 빈자리는 0으로 채워집니다. x * 2^n 하는 것과 같습니다. |
x >> n | 피연산자의 각 자리를 오른쪽으로 이동합니다. 빈자리는 0으로 채워집니다. x / 2^n 하는 것과 같습니다. |
x | x << 1 | x << 4 | x >> 1 | x >> 4 |
10010100 : 148 |
1 00101000 : 296 | 1001 01000000 : 2368 | 01001010 : 74 | 1001 : 9 |
관계 연산자 (비교 연산자)
대소비교 연산자 <, >, <=, >=
비교연산자 | 연산결과 |
> | 좌변 값이 크면 true / 아니면 false |
< | 좌변 값이 작으면 true / 아니면 false |
>= | 좌변 값이 크거나 같으면 true / 아니면 false |
<= | 좌변 값이 작거나 같으면 true / 아니면 false |
등가비교 연산자 ==, !=
비교연산자 | 연산결과 |
== | 두 값이 같으면 true / 아니면 false |
!= | 두 값이 다르면 true / 아니면 false |
논리 연산자
|| (OR결합) | 피연산자 중 어느 한 쪽이라도 true 이면 true / 아니면 false |
&& (AND 결합) | 피연산자 양쪽 모두 true 이어야 true / 아니면 false |
x | y | x || y | x && y |
true | true | true | true |
true | false | true | false |
false | true | true | false |
false | false | false | false |
논리 부정 연산자 !
! 연산자는 피연산자가 true이면 false를, false 이면 true를 반환합니다.
x | !x |
true | false |
false | true |
instanceof
instanceof 연산자는 객체 타입을 확인하는 연산자 입니다.
피연산자로 객체와 클래스를 사용하며 해당 객체의 타입이 해당 클래스가 맞는지 확인합니다.
(형 변환 가능 여부로 판단해 true / false로 결과를 반환합니다.)
주로 상속관계에서 부모객체인지 자식객체인지 확인하는데 사용합니다.
package javastudy.instanceofTest;
class Parent{}
class Child extends Parent{}
public class InstanceofTest {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
System.out.println(parent instanceof Parent);
System.out.println(child instanceof Parent);
System.out.println(parent instanceof Child);
System.out.println(child instanceof Child);
}
}
Child 가 Parent를 상속받는 관계에서 부모클래스는 자식클래스로 형변환 될 수 없기 때문에 false가 반환됩니다.
parent intanceof Parent | true |
child instanceof Parent | true |
parent instanceof Child | false |
child instanceof Child | true |
assignment(=) operator
= (assignment) 연산자는 다른 연산자와 묶어서 사용이 가능합니다.
+= | A += B | A와 B를 +(더한) 값을 A에 할당합니다. |
-= | A -= B | A와 B를 -(뺀)한 값을 A에 할당합니다. |
*= | A *= B | A와 B를 *(곱)한 값을 A에 할당합니다. |
/= | A /= B | A와 B의 /(나눈 몫) 값을 A에 할당합니다. |
%= | A %= B | A와 B의 %(나눈 나머지) 값을 A에 할당합니다. |
&= | A &= B | A와 B를 &연산한 값을 A에 할당합니다. |
^= | A ^= B | A와 B를 XOR연산한 값을 A에 할당합니다. |
|= | A |= B | A와 B를 OR연산한 값을 A에 할당합니다. |
<<= | A <<= B | A와 B를 left shift한 값을 A에 할당합니다. |
>>= | A >>=B | A와 B를 right shift한 값을 A에 할당합니다. |
주의
참조변수에서 = 연산자로 할당하면 주소값을 할당합니다.
obj1, obj2 변수 둘 다 주소값이 들어있고, obj1에 obj2를 = 연산하면 둘 다 obj2의 주소를 가리키게 됩니다.
package javastudy.operator;
class A{}
public class AssignOperator {
public static void main(String[] args) {
A obj1 = new A();
A obj2 = new A();
System.out.println("obj1 = " + obj1);
System.out.println("obj2 = " + obj2);
obj1 = obj2;
System.out.println("=====");
System.out.println("obj1 = " + obj1);
System.out.println("obj2 = " + obj2);
}
}
화살표 (->) 연산자
화살표 연산자는 java 8.0버전부터 적용된 람다(lambda) 표현식의 일부입니다.
기존 메서드 작성법
반환타입 메서드이름 (매개변수 선언) {
문장들
}
람다식 작성법
반환타입 메서드이름 (매개변수 선언) -> {
문장들
}
반환 타입과 메서드를 생략하고 매개변수와 실행되는 코드블럭을 화살표(->)로 연결해줍니다.
람다식에 대한 자세한 포스팅은 15주차에서 다루므로 여기서는 화살표 operator만 설명하고 넘어가겠습니다.
3항 연산자 ( ?: )
조건 연산자라고 불리는 ?: 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 3항연산자 입니다.
사용예시
package javastudy.operator;
public class ConditionOperator {
public static void main(String[] args) {
int x = 5;
int y = 3;
boolean result;
result = x > y ? true : false;
System.out.println("result = " + result);
}
}
x > y 조건이 참이므로 result에는 true가 담기게 됩니다.
연산자 우선 순위
지금까지 다룬 연산자가 많은데, 이 연산자들이 한번에 나온다면 우선순위가 어떻게 결정되는지 알아봅니다.
아래 규칙만 잘 기억하고 있어도 대부분의 연산자 우선순위를 파악할 수 있습니다.
- 산술 > 비교 > 논리 > 대입
- 단항(1) > 이항(2) > 삼항(3)
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | <- | ++, --, +, -, ~, !, (type) | 높음 낮음 |
산술 연산자 | -> | *, /, % | |
-> | +, - | ||
-> | <<, >> | ||
비교 연산자 | -> | <, >, <=, >= | |
-> | ==, != | ||
논리 연산자 | -> | & | |
-> | ^ | ||
-> | | | ||
-> | && | ||
-> | || | ||
삼항 연산자 | -> | ?: | |
대입 연산자 | <- | =, +=, -=, *=, /=, %= <<=, >>=, &=, ^=, |= |
예시 식
식 | 설명 |
x << 2 + 1 | 비트연산자(<<)는 산술연산자(+)보다 우선순위가 낮습니다. x << (2+1) |
data & 0xFF == 0 | 논리연산자(&)는 비교연산자(==)보다 우선순위가 낮습니다. data & (0xFF == 0) |
x < -1 || x > 3 && x < 5 | 비교연산자가 논리연산자보다 우선순위가 높습니다. 또한, && 연산자가 || 연산자보다 우선순위가 높습니다. x < -1 || (x > 3 && x < 5) |
'Web > Java' 카테고리의 다른 글
[Java] GitHub API를 이용한 대시보드 만들기 (2) | 2021.07.05 |
---|---|
[Java] JUnit5 (0) | 2021.07.05 |
[Java] 제어문 (0) | 2021.07.05 |
[Java] 자바 데이터타입, 변수 그리고 배열 (2) | 2021.06.10 |
[Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (2) | 2021.06.04 |