[Java] 연산자

김용준·2022년 8월 24일
0

Java Basic

목록 보기
7/22

연산자란?

연산자는 '연산을 수행하는 기호'이다. 피연산자는 연산의 대상이다.
그래서 연산자는 연산을 수행한 후 반드시 결과값을 반환한다.

y = x + 6

위와 같은 식에서 +는 덧셈 연산자이고 =는 대입 연산자이다.

덧셈 연산자는 두 값을 더한 결과를 반환하므로, 두 개의 피연산자를 필요로 한다. 따라서 x6이 피연산자이다. 대입 연산자는 우변의 값을 좌변에 저장하고 저장된 값을 연산결과로 반환한다. 그러므로 x+6의 결과값인 한 개의 피연산자를 갖는다.

이처럼 피연산자의 개수에 따라 '단항 연산자', '이항 연산자', '삼항 연산자'로 구분한다. 아래에 설명할 대입 연산자와 증감 연산자가 단항 연산자이고, 조건 연산자가 삼항 연산자이다. 그 외 연산자들은 모두 이항 연산자이다.

산술연산자

사칙연산과 나머지연산을 수행하여 그 결과값을 반환한다.

연산자설명
+덧셈연산을 수행한다
-뺄셈연산을 수행한다
*곱셈연산을 수행한다
/나눗셈연산을 수행한다
%나머지연산을 수행한다
int a = 10
int b = 3

int c1 = a + b // c1의 값은 13이다.
int c2 = a - b // c2의 값은 7이다.
int c3 = a*b   // c3의 값은 30이다.
int c4 = a/b   // c4의 값은 3이다.
int c5 = a%b   // c5의 값은 1이다.

대입연산자

오른쪽의 값을 왼쪽에 대입한다.

연산자설명
=오른쪽의 값을 왼쪽에 대입한다.
+=더한 값을 대입한다.
-=뺀 값을 대입한다.
*=곱한 값을 대입한다.
/=나눈 값을 대입한다.
%=나머지 값을 대입한다.
int a = 10
int b = 10
int c = 10
int d = 10
int e = 10

a += 10  // a의 값은 20이다.
b -= 10  // b의 값은 0이다.
c *= 3   // c의 값은 30이다.
d /= 3   // d의 값은 3이다.
e % = 3  // e의 값은 1이다.

증감연산자

변수의 값을 1증가시키거나 1감소시킨다.

연산자설명
++변수의 값을 1증가시킨다.
--변수의 값을 1감소시킨다.
int a = 10
int b = 10

a++    // a의 값은 11이다.
b--    // b의 값은 9다.

++a    // a의 값은 12다.
--b    // b의 값은 8이다.

증감 연산자가 피연산자의 왼쪽에 위치하면 '전위형', 오른쪽에 위치하면 '후위형'이다. 증감 연산자의 위치에 따라 결과값에 차이가 있다. 다음의 예제를 보자

public class Op {

	public static void main(String[] args) {
		
		int i = 5;
		int j = 0;
		
		j = i++;
		System.out.println(i); // i는 6 출력
        System.out.println(j); // j는 5 출력
		
		i = 5; 
		j = 0;
		
		j = ++i;
		System.out.println(i); // i는 6 출력
        System.out.println(j); // j는 6 출력
	}
}

출력을 보면 i값은 두 경우 모두 1이 증가되어 같지만 j값은 그렇지 않다. 전위형은 피연산자의 값(i)을 먼저 증가시킨 후 j에 대입하지만, 후위형은 먼저 ji의 값을 대입시킨 후 i를 증가시킨다.

비교연산자.

두 값을 비교해서 비교 결과를 boolean 타입의 값으로 반환한다.

연산자설명
>좌항의 값이 우항의 값보다 크면 연산결과는 true다.
>=좌항의 값이 우항의 값보다 크거나 같으면 연산결과는 true다.
<좌항의 값이 우항의 값보다 작으면 연산결과는 true다.
<=좌항의 값이 우항의 값보다 작거나 같으면 연산결과는 true다.
==좌항의 값이 우항의 값과 서로 일치하면 연산결과는 true다.
!=좌항의 값이 우항의 값과 서로 일치하지 않으면 연산결과는 true다.
int a = 3
int b = 3
int c = 5

boolean result1 = a > b    // result1의 값은 false다.
boolean result2 = a >= b   // result2의 값은 true다.
boolean result3 = a < c    // result3의 값은 true다.
boolean result4 = a <= c   // result4의 값은 true다.
boolean result5 = a == b   // result5의 값은 true다.
boolean result6 = a == c   // result6의 값은 false다.
boolean result7 = a != b   // result7의 값은 false다.
boolean result8 = a != c   // result8의 값은 true다.

