본문 바로가기

프로그래밍/JAVA

[JAVA 이론] 연산자

연산자란?

연산자는 '연산을 수행하는 기호'를 말한다.

 

연산자

  • y = x + 3

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

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

식(expression): x + 3 [연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한 것]

대입 연산자: = [변수와 같이 값을 저장할 수 있는 공간에 결과를 저장하기 위해 사용]

 

연산자의 종류

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

 

연산자의 결합규칙

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

[연산자의 종류와 우선순위와 결합규칙(출처: 자바의 정석)]

산술변환

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

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

 

단항 연산자

증감 연산자 ++ --

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

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

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

 

산술 연산자

산술 연산자는 사칙 연산자와 나머지 연산자가 있다.

 

사칙 연산자(+ - * /)

byte a = 10;
byte b = 20;
byte c = a + b; <- 컴파일 에러

연산 시 byte형이 int형으로 변환 되었고 변환 된 int형을 byte에 넣으려고 하니까 컴파일 에러가 남

 

byte a = 10;
byte b = 20;
byte c = (a * b);

System.out.println(c); //44

결과값이 byte형의 범위인 '-128 ~ 127'의 범위를 넘는 값이므로 값 손실이 일어남

 

int a = 1_000_000;
int b = 2_000_000;

long c = a * b;

System.out.println(c); //-1454759936

long형의 범위는 2조를 담기에 충분하지만 int형끼리의 연산 결과는 int형이므로 다른 결과값이 나오게 됨

 

long a = 1_000_000 * 1_000_000;
long b = 1_000_000 * 1_000_000L;

System.out.println(a); //-727379968
System.out.println(b); //1000000000000

이 또한 연산의 결과가 int형이므로 다른 결과값이 출력

 

long a = 1000000 * 1000000 / 1000000;
long b = 1000000 / 1000000 * 1000000;

System.out.println(a); //-727
System.out.println(b); //1000000

연산 결과에 따라서도 값이 바뀔 수가 있음

 

char c1 = 'a';

char c2 = c1 + 1; <- 컴파일 에러
char c3 = (char)(c1 + 1); //'b'
char c4 = 'a' + 1; //'b'

char c2 = c1 + 1; 은 결과값이 int형이기 때문에 컴파일 에러가 난다. 따라서 c3으 과정처럼 형변화을 해주어야 한다.

하지만 char c4 = 'a' + 1;은 왜 에러가 나지 않는 것일까. 바로 'a' + 1이 리터럴 간의 연산이기 때문이다. 리터럴 간의 연산은 실행 과정동안 변화는 값이 아니기 때문에, 컴파일러가 미리 연산을 하고 대체하여 적용한다.

 

나머지 연산자(%)

나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다. 나누는 수로 0을 사용할 수 없다.

 

비교 연산자

비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며, 여산결과는 오직 true와 false 둘 중의 하나이다. 비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형 변환하여 피연산자의 타입을 일치시킨 후에 비교한다.

 

대소비교 연산자(<, >, <=, >=)

두 피연산자의 값의 크기를 비교하는 연산자이다. 참이면 true를 거짓이면 false를 결과로 반환한다. 기본형 중에서는  boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.

 

등가비교 연산자(==, !=)

두 피연산자의 값의 크기를 비교하는 연산자이다. 모든 자료형에 사용 가능.

 

※문자열의 비교

두 문자열을 비교할 때는, 비교 연산자 '=='대신 equals()라는 메서드를 사용해야 한다.

String str = new String("abc");

boolean result = srt.equals("abc");

 

논리 연산자

논리 연산자는 둘 이상의 조건을 '그리고(AND)'나 또는(OR)으로 연결하여 하나의 식으로 표현할 수 있게 해준다.

 

논리 연산자(&&, ||, !)

|| (OR결합): 피연산자 중 어느 한 쪽만 true이면true를 결과로 얻는다.

               '참'일 확률이 높은 피연산자를 왼쪽에 두는게 연산 속도가 빠름

&&(AND결합): 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.

! 논리 부정 연산자: 피연산자가 true이면 false를, false면 true를 결과로 반환한다.

 

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

| (OR연산자): 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.

&(AND연산자): 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.

^(XOR연산자): 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

~(비트 전환 연산자): 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다.

<< >> (쉬프트 연산자): 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동한다

                                x >> n은 x * 2의n승의 결과와 같다

                                x >> n은 x / 2의n승의 결과와 같다

 

그 외의 연산자

조건 연산자( ? : )

result = (x > y) ? x(참) : y(거짓);

 

대입 연산자( =.  operator= )

=, += 등..

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA 이론] 객체지향 프로그래밍_1  (2) 2022.01.19
[JAVA 이론] 배열  (0) 2022.01.15
[JAVA 이론] 조건문과 반복문  (0) 2022.01.12
[JAVA 이론] 변수  (0) 2021.12.16
[JAVA 이론] 자바  (0) 2021.12.15