자바 연산자(operator) 개념과 종류에 대해 알아보자

2024. 12. 26. 13:00JAVA

728x90
반응형

 
 안녕하세요. 진득 코딩입니다.
 
 프로그래밍을 하면서 처음에 저장해 둔 변수만을 사용할 수 없습니다.
 
 여러 데이터들을 가공하거나 연산들을 수행할 일들이 생기게 됩니다.
 
 이번 시간에는 자바에서 여러 연산을 수행할 때 사용하는 기호인 연산자에 대해서 알아보도록 하겠습니다.
 

연산자(operator)와 피연산자(operand)

 

  • 연산자는 연산을 수행하는 기호를 말합니다.
  • 연산자가 연산을 수행하기 위해서는 반드시 연산의 대상이 있어야 하는데 이를 피연산자(operand)라고 합니다.
  • 피연산자로 상수, 변수 또는 식 등을 사용할 수 있습니다.


 연산자(operator) : 연산을 수행하는 기호(+, -, *, / 등)

 피연산자(operand) :  연산자의 작업 대상(변수, 상수, 리터럴, 수식)

 

  • 대부분의 연산자는 두 개의 피연산자를 필요로 하며, 하나 또는 세 개의 피연산자를 필요로 하는 연산자도 있습니다.
  • 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환합니다.

식과 대입연산자

 

  • 식(expression)은 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것입니다.
  • 또한 식을 계산하여 결과를 얻는 것을 '식을 평가한다(evaluation)'이라고 합니다.
  • 하나의 식을 평가(계산)하면 단 하나의 결과를 얻습니다.
  • 식을 평가한 후에는 대입 연산자 '='를 사용해서 변수와 같이 값을 저장할 수 있는 공간에 결과를 저장해야 합니다.
  • 변수에 저장된 값을 다른 곳에 사용하거나 화면에 출력함으로써 의미있는 결과를 얻을 수 있습니다.

연산자의 종류

 

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

 * (type)은 '형변환 연산자'를 의미합니다.
 

  • 연산자는 크게 산술, 비교, 논리, 대입 4가지로 나눌 수 있습니다.
  • 연산자를 피연산자의 개수로 분류하게 되면 피연산자의 개수가 하나면 '단항 연산자', 두 개면 '이항 연산자', 세 개면 '삼항 연산자'라고 부릅니다.
  • 대부분의 연산자는 '이항 연산자'이고, 삼항 연산자는 오직 '?:' 하나뿐입니다.

단항 연산자와 이항 연산자

 

  •  위의 식에서 두 연산자 모두 기호 '-'로 나타내지만 위에 있는 연산자는 이항연산자(뺄셈 연산자)이고, 아래에 있는 연산자는 단항 연산자입니다.
  • 부호 연산자는 단항 연산자로 피연산자가 '10' 한개 뿐이지만, 뺄셈 연산자는 이항 연산자로 피연산자가 '10'과 '20' 두 개입니다.
  • 이처럼 연산자를 기능별, 피연산자의 개수로 나누어 분류하는 것은 '연산자의 우선순위' 때문입니다.

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

 

설명
-x + 3 단항 연산자가 이항 연산자보다 우선순위가 높다. 그래서 x의 부호를 바꾼 다음 덧셈이 수행됩니다. 여기서 '-'는 뺄셈 연산자가 아니라 부호 연산자입니다.
x + 3 * y 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높습니다.
 그래서 '3*y'가 먼저 계산됩니다.
x + 3 > y - 2 비교 연산자(>)보다 산술 연산자가 '+'와 '-'가 먼저 수행됩니다.
 그래서 'x+3'과 'y-2'가 먼저 계산된 다음에 '>'가 수행됩니다.
x > 3 && x < 5 논리 연산자 '&&'보다 비교 연산자가 먼저 수행됩니다.
 그래서 'x > 3'와 'x < 5'가 먼저 계산된 다음에 '&&'가 수행됩니다.
 식의 의미는 'x가 3보다 크고 5보다 작다'입니다.
