[Java] 연산자

kiteB·2021년 12월 17일
0

Java

목록 보기
3/35
post-thumbnail

[ 연산자와 연산식 ]

  • 연산(operations)은 프로그램에서 데이터를 처리하여 결과를 산출하는 것을 말한다.
  • 연산에 사용되는 표시나 기호를 연산자(operator)라고 하고,
  • 연산되는 데이터를 피연산자(operand)라고 한다
  • 연산자와 피연산자를 이용하여 연산의 과정을 기술하는 것을 연산식(expressions)이라고 한다.

다양한 연산자

연산식은 반드시 하나의 값을 산출한다.

int result = x + y;

연산식은 다른 연산식의 피연산자 위치에도 올 수 있다.

boolean result = (x+y) < 5;

[ 연산의 방향과 우선 순위 ]

예제

산술 * 연산자가 + 연산자보다 우선순위가 높으므로 위와 같은 순서로 연산이 이뤄진다.
만약 var1var2를 먼저 연산하고 싶다면 ()를 사용하면 된다.

📌 연산의 방향과 우선순위 정리

  1. 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
  2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
  3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다. ()
  4. 복잡한 연산식에는 괄호 ()를 사용해서 우선순위를 정해준다.

[ 단항 연산자 ]

단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며,
부호 연산자(+, -), 증감 연산자(++, --), 논리 부정 연산자(!), 비트 반전 연산자(~)가 있다.

1. 부호 연산자 (+, -)

양수 및 음수룰 표시하는 +, -. boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있다.

  • +, -는 산술 연산자이기도 하고, 부호 연산자이기도 하다.
  • 부호 연산자로 사용할 때에는 하나의 피연산자만 필요하다.

부호 연산자를 정수 및 실수 리터럴 앞에 붙여 양수 및 음수를 표현한다.

int i1 = +100;
int i2 = -100;

double d1 = +3.14;
double d2 = -10.5;

부호 연산자를 정수 또는 실수 타입 변수 앞에 붙일 수도 있다.
이 경우, 변수 값의 부호를 유지하거나 바꾸기 위해서 사용한다.

int x = -100;
int result1 = +x;	//result1은 -100
int result2 = -x;	//result2는 100

주의부호 연산자의 산출 타입은 int 타입이 된다!

short s = 100;
short result = -s;	//컴파일 에러!

그래서 위와 같이 컴파일 에러가 발생한다. 다음과 같이 부호 연산자를 사용할 때는 결과를 저장할 변수를 int 타입으로 변경해야 한다.

short s = 100;
int result = -s;	//result는 -100

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

증감 연산자는 변수의 값을 1 증가(++)시키거나 1 감소(--)시키는 연산자를 말한다.
boolean 타입을 제외한 모든 기본 타입의 피연산자에 사용할 수 있다.

1) 연산식에서 증감 연산자만 있는 경우

증감 연산자가 변수 앞/뒤 어디든 위치해도 상관없다.

2) 연산식에서 다른 연산자와 함께 사용하는 경우

다른 연산자와 함께 사용하는 연산식에서는 증감 연산자의 위치에 따라 연산식의 결과가 다르게 나오므로 주의해야 한다.

증감 연산자가

  • 변수 앞에 있으면 변수를 1 증가/감소시킨 뒤 다른 연산자와 계산한다.
  • 변수 뒤에 있으면 다른 연산자를 먼저 처리한 뒤 변수를 1 증가/감소시킨다.
int x = 1;
int y = 1;

int result1 = ++x + 10;		//result1은 12
int result2 = y++ + 10;		//result2는 11
  • result1x 값이 1 증가된 후, 10과 합쳐져서 2 + 10 = 12가 된다.
  • result2y 값과 10이 합쳐져서 11이 된 후, y 값을 1 증가시킨다.

3. 논리 부정 연산자 (!)

논리 부정 연산자는 truefalse로, falsetrue로 변경하기 때문에 boolean 타입에만 사용할 수 있다.

논리 부정 연산자는 조건문과 제어문에서 사용되어 조건식의 값을 부정하도록 해서 실행 흐름을 제어할 때 주로 사용한다. 또한 두 가지 상태(true/false)를 번갈아가며 변경하는 토글(toggle) 기능을 구현할 때도 주로 사용한다.

4. 비트 반전 연산자 (~)

비트 반전 연산자는 정수 타입(byte, short, int, long)의 피연산자에만 사용되며,
피연산자를 2진수로 표현했을 때 0을 1로, 1을 0으로 반전한다.

연산 후, 부호 비트인 최상위 비트를 포함해서 모든 비트가 반전되기 때문에, 부호가 반대인 새로운 값이 산출된다.

비트 반전 연산자를 사용할 때 주의할 점은 비트 반전 연산자 산출 타입은 int 타입이 된다는 것!
피연산자는 연산을 수행하기 전에 int 타입으로 변환되고, 비트 반전이 일어난다.

그래서 다음과 같은 코드는 컴파일 에러가 발생한다.

byte v1 = 10;
byte v2 = ~v1;	//컴파일 에러

