연산자(operator) : 연산을 수행하는 기호
피연산자(operand) : 연산자의 작업 대상 (변수,상수,리터럴,수식)
종류 | 연산자 | 설명 |
---|---|---|
산술 연산자 | + - * / % | 사칙 연산과 나머지 연산 |
비교 연산자 | > < >= <= == != | 크로 작음과 같고 다름을 비교 |
논리 연산자 | && |∥ ! & ^ ~ | 'AND'와 'OR' 조건 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자** |
<피연산자 개수>
하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 대부분 왼쪽에서 오른쪽( ->)의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 반대로 오른쪽에서 왼쪽(<- ) 의 순서로 연산을 수행한다.
- 산술 > 비교 > 논리 > 대입.
- 대입은 제일 마지막에 수행된다.
- 단항 > 이항 > 삼항
- 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽 ( -->)
두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르면 연산 전에 형변환 연산자로 타입을 일치시켜야한다.
'산술 변환'의 규칙
- 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
첫 번째 규칙은 피연산자의 값손실을 최소화하기 위함
두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문
- int보다 작은 char나 short의 표현범위가 좁아서 연산 중에 overflow가 발생할 가능성이 높다.
연산결과의 타입은 피연산자의 타입과 일치한다.
증감 연산자(++) : 피연산자의 값을 1 증가시킨다
감소 연산자(--) : 피연산자의 값을 1 감소시킨다
증감 연산자의 피연산자로 정수와 실수가 모두 가능하지만, 상수(재할당이 금지된 변수)는 값을 변경할 수 없으므로 불가능하다.
타입 | 설명 | 예 |
---|---|---|
전위형 | 값 증가 후 참조 | j=++i; |
후위형 | 값 참조 후 증가 | j=i++; |
※ 증감연산자가 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없다. 반대로 다른 수식에 포함되거나 메서드의 매개변수로 사용된 경우, 즉 단독으로 사용되지 않은 경우 전위형(++i)과 후위형(i++)의 결과는 같다.
증감연산자를 사용하면 코드가 간결해지지만, 지나치면 코드가 복잡해서 이해하기 어려워지기도 한다.
x = x++ - ++x;
이렇게 작성하는 것은 바람직하지 않다. 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 한다.
: 피연산자의 부호를 반대로 변경한 결과를 반환
덧셈, 뺄셈, 곱셈, 나눗셈
: 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환
: 두 피연산자를 비교하는데 사용
비교연산자 | 연산 결과 |
---|---|
> | 좌변 값이 크면 true, 아니면 fasle |
< | 우변 값이 크면 true, 아니면 fasle |
>= | 좌변 값이 크거나 같으면 true, 아니면 fasle |
<= | 좌변 값이 작거나 같으면 true, 아니면 fasle |
: 두 피연산자의 값이 같은지 또는 다른지를 비교
비교연산자 | 연산 결과 |
---|---|
== | 두 값이 같으면 true, 아니면 fasle |
!= | 두 값이 다르면 true, 아니면 fasle |
두 문자열을 비교할 때
: 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만 허용
|| (OR결합) : 한 쪽만 true ->결과 true
&& (AND결합) : 양쪽 모두 true -> 결과 true
토글 버튼을 논리적으로 구현할 수 있다.
true -> false , false -> true
※ 논리연산자와 헷갈리지 않기 (논리연산자 &&, 비트연산자 &)
| (OR 연산자) : 하나만 1이어도 결과로 1을 얻는다.
--> 주로 특정 비트의 값을 변경할 때 사용
& (AND 연산자) : 모두 1이어야 결과로 1을 얻는다.
--> 특정 비트의 값을 뽑아낼 때 사용
^ (XOR 연산자) : 값이 서로 다를때만 1을 결과로 얻는다. 같을 때는 0
--> 간단한 암호화에 사용
~ (비트 전환 연산자) : 피연산자를 2진수로 표현했을 때 0 -> 1 , 1 -> 0 으로 변경
--> 논리부정 연산자 '!' 와 비슷
--> '1의 보수'연산자 라고도 함
쉬프트 연산자 ( << >> ) : 피연산자의 각 자리(2진수로 표현했을 때)를 이동
--> 자리이동으로 저장범위를 벗어난 값들은 버려지고 빈자리른 0으로 채워짐
--> 음수인 경우 빈자리를 1로 채움
x << n // x * 2ⁿ의 결과와 같음
x >> n // x / 2ⁿ의 결과와 같음
Q. 곱셈이나 나눗셈 연산자를 사용하면 같은 결과를 얻을 수 있음에도 왜 쉬프트 연산자를 사용하는가?
A. 연산시간이 더 적게 걸림 (더 빠름) + 코드의 가독성
조건식 ? 식1: 식2 ;
대입 연산자의 왼쪽 피연산자 'lvalue (left value)', 오른쪽 피연산자 'rvalue (right value)'
i = i + 3
i += 3 ( O )
i + = 3 ( X )