JAVA/자바 문법

[Java] 연산자

isfp_yykkng 2023. 8. 28. 21:41

연산자

연산자(Operator)와 피연산자(Operand)

  • 연산자 : 사칙연산을 비롯해서 다양한 연산을 수행하게끔 하는 기호
  • 피연산자 : 연산되어지는 연산의 대상 (ex. x+y 식에서 x, y)

* 일반적으로 식이 평가되어서 결과를 얻더라도 쓰이지 않으면 사라지기 때문에 연산자 중 대입 연산자(=)를 사용하여 값을 저장한다. 단순 출력 목적으로는 출력 메서드( System.out.print() ) 에 직접 작성한다.

연산자 종류

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

* 증감, 부호 연산자와 삼항 연산자를 제외하고는 대부분 이항 연산자이며 단항 연산자와 대입 연산자를 제외하고 모든 연산의 방향은 왼쪽에서 오른쪽!

산술 연산자

  • 부호 연산자 :  부호를 결정하는 연산자 (피연산자의 부호를 그대로(+) / 반대로(-) 변경)
  • 증감 연산자 : 1씩 증가하거나 감소시키는 연산자
    • 전위형(prefix) :  값이 참조되기 전에 증가/감소시킴 ( ++i / --i )
    • 후위형(postfix) :  값이 참조된 후에 증가/감소시킴 ( i++ / i-- )
  • 사칙연산, 나머지 : +, -, * (곱셈), / (나눗셈), % (나머지)
    • 나누는 수가 0이면 에러 발생
    • 피연산자가 모두 int형인 나눗셈 식( / ) 은 나머지를 버린 정수 값만 결과로 나옴.
    • 나눗셈의 올바른 계산을 위해 float 타입으로 일치시킨 후에 연산을 수행해야 함.
    • 정수형, 실수형 모두 계산시 각 범위를 넘는 값이 나온다면 에러 (-> 더 큰 범위로 변경하기)
//부호 연산자
int i1 = -5;
int i2 = +i1; //-5 (i1 그대로 나옴)
int i3 = -i1; //5 (i1의 부호를 반대로)

//증감 연산자 
int i4 = ++i3; //6
int i5 = i3++; //6
int i6 = --i3; //6
int i7 = i3--; //6

//산술 연산
int i = 5;
int j = 2;
System.out.println(i +  j); //7
System.out.println(i -  j); //3
System.out.println(i *  j); //10
System.out.println(i /  j); //2
System.out.println((float)i /  (float)j); //2.500000
System.out.println(i %  j); //1
* 반올림 (Math.round())

소수점 첫째 자리에서 반올림한 결과를 정수로 반환 (10^n으로 적절히 곱하고 나누는 작업 필요)

비교 연산자

두 피연산자를 비교하는데 사용되는 연산자로 결과는 오직 true와 false 둘 중 하나이다.

  • 대소 비교(>, >=, <, <=) : boolean, 참조형을 제외한 자료형 모두 사용 가능
  • 등가 비교(==, !=) : 기본형과 참조형 각각 사용 가능하지만, 서로 형변환이 불가능하기 때문에 서로 비교 불가
  • 문자열(String) 비교 (== / !=, equals() )
    • == / != 연산자는 두 문자열이 모든 비교 사항이 완전히 같은 지를 비교
    • equals() 메서드는 내용이 같은지를 비교할 때 용이
int i = 10; // = 대입연산자 
int j = 10;    

// i 와 j 가 같은지 비교 하는 비교 연산자           
System.out.println(i == j ); //true
System.out.println(i == j ); //true
System.out.println(i != j ); //false
System.out.println(i < j); //false
System.out.println( i <= j); //true
System.out.println(i > j); //false
System.out.println(i >= j); //true

논리 연산자

논리 연산자는 논리곱( &&, & ) 논리합( ||, | ), 배타적 논리합 ( ^ ), 논리부정( ! ) 연산을 수행한다. 논리 연산자의 피연산자는 논리형(불린형)만 사용 가능하다. 결과 또한 불린값이다.

  • 논리곱(&&, &) : 피연산자가 모두 true일 경우에만 연산 결과가 true, 그 외는 false
  • 논리합( ||, | ) : 피연산자 중 하나만 true이면 연산 결과가 true, 피연산자 모두 false이면 false
  • 배타적 논리합( ^ ) : 피연산자가 서로 다른 값일 경우만 연산 결과가 true, 서로 같으면 false
  • 논리 부정( ! ) : 피연산자의 논리값을 바꿈. ( true <-> false )

연산 순서는 피연산자와 가까운 것부터 먼저 연산된다. 

대입 연산자

대입연산자의 연산 진행 방향은 오른쪽에서 왼쪽 => 좌측 피연산자는 값을 변경/저장할 수 있는 변수 등이 들어가고 우측 피연산자는 변수, 식, 상수 등 모두 가능하다.

  • 단순 대입 연산자 : 오른쪽에 있는 피연산자의 값을 왼쪽 피연산자의 변수에 저장
  • 복합 대입 연산자 : 정해진 연산을 수행한 후에 결과를 대입
i = 10; // 단순 대입 연산자
i += 10; // 복합 대입 연산자
// i = i + 10; 과 같은 연산 (i == 20)

조건 연산자 (삼항 연산자)

조건식 ? 피연산자1 : 피연산자2

조건식의 연산 결과가 true이면 결과는 피연산자1 이고, 조건식의 연산 결과가 false이면 결과는 피연산자2 (피연산자1, 피연산자2 에는 주로 값이 오지만, 경우에 따라 연산식이 올 수 있음.)

int b1 = (5 > 4) ? 50 : 40 ; //연산결과가 true이기 때문에 50이 b1에 들어감.

연산자 우선순위 ⭐

  1. 최우선연산자 ( ., [], () )
  2. 단항연산자 ( ++,--,!,~,+/-   : 부정, bit변환>부호>증감)
  3. 산술연산자 ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
  4. 비교연산자 ( >,<,>=,<=,==,!= )
  5. 비트연산자 ( &,|,,~ )
  6. 논리연산자 (&& , || , !) : 논리 연산자 중 and 연산과 or 연산이 나왔을 때 and 연산이 먼저 수행
  7. 삼항연산자 (조건식) ? :
  8. 대입연산자 =,*=,/=,%=,+=,-=

예시 1

int a = 5;
int b = 10;
int c = 5;
System.out.println( a-b*c );
//곱셈이 우선순위가 높기 때문에 b와 c를 먼저 곱하고 뺀다. 결과는 -45

예시 2

int a = 5;
System.out.println( ++a - 5);
//단항 연산자인 증감 연산자가 먼저이기 때문에 a가 6이 되고 5를 빼면 결과는 1

예시 3

int a = 5;
System.out.println(a++ - 5);
//단항 연산자이면서 후위 연산자인 ++ 가 나중에 연산되면서 a는 5인 상태에서 5를 빼게 되어 결과는 0
System.out.println(a);
//a++(a = a+1) 이 실행되므로 결과는 6

증감 연산자 경우 전위 연산자인지 후위 연산자 인지에 따라서 우선 순위가 바뀔 수 있다. ⭐

(전위 연산자 ++ 는 먼저 연산되지만, 후위 연산자 ++ 는 나중에 연산됨. )