문자열의 비교

두 문자열을 비교할 때는, 비교 연산자 == 대신 equals()메소드를 사용하는게 좋다. 이유는 ==equals()메서드의 비교 방식이 다르기 때문이다. 어떤 방법을 사용하느냐에 따라 같은 문자열을 비교해도 결과값이 달라진다. 더 자세한 내용은 뒤에서 배우게 될테니 일단 넘어가도록 한다.

public class OpApp {

	public static void main(String[] args) {
	
		String str1 = "abc";
		String str2 = "abc";
		String str3 = new String("abc");
		
		
		boolean result1 = str1 == str2;
		boolean result2 = str1 == str3;
		boolean result3 = str1.equals(str3);
		
		System.out.println(result1); // true
		System.out.println(result2); // false
		System.out.println(result3); // true
	}
}

논리연산자

논리곱, 논리합, 논리부정에 대한 연산을 수행하여 결과를 boolean타입의 값으로 반환한다. 피연산자로 boolean타입 또는 boolean타입을 결과로하는 조건식만을 허용한다. 일반적으로 명제논리에서 쓰이는 것과 같이 사용한다.

연산자설명
&&AND (논리곱)
||OR (논리합)
!NOT (부정)
^XOR (배타적 논리합)
public class OpApp {

	public static void main(String[] args) {

		// 유상수리 여부는 운행거리가 50000km을 초과하거나 사용기간이 3년 이상인 차량으로 한다.
		int distance = 35000; // 운행거리(km)
		int usedYear = 3;     // 사용기간(년)

		boolean result = distince > 50000 || usedYear >= 3;
        // result에 true가 대입된다.
		System.out.println("유상수리 여부: " + result);
        // "유상수리 여부: true"가 출력된다.
	}
}

다음은 논리 연산자를 사용할 때 주의해야 할 점들이다.

x는 10보다 크고, 20보다 작다.

두 조건문이 AND로 연결되었으므로 다음과 같이 쓸 수 있다.
x > 10 && x < 20 또는 10 < x && x < 20.

보통은 변수를 왼쪽에 쓰지만 두 번째 식처럼 표현하는게 가독성이 좋다. 그러나 두 번째 식에서 논리연산자를 생략하고 10 < x < 20와 같이 표현하는 것은 허용되지 않는다.

i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.

OR로 연결된 두 조건문에 AND로 다른 하나의 조건문이 결합된 문장이다. 이 문장은 다음과 같이 표현할 수 있다.

(i%2==0 || i%3==0) && i%6!=0.

만일 앞의 두 조건을 괄호로 묶지 않으면 &&를 먼저 연산한다. &&||보다 우선순위가 높기 때문이다.

조건 연산자

제시된 조건식이 true 혹은 false 중에서 무엇으로 판정되느냐에 따라 연산결과값이 달라지는 연산자다.

조건 연산자

	변수 = 조건식 ? 값1 : 값2;
    
      * 조건식이 true으로 판정되면 값1을 반환하고 변수에 대입한다.
      * 조건식이 false로 판정되면 값2를 반환하고 변수에 대입한다.
public class OpApp {

	public static void main(String[] args) {

	      int score = 90;
	      String result = score >= 60 ? "합격" : "불합격";
          // result에는 "합격"이 대입된다.
	      System.out.println("판정결과: " + result);
          // "판정결과: 합격"이 출력된다. 
	}
}

우선순위

식에 사용된 연산자가 둘 이상인 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다. 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높다는 것은 상식적으로 알고 있는 내용이다. 아래의 표를 통해 확인해보자.

산술 연산자의 우선순위를 나타내기 위한 관례(Convention)는 다음과 같다.
(*, /, %)(+, -)보다 우선순위가 높음을 나타낸다.

  • x + y
  • x - y
  • x*y
  • x/y
  • x%y

결합규칙

하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 결합규칙에 따라 연산을 수행한다.

(a) 3 + 4 - 5
(b) x = y = 3

식 (a)의 산술 연산자의 결합규칙은 왼쪽에서 오른쪽이다. 따라서 3+4를 먼저 계산하고 그 결과인 75와 뺄셈한다.

식 (b)의 대입 연산자는 결합규칙이 오른쪽에서 왼쪽이다. 따라서 y=3이 먼저 수행되어 y3이 저장된 후, x=3이 수행되어 x3이 저장된다.

우선순위와 결합규칙을 정리하면 다음과 같다.

  • 산술 > 비교 > 논리 > 대입
  • 단항 > 이항 > 삼항
  • 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
profile
차선이 모여 최선이 된다.

0개의 댓글