본문 바로가기
Study/JAVA

[Java] 3-1. 연산자

by jeongwle 2022. 8. 30.
728x90
반응형

 

연산자(operator)

연산자는 연산을 수행하는 기호이다. 자바에서는 사칙연산(+, -, *, /)을 비롯해서 다양한 연산자를 제공한다. 천천히 하나씩 배워가보자.

 

1. 연산자와 피연산자

연산자가 연산을 수행하려면 반드시 연산의 대상이 있어야 한다. 이것을 피연산자라 한다.
연산자(operator): 연산을 수행하는 기호(+, -, *, / 등)
피연산자(operand): 연산자의 작업대상(변수, 상수, 리터럴, 수식)
연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.

 

2. 식과 대입연산자

연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것을 식(expression)이라 한다. 식을 계산하여 결과를 얻는 것을 '식을 평가(evaluation)한다'고 한다. 하나의 식을 평가하면 단 하나의 결과를 얻는다.
식 그 자체는 어디에도 담겨있지 않기 때문에 대입연산자를 이용해 변수에 할당하여 사용해야 한다.

 

3. 연산자의 종류


종류 연산자 설명
산술 연산자 +  -  *  /  %  <<  >> 사칙연산(+, -, *, /)과 나머지 연산(%)
비교 연산자 >  <  >=  <=  ==  != 크고 작음과 같고 다름을 비교
논리 연산자 &&  ||  !  &  |  ^  ~ 그리고(AND)와 또는(OR)으로 조건을 연결
대입연산자 = 우변의 값을 좌변에 저장
기타 (type). ?:  instanceof 형변환 연산자, 삼항연산자, instanceof연산자
연산자는 위의 표처럼 크게 4가지로 분류된다.

피연산자의 개수로 연산자를 분류하기도 한다. 피연산자의 개수가 1개면 단항 연산자, 2개면 이항 연산자, 3개면 삼항 연산자 라고 부른다. 대부분의 연산자는 이항 연산자이고 삼항 연산자는 오직 ?: 뿐이다.

 

4.연산자의 우선순위와 결합규칙

식에 사용된 연산자가 둘 이상일 경우 연산자의 우선순위에 의해서 연산순서가 결정된다. 연산자의 우선순위는 대부분 상식적인 선에서 해결된다. 하지만 상식만으로 판단하기 쉽지 않은 우선순위 몇 가지를 정리해보겠다.

설명
x << 2 + 1 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮다.
그래서 왼쪽의 식은 x << (2 + 1)과 같다.
data & 0xFF == 0 비트 연산자(&)는 비교 연산자(==)보다 우선순위가 낮으므로 비교연산 후에 비트연산이 실행된다. 그래서 왼쪽의 식은 data & (0xFF == 00)과 같다.
x < -1 || x > 3 && x < 5 논리 연산자 중에서 AND를 의미하는 &와 &&가 OR를 의미하는 |와 ||보다 우선순위가 높다. 이처럼 수식에 AND와 OR가 함께 사용되는 경우는 다음과 같이 괄호를 사용해서 우선순위를 명확히 하는 것이 좋다.
x < -1 ( x > 3 && x < 5)
만일 우선순위가 확실치 않다면 먼저 계산되어야하는 부분을 괄호로 묶어주자.

하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우 우선순위가 같다고 하여 아무렇게나 연산이 되는 것이 아니고 나름대로의 규칙을 가지고 연산이 수행된다. 그 규칙을 연산자의 결합규칙이라 한다. 연산자의 결합규칙은 연산자마다 다르지만 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 그 반대로 오른쪽에서 왼쪽의 순서로 연산을 수행한다.

1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

종류 결합규칙 연산자 우선순위
단항 연산자 <--------- ++  --  +  -  ~  !  (type) 높음


















낮음
산술 연산자 ---------> *  /  %
+  -
<<  >>
비교 연산자 <  >  <=  >=  instanceof
==  !=
논리 연산자 &
^
|
&&
||
삼항 연산자 ?:
대입 연산자 <--------- =  +=  -=  *=  /=  %=  <<=  >>=  &=  ^=  |=
* 단항 연산자에 있는 + 와 - 는 부호 연산자이다.

 

5. 산술변환(usual arithemectic conversion)

연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것을 산술 변환 또는 일반 산술 변환이라 한다. 이 변환은 이항 연산뿐만 아니라 단항 연산에서도 일어난다. 산술 변환의 규칙을 알아보자.

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
* 모든 연산에서 산술 변환이 일어나지만, 쉬프트 연산자(<<, >>)와 증감 연산자(++, --)는 예외이다.

첫 번째 규칙은 자동 형변환에서 배운 것 처럼 값손실을 최소화하기 위함이고, 두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문이다.

여기서 한 가지 주목해야할 점은 연산결과의 타입이다. int와 int의 나눗셈의 경우 결과값의 타입은 int여서 소수점 이하는 버려진다.
int / int -> int ==> 5 / 2 -> 2
위의 식에서 2.5라는 실수를 결과로 얻고 싶다면 피연산자 중 한 쪽을 float과 같은 실수형으로 형변환해야 한다.
int / (float)int -> int / float -> float / float -> float
5 / (float)2 -> 5 / 2.0f -> 5.0f / 2.0f -> 2.5f

결국 산술 변환이란 용어가 거창하지만 연산 직전에 발생하는 자동 형변환일 뿐이다.

 

 

 

728x90
반응형

'Study > JAVA' 카테고리의 다른 글

[Java] 3-3,4,5,6. 산술 & 비교 & 논리 & 그 외 연산자  (2) 2022.08.30
[Java] 3-2. 단항 연산자  (0) 2022.08.30
[Java] 2-5. 형변환  (0) 2022.08.03
[Java] 2-2. 변수의 타입  (0) 2022.08.02
[Java] 2-1. 변수(variable)  (0) 2022.08.02

댓글