result = x + y * 3; 대입 연산자는 연산자 중에서 제일 우선순위가 낮습니다.
 그래서 우변의 최종 연산결과가 변수 result에 저장됩니다.

 

  • 식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산 순서가 결정됩니다.
  • 위 표에 있는 연산순서는 상식선에서 판단이 가능한 수준의 우선순위입니다.

설명
x << 2 + 1 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮습니다.
 그래서 왼쪽의 식은 'x << (2+1)'과 같습니다.
data & 0xFF == 0 비트 연산자(&)는 비교 연산자(==)보다 우선순위가 낮으므로 비교 연산 후에 비트연산이 수행됩니다. 그래서 왼쪽의 식은 'data & (0xFF == 0)'과 같습니다.
x < -1 || x > 3 && x < 5 논리 연산자 중에서 AND를 의미하는 '&'와 '&&'가 OR을 의미하는 '|'와 '||'보다 우선순위가 높습니다. 이처럼 수식에 AND와 OR가 함께 사용되는 경우는 다음과 같이 괄호를 사용해서 우선순위를 명확하게 하는 것이 좋습니다.
 x < -1 || (x > 3 && x < 5)

 

  • 위 표에 있는 연산자 우선순위는 주의해야 할 우선순위입니다.
  • 만일 우선순위가 확실하지 않다면, 먼저 계산되어야 하는 부분을 괄호로 묶어주면 됩니다.
  • 괄호는 연산자가 아니라 연산자의 우선순위를 임의로 지정할 때 사용하는 기호입니다.

연산자의 결합규칙

 

  • 하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 연산을 수행하는 순서에 대한 규칙을 '연산자의 결합규칙'이라고 합니다.
  • 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행합니다.
  • 단항 연산자와 대입 연산자만 그 반대로, 오른쪽에서 왼쪽의 순서로, 연산을 수행합니다.
  • 대입연산자는 우변의 값을 좌변에 저장하고, 저장된 값을 연산결과로 반환합니다.


 1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행됩니다.

 2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높습니다.

 3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽입니다.

 

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









산술 연산자------> * / %
------> + -
------> << >>
비교 연산자------> < > <= >= instanceof
------> == !=
논리 연산자------> &











낮음
------> ^
------> |
------> &&
------> ||
삼항 연산자------> ?:
대입 연산자<------ = += -= *= /= %=
 <<= >>= &= ^= |=

 

  • 단항연산자에 있는 '+'와 '-'는 부호연산자이고, '(type)'은 형변환 연산자입니다.
  • instanceof는 객체의 타입을 확인하는 데 사용되는 연산자입니다.

산술 변환(usual arithmetic conversion)

 

  • 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전에 형변환 연산자로 타입을 일치시켜야 합니다.
  • 두 피연산자의 타입 중에서 더 큰 타입으로 일치시키는데 그 이유는 작은 타입으로 형변환하면 원래의 값이 손실될 가능성이 있기 때문입니다.
  • 이처럼 연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것을 '산술 변환' 또는 '일반 산술 변환'이라고 합니다.


 1. 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
    long + int -> long + long -> long
    float + int -> float + float -> float
    double + float -> double + double -> double

 2. 피연산자의 타입이 iont보다 작은 타입이면 int로 변환한다.
    byte + short -> int + int -> int
    char + short -> int + int -> int

* 모든 연산에서 '산술 변환'이 일어나지만, 쉬프트 연산자(<<, >>), 증감 연산자(++, --)는 예외입니다.

 

  • 첫 번째 규칙은 피연산자의 값손실을 최소화하기 위한 것이고, 두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문입니다.
  • char나 short의 표현범위가 좁아서 연산 중에 오버플로우(overflow)가 발생할 가능성이 높기 때문에 만들어진 것입니다.


산술변환 - 연산 수행 직전에 발생하는 피연산자의 자동 형변환

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

 

