JAVA LV 2

연산자(Operator)

Posted by Gihoon on March 13, 2023

연산자

​ 연산자는 ‘연산을 수행하는 기호’를 말한다. 예를 들어 ‘+’기호는 덧셈 연산을 수행하며, ‘덧셈 연산자’라고 한다. 자바에서는 사칙연산을 비롯해서 다양한 연산자들을 제공한다. ​

연산자와 피연산자

​ 연산자가 연산을 수행하려면 연산의 대상이 있어야하는데, 이것은 ‘피연산자’라고 한다. 피연산자로 상수, 변수 또는 식을 사용할 수 있다. ​

  • 연산자 : 연산을 수행하는 기호(+,=,*등)
  • 피연산자: 연산자의 작업 대상(변수,상수,리터럴,수식)
    대부분의 연산자는 두 개의 피연산자를 필요로 하며, 하나 또는 세개의 피연산자를 필요로 하는 연산자도 있다. 연산자는 피연산자로 연산을 수행하고 나면 항상 결과 값을 반환한다.

    식과 대입연산자.

    ​ 연산자와 피연산자를 계산하고자 하는 바를 표현한 것을 ‘식’이라고 한다. 그리고 식을 계산하여 결과를 얻는 것을 ‘식을 평가 한다’라고 한다.
    예를 들어 변수 x의 값이 5일 때 다음과 같은 과정으로 처리된다.
    4 * x + 3;
    -> 4 * 5 + 3;
    -> 23; // 결과는 얻었지만 쓰이지 않고 사라진다. ​ 따라서 대입 연산자 ‘=’을 이용하여 변수와 같이 값을 저장할 수 있는 공간에 결과를 저장해야한다.
    y = 4 * x + 3;
    -> y = 4 * 5 + 3;
    -> y = 23; ​ 그 다음에는 변수 y에 저장된 값을 화면에 출력함으로써 의미있는 결과를 얻을 수 있다. ​

    연산자의 종류

    ​ | 종류 | 연산자 | 설명 | | — | — | — | | 산술 연산자 | + = * / % « » | 사칙연산과 나머지 연산 | | 비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 | | 논리 연산자 | && ! II & I ^ ~ | ‘그리고(AND)’와 ‘또는(OR)’으로 조건을 연결 | | 대입 연산자 | = | 우변의 값을 좌변에 저장 | | 기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof연산자 | ​ 연산자는 위의 표에서 알 수 있는것처럼 산술, 비교, 논리, 대입 4가지로 나눌 수 있다. ​ 피연산자의 개수에 의한 분류
    피연산자의 개수로 연산자를 분류하기도 하는데, 피연산자의 개수가 하나면 ‘단항 연산자, 두개면 ‘이항 연산자’, 세개면 ‘삼항 연산자’이다. 대부분의 연산자는 ‘이항 연산자’이고, 삼항 연산자는 오직 ‘?:’ 하나 뿐이다.
    -3 -5
    위의 식에는 두 개의 연산자가 포함 되어 있는데 왼쪽의 것은 ‘부호 연산자’이고, 오른쪽의 것은 ‘뺄셈 연산자’이다.
    이럴 때의 구분은 피연산자의 개수로 한다.
    부호 연산자는 단항 연산자로 피연산자가 ‘3’ 하나 뿐이지만, ‘뺄셈 연산자’는 이항 연산자로 피연산자가 ‘-3’과’5’ 두개 이다.
    이처럼 연산자를 기능별, 피연산자의 개수별로 나누어 분류하는 것은 ‘연산자의 우선순위’ 때문이기도 하다. ​

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

    ​ 식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다.
    상식선에서 해결되는 우선순위를 정리해보자. ​ | 식 | 설명 | | — | — | | -x +3 | 단항 연산자가 이항 연산자보다 우선순위가 높으므로 x의 부호를 바꾼 다음 덧셈이 수행된다. | | x + 3 * y | 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다. | | x + 3 > y - 2 | 비교연산자 보다 산술 연산자가 먼저 수행된다. | | x > 3 && x < 5 | 논리연산자 && 보다 비교연산자가 먼저 수행된다. 식의 의미는 ‘x가 3보다 크고 5보다 작다’ 이다. | | result = x + y * 3; | 대입 연산자는 우선순위가 제일 낫다. 따라서 우변의 최종 연산결과가 변수 result에 저장된다. | ​ 상식만으로 판단하기 쉽지 않은 우선순위 몇가지를 표로 정리해보자. ​ | 식 | 설명 | | — | — | | x « 2 + 1 | 쉬프트 연산자 « 는 덧셈 연산자 보다 우선순위가 낮다. | | data & 0xFF == | 비트 연산자 &는 비교 연산자 == 보다 우선순위가 낮으므로 비교 연산 후에 비트연산이 수행된다. 그래서 왼쪽의 식은 ‘data & (0xFF==0)이다. | | x < -1 ll x > 3 && x < 5 | 논리 연산자 중에서 AND를 의미하는 &, &&가 OR를 의미하는 I, II 보다 우선순위가 높다. 이처럼 AND와 OR이 함께 사용되는 경우는 다음과 같이 괄호를 사용해서 우선순위를 명확히 하는것이 좋다. x < -1 II (x > 3 && x < 5) | ​ 연산자의 결합규칙
    하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 나름대로의 규칙을 가지고 있는데, 그 규칙을 ‘연산자의 결합규칙’ 이라고 한다.
    연산자의 결합규칙은 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자위 대입 연산자만 그 반대로, 오른쪽에서 왼쪽의 순서로, 연산을 수행한다. ( x = y = 3 -> x =3 )
    결과적으로 연산자의 우선순위에 대해서 정리하면 다음과 같다.

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

연산자

산술 변환

이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 타입이 다르면 연산전에 형변환 연산자로 타입을 일치시켜야 한다.
예를 들어, int 타입과 float타입을 덧셈하는 경우, 형변환 연산자를 이용해서 둘 다 int 또는 float로 일치 시켜야 한다.

1
2
3
int i = 10;
float f = 20.0f;
float result = f + (float)i;

대부분의 경우 더 큰 타입으로 일치시키는데, 그 이유는 값손실을 방지하기 위해서이다.
이런 경우 자동적으로 형변환 대므로 형변환 연산자를 생략 가능하다.

1
float result = f + i; // 형변환 연산자를 생략하였다

이처럼 타입의 일치를 위해 자동 형변환되는 것을 ‘산술 변환’ 또는 ‘일반 산술 변환’이라 하며 이 변환은 이항 연산에서만 아니라 단항 연산에서도 일어난다. 규칙은 다음과 같다.

  1. 두 피연산자의 타입을 같게 일치시킨다 ( 보다 큰 타입으로 일치)
  2. 피연산자의 타입이 int 보다 작은 타입이면 int로 변환한다.

두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문에, 그리고 int 보다 작은 타입, 예를 들면 char 나 short의 표현범위가 좁아서 연산준에 overflow가 발생할 가능성이 높기 때문에 만들어진것이다.
그리고 연산결과는 피연산자의 타입과 일치한다. 5/2 -> 2 의 예와 같이 int와 int 의 나눗셈의 결과는 int이기 때문에 소수점이하는 버려진다. 2.5 라는 결과를 얻기 위해서는 피연산자중 한쪽을 float와 같은 실수형으로 형변환 해야한다.