1. 연산자와 피연산자
연산자가 연산을 수행하려면 반드시 연산의 대상이 있어야 하는데 이를 '피연산자'라 한다.
연산자(operator) 연산을 수행하는 기호(+,-,*,/ 등)
피연산자(operand) 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
2. 연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >> | 사칙 연산(+,-,*,/)과 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^ ~ | '그리고(AND)' |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 |
피연산자의 개수에 의한 분류
피연산자의 개수가 하나면 '단항 연산자'
두 개면 '이항 연산자'
세 개면 '삼항 연산자'
대부분의 연산자는 '이항 연산자'이고 삼항 연산자는 오직 '? :' 하나뿐이다.
부호 연산자는 단항 연산자로 피연산자가 '3' 한 개 뿐이지만, 뺄셈 연산자는 이항 연산자로 '-3' 과 '5' 두 개이다.
3. 연산자의 우선순위와 결합규칙
주의해야할 연산자 우선순위 예
식 | 설명 |
x << 2+1 | 쉬프트 연산자(<<)는 덧셈 연산자보다 우선 순위가 낮다. 그래서 식은 'x<<(2+1)' 과 같다. |
data & 0xFF ==0 | 비트 연산자(&)는 비교 연산자(==)보다 우선 순위가 낮으므로 비교 연산 후에 비트 연산이 수행된다. 그래서 식은 ' data & (0xFF ==0)' 과 같다. |
x <-1 || x>3 && x<5 | 논리 연산자 중에서 &&가 || 보다 우선 순위가 높다. 그래서 식은 'x<-1 || (x>3 && x<5)'과 같다. |
*연산자 결합규칙
대부분 왼쪽-> 오른쪽 순서로 연산을 수행한다.
단항 연산자와 대입 연산자만 그 반대로, 오른쪽->왼쪽으로 연산을 수행한다.
정리
1. 산술 > 비교 > 논리 >대입 . 대입이 제일 마지막에 수행
2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선 순위가 이항 연산자보다 높다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼->오른쪽이다.
<연산자의 우선순위>
4. 산술 변환(usual arithmetic conversion)
이항 연산자로 연산을 하기전 피연산자의 타입이 다르다면 타입을 형변환해서 일치시켜야한다.
int i = 10;
float f = 20.0f;
float result = f+ (float)i; //형변환으로 두 피연산자의 타입 일치
작은 타입에서 큰 타입으로 형변환하는 경우 형변환 연산자 생략 가능
연산 전에 피연산자의 타입의 일치를 위해 자동 형변환되는 것을 '산술 변환' 또는 '일반 산술 변환'이라 한다.
이 변환은 이항 연산에서만 아니라 단항 연산에서도 일어난다.
1. 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
long + int -> long + long -> long
float + int -> float + float -> float
double + float -> double + double -> double
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
byte + short -> int + int -> int
char + short -> int + int -> int
1은 피연산자의 값손실을 최소화하기 위함이고, 2는 정수형 int 타입이 가장 효율적으로 처리할 수 있기 때문.
char 나 short 의 표현 범위가 좁아서 연산중에 오버플로우가 발생할 가능성이 높기 때문.
피연산자 중 한쪽을 float와 같은 실수형으로 형변환해야 한다. 그러면 다른 한쪽은 일반 산술 변환의 첫번째 규칙에 의해 자동적으로 형변환되어 두 피연산자 모두 실수형이 되고, 연산결과 역시 실수형의 값을 가진다.
int / (float)int -> int /float -> float /float ->float
5/ (float)2 -> 5/ 2.0f -> 5.0f/2.0f ->2.5f
정리
일반산술변환? 연산 수행 직전에 발생하는 피연산자의 자동 형변환
1. 두 피연산자의 타입을 같게 일치시킨다. (큰 타입으로 일치)
2. 피연산자의 타입이 int 보다 작으면 int로 변환
'JAVA > 연산자(Operator)' 카테고리의 다른 글
[JAVA] charAt() (0) | 2021.06.08 |
---|---|
[JAVA] 논리 연산자 (0) | 2021.06.08 |
[JAVA] 비교 연산자 (0) | 2021.06.08 |
[JAVA] 산술 연산자 (0) | 2021.06.07 |
[JAVA] 증감 연산자/부호 연산자 (0) | 2021.06.06 |