Java

연산자(Operator) - 연산자(operator) & 단항 연산자

제주니어 2022. 8. 17. 22:00

연산자(operator) 

1. 연산자와 피연산자

  • 연산자(operator) : 연산을 수행하는 기호 (+,-,*,/ 등)
  • 피연산자(operand) : 연산자의 작업 대상 (변수, 상수, 리터럴, 수식)
  • 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.

2. 식(式)과 대입연산자

  • 식(式) : 연산자와 피연산자를 조합하여 계산하고자하는 바를 표현하는 것.
  • 식을 평가(evalution)한다 : 식을 계산하여 결과를 얻는 것.

3. 연산자의 종류

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

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

  • 식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다.
    • 단항 연산자가 이항 연산자보다 우선순위가 높다
    • 곱셈과 나눗셈이 덧셈과 뻴셈보다 우선순위가 높다
    • 비교 연산자(>)보다 산술 연산자(+-)가 먼저 수행된다.
    • 논리 연산자(&&)보다 비교 연산자가 먼저 수행된다.
    • 대입 연산자는 연산자 중에서 제일 우선순위가 낮다.
    • 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮다.
    • 비트 연산자(&)는 비교 연산자(==)보다 우선순위가 낮다.
    • 논리 연산자 중에서 AND를 의미하는 ‘&’와 ‘&&’가 OR를 의미하는 ‘|’와 ‘||’보다 우선순위가 높다.
    • 수식에 AND와 OR가 함께 사용되는 경우는 괄호를 사용해서 우선순위를 명확히 하는 것이 좋다.
  • 연산자의 결합규칙
    • 연산자마다 다르지만 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자(=)와 그 반대로, 오른쪽에서 왼쪽의 순서로, 연산을 수행한다.
    • 산술 > 비교 > 논리 > 대입, 대입은 제일 마지막에 수행된다.
    • 단항(1) > 이항(2) > 삼항(3). 단항 연산자와 우선순위가 이항 연산자보다 높다.
    • 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향을 왼쪽에서 오른쪽이다.

5. 산술 변환(usual arithmetic conversion)

  • 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르면 연산 전에 형변환 연산자로 타입을 일치시켜야 한다.
  • 대부분의 경우, 작은 타입으로 형변환하면 원래의 값을 손실될 가능성이 있기 때문에 두 피연사의 타입 중에서 더 큰 타입으로 일치시킨다.
  • 작은 타입 → 큰 타입 : 자동 형변환, 형변환 연산자를 생략할 수 있다.
  • 규칙
    • 두 연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
long + int → long + long → long
float + int → float + float → float
double + float → double + double → double
    • 피연산자의 타입이 int 보다 작은 타입이면 int 로 변환한다.
      • byte + short → int + int → int
      • char + short → int + int → int

단항 연산자

1. 증감 연산자 ++, - -

  • 증가 연산자(++) : 피연산자의 값을 1 증가시킨다.
  • 감소 연산자(- -) : 피연산자의 값을 1 감소시킨다.
  • 전위형 : 값이 참조되기 전에 증가시킨다. ex) ++i;
  • 후위형 : 값이 참조된 후에 증가시킨다. ex) i++;
  • 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없다.
[표현식]
(증감 연산자)값; 또는 값(증감 연산자);
▶ 증감 연산자는 피연산자의 값은 1 증가시키거나 1 감소시키는 연산자이다.
▶ ++ : 피연산자의 값을 1 증가시키는 연산자 (++값; 또는 값++;)
▶ -- : 피연산자의 값을 1 감소시키는 연산자 (--값; 또는 값--;)
▶ (증감 연산자)값 : 전위 연산으로 먼저 증감 연산을 수행하고 다른 연산을 수행한다.
▶ 값(증감 연산자) : 후위 연산으로 먼저 다른 연산을 수행하고 증감 연산을 수행한다.

 

public class B_inDecrease {
	
	public void method1() {
		int num = 10;
		// 전위 연산 테스트
		System.out.println("전위 연산자 적용 전 num의 값: " + num); // 10
		System.err.println("1회 수행 후 값 : " + ++num); // 11 (num = num + 1)
		System.err.println("2회 수행 후 값 : " + ++num); // 12 (num = num + 1)
		System.err.println("3회 수행 후 값 : " + ++num); // 13 (num = num + 1)
		System.out.println("전위 연산자 적용 후 num의 값: " + num); // 13
		System.out.println();
		
		// 후위 연산자 테스트
		System.out.println("후위 연산자 적용 전 num의 값: " + num); // 13
		System.err.println("1회 수행 후 값 : " + num++); // 13(14)
		System.err.println("2회 수행 후 값 : " + num++); // 14(15)
		System.err.println("3회 수행 후 값 : " + num++); // 15(16)
		System.out.println("전위 연산자 적용 후 num의 값: " + num); // 16
	}
	public void method2() {
		int num = 20;
		int num1 = 10;
		int num2 = 20;
		int num3 = 30;
		int result = num++ * 3; // 20 * 3 = 60 -> 20 + 1 = 21
		
		System.out.println("num : " + num); // 21
		System.out.println("result : " + result); // 60
		
		System.out.println(num1++); // 10(11)
		System.out.println((++num1) + (num2++)); // 12 + 20(21) = 32
		System.out.println((num1++) + (--num2) + (--num3)); // 12(13) + 20 + 29 = 61
		
		System.out.println("num1 : " + num1); // 13
		System.out.println("num2 : " + num2); // 20 
		System.out.println("num3 : " + num3); // 29
	}
}

2. 부호 연산자 + -

  • 부호 연산자’-’는 피연산자의 부호를 반대로 변경한 결과를 반환한다.
  • 부호 연산자’+’는 하는 일이 없으며, 쓰이는 경우도 거의 없다.
  • 부호 연산자는 boolean형과 char형을 제외한 기본형에만 사용할 수 있다.
int num = -10;