증감 연산자 (++, --)

 

  • 증감연산자는 피연산자에 저장된 값을 1 증가 또는 감소시킵니다.
  • 정수와 실수가 모두 가능하지만, 상수는 값을 변경할 수 없으므로 가능하지 않습니다.
  • 대부분의 연산자는 피연산자의 값을 읽어서 연산에 사용할 뿐, 피연산자의 타입이나 값을 변경시키지 않습니다.
  • 오직 대입연산자와 증감연산자만 피연산자의 값을 변경합니다.
  • 증감연산자는 일반 산술 변환에 의한 자동 형변환이 발생하지 않으며, 연산결과의 타입은 피연산자의 타입과 같습니다.


 증가 연산자(++) 피연산자의 값을 1 증가시킵니다.

 감소 연산자(--) 피연산자의 값을 1 감소시킵니다.

 

  • 증가 연산자 '++'와 감소 연산자 '--'는 피연산자 양쪽 모두 위치할 수 있습니다.
  • 피연산자의 왼쪽에 위치하면 '전위형(prefix)', 오른쪽에 위치하면 '후위형(postfix)'라고 합니다.

타입설명사용예
전위형 값이 참조되기 전에 증가시킵니다.j = ++i;
후위형 값이 참조된 후에 증가시킵니다.j = i++;

 

  • 하지만 증감연산자가 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없습니다.

예제 3-1

 

  • 결과를 보면 두 번 모두 i의 초기값 5에서 1이 증가된 6이 출력된 것을 알 수 있습니다.
  • 위 경우에서는 어떤 수식에 포함된 것이 아니라 단독적으로 사용되었기 때문에 차이가 없습니다.
  • 그러나 다른 수식에 포함되거나 메서드의 매개변수로 사용된 경우, 전위형(++i)과 후위형(i++)의 결과는 다릅니다.

예제 3-2

 

  • 전위형은 변수(피연산자)의 값을 먼저 증가시킨 후에 변수의 값을 읽어오는 반면, 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킵니다.
  • 전위형의 경우 증감연산자를 식의 이전으로, 후위형의 경우 증감연산자를 식의 이후로 떼어내서 생각하면 쉽습니다.

예제 3-3

 

  • 위 예제는 메서드 호출에 증감연산자가 사용된 예입니다.
  • i는 값이 증가되기 전에 참조되므로 println()에게 i에 저장된 값 5를 넘겨주고 나서 i의 값이 증가하기 때문에 5가 출력됩니다.
  • j는 j에 저장된 값을 증가시킨 후에 println()에게 값을 넘겨주므로 6이 출력됩니다.
  • 결과적으로는 i, j 모두 1씩 증가되어 6이 됩니다.
  • 증감연산자를 사용하면 코드가 간결해지지만, 지나치면 코드가 복잡해져 이해하기 어려워집니다.
  • 때문에 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 지양해야 합니다.

부호 연산자 (+, -)

 

예제 3-4

 

  • 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환합니다.
  • 피연산자가 음수면 양수, 양수면 음수가 연산의 결과가 됩니다.
  • 부호연산자 '+'는 하는 일이 없으며, 쓰이는 경우도 거의 없습니다.
  • 부호 연산자는 boolean형과 char형을 제외한 기본형에만 사용할 수 있습니다.
  • 부호연산자는 덧셈, 뺄셈연산자와 같은 기호를 쓰지만 다른 연산자입니다.
  • 기호는 같아도 피연산자의 개수가 달라서 구별이 가능합니다.


 
 이번 시간에는 연산에 사용되는 연산자들에 대해서 알아보았습니다.

 포스팅 중에 이해가 안 되시는 부분이 있다면 댓글에 남겨주시면 아는 수준 안에서 성심껏 답변해 드리도록 하겠습니다.

 이번 포스팅은 여기까지입니다.
 
 끝까지 봐주셔서 감사합니다.😊

728x90
반응형
LIST