이를 해결하기 위해서는 다음과 같이 변경해야 한다.

byte v1 = 10;
int v2 = ~v1;

[ 이항 연산자 ]

이항 연산자는 피연산자가 두 개인 연산자를 말하며,
산술 연산자(+, -, *, /, %), 문자열 연결 연산자(+), 대입 연산자(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=), 비교 연산자(<, <=, >, >=, ==, !=), 논리 연산자(&&, ||, &, |, ^, !), 비트 논리 연산자(&, |, ^), 비트 이동 연산자(<<, >>, >>>) 등이 있다.


1. 산술 연산자 (+, -, *, /, %)

산술 연산자는 사칙연산인 더하기(+), 빼기(-), 곱하기(*), 나누기(/)와 나머지 연산자(%)를 포함한 총 5개이다.

산술 연산자는 피연산자들의 타입이 동일하지 않을 경우,
다음과 같은 규칙을 사용해서 피연산자들의 타입을 일치시킨 후 연산을 수행한다.

  1. 피연산자들이 모두 정수 타입이고, int 타입보다 크기가 작은 타입일 경우
    모두 int 타입으로 변환 후 연산을 수행한다. 따라서 연산의 산출 타입은 int이다.
    • 예) byte + byteint + int = int
  2. 피연산자들이 모두 정수 타입이고, long 타입이 있을 경우
    모두 long 타입으로 변환 후 연산을 수행한다. 따라서 연산의 산출 타입은 long이다.
    • 예) int + longlong + long = long
  3. 피연산자 중 실수 타입(float, double)이 있을 경우,
    크기가 큰 실수 타입으로 변환 후 연산을 수행한다. 따라서 연산의 산출 타입은 실수 타입이다.
    • 예) int + doubledouble + double = double

📌 정리

long 타입을 제외한 정수 타입 연산은 int 타입으로 산출되고, 피연산자 중 하나라도 실수 타입이면 실수 타입으로 산출된다.


2. 문자열 연결 연산자 (+)

문자열 연결 연산자인 +문자열을 서로 결합하는 연산자이다.

피연산자 중 한쪽이 문자열이면 + 연산자는 문자열 연결 연산자로 사용되어 다른 피연산자를 문자열로 변환하고 결합한다.


3. 비교 연산자 (<, <=, >, >=, ==, !=)

비교 연산자는 대소 또는 동등을 비교해서 boolean 타입인 true/false를 산출한다.

대소 연산자는 boolean 타입을 제외한 기본 타입에 사용할 수 있고, 동등 연산자는 모든 타입에 사용될 수 있다.
비교 연산자는 흐름 제어문인 조건문(if), 반복문(for, while)에서 주로 이용되어 실행 흐름을 제어할 때 사용한다.

만약 피연산자가 char 타입이면 유니코드 값으로 비교 연산을 수행한다
비교 연산자에서도 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다.


4. 논리 연산자 (&&, ||, &, |, ^, !)

논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리 부정(!) 연산을 수행한다.
논리 연산자의 피연산자는 boolean 타입만 사용할 수 있다.

&&&는 산출 결과는 같지만 연산 과정이 조금 다르다.

  • &&: 앞의 피연산자가 false → 뒤의 피연산자를 평가하지 않고 바로 false
  • &: 앞의 피연산자가 false → 뒤의 피연산자까지 평가한 뒤 false

즉, &&&보다 더 효율적으로 동작한다. |||도 마찬가지이다.

논리 연산은 흐름 제어문인 조건문(if), 반복문(for, while) 등에서 주로 이용된다.


5. 비트 연산자 (&, |, ^, ~, <<, >>, >>>)

비트 연산자는 데이터를 비트(bit) 단위로 연산하기 때문에 정수 타입만 비트 연산을 할 수 있다. (01로 표현이 가능)
기능에 따라 비트 논리 연산자(&, |, ^, ~)와 비트 이동 연산자(<<, >>, >>>)로 구분한다.

1) 비트 논리 연산자

2) 비트 이동 연산자 (<<, >>, >>>)

비트 이동(shift) 연산자는 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.


6. 대입 연산자 (=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)

대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장한다.
오른쪽 피연산자는 리터럴 및 변수, 그리고 다른 연산식이 올 수 있다.
단순히 오른쪽 피연산자의 값을 변수에 저장하는 단순 대입 연산자정해진 연산을 수행한 후 결과를 변수에 저장하는 복합 대입 연산자도 있다.

대입 연산자는 모든 연산자들 중에서 가장 낮은 연산 순위를 가지고 있기 때문에 제일 마지막에 수행된다.


[ 삼항 연산자 ]

삼항 연산자(?:)는 세 개의 피연산자를 필요로 하는 연산자를 말한다.
삼항 연산자는 ? 앞의 조건식에 따라 콜론(:) 앞뒤의 피연산자가 선택된다고 해서 조건 연산식이라고 부르기도 한다.

조건식을 연산하여

  • true가 나오면 삼항 연산자의 결과는 피연산자2가 된다.
  • false가 나오면 삼팡 연산자의 결과는 피연산자3이 된다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글