본문 바로가기
[JAVA]

[처음부터 다시 하는 JAVA] 연산자

by 북방바다코끼리표범 2024. 1. 7.

처음부터 다시 하는 자바 공부는 인프런의 김영한 강사님의 강의를 참고해서 공부했다.

 

산술 연산자

연산자 시작
+ , - , * , / 와 같이 계산을 수행하는 기호를 연산자라 한다. 자바에는 다음과 같은 다양한 연산자가 있다. 

참고로 더 많은 연산자가 있지만, 여기서는 실무에서 주로 다루는 연산자 위주로 설명해주셨다.

 

연산자 종류

  • 산술 연산자: + , - , * , / , % (나머지 연산자) 
  • 증감(증가 및 감소) 연산자: ++ , --
  • 비교 연산자: == , != , > , < , >= , <= 
  • 논리 연산자: &&  (AND), ||  (OR), !  (NOT) 
  • 대입 연산자: = , += , -= , *= , /= , %= 
  • 삼항 연산자: ? :

연산자와 피연산자

3 + 4 
a + b

  • 연산자(operator): 연산 기호 - 예) + , - 
  • 피연산자(operand): 연산 대상 - 예) 3 , 4 , a , b

 

연산자 우선순위

수학에서 1 + 2 * 3 의 연산 결과는 무엇일까? 덧셈보다 곱셈이 우선순위가 더 높다. 

자바도 수학과 동일하다.

package operator; 

public class Operator4 {
	public static void main(String[] args) {
        int sum3 = 2 * 2 + 3 * 3; //(2 * 2) + (3 * 3) 
        int sum4 = (2 * 2) + (3 * 3); //sum3과 같다.
        System.out.println("sum3 = " + sum3); //sum3 = 13
        System.out.println("sum4 = " + sum4); //sum4 = 13
	}
}
실행 결과
sum3 = 13
sum4 = 13

연산자 우선순위가 애매하거나 조금이라도 복잡하다면 언제나 괄호를 고려하자!

 

연산자 우선순위 암기법
자바는 다음과 같은 연산자 우선순위가 있다. 높은 것에서 낮은 순으로 적었다. 

처음에 나오는 괄호() 가 우선순위가 가장 높고, 마지막의 대입 연산자( = )가 우선순위가 가장 낮다.

1.   괄호 ()
2.   단항 연산자 (예: ++ , -- , ! , ~ , new , (type) )
3.   산술 연산자 ( * , / , % 우선, 그 다음에 + , - )
4.   Shift 연산자 ( << , >> , >>> )
5.   비교 연산자 ( < , <= , > , >= , instanceof )
6.   등식 연산자 ( == , != )
7.   비트 연산자 ( & , ^ , | )
8.   논리 연산자 ( && , || )
9.   삼항 연산자 ( ? : )

10.  대입 연산자 ( = , += , -= , *= , /= , %= 등등)

 

그러면 이 많은 우선순위를 어떻게 외워야 할까? 사실 대부분의 실무 개발자들은 연산자 우선순위를 외우지 않는다고 함. 
연산자 우선순위는 딱 2가지만 기억하면 된다.

 

1. 상식선에서 우선순위를 사용하자
우선순위는 상식선에서 생각하면 대부분 문제가 없다.

 

2. 애매하면 괄호()를 사용하자

코드를 딱 보았을 때 연산자 우선순위를 고민해야 할 것 같으면, 그러니까 뭔가 복잡해보이면 나 뿐만 아니라 모든 사람이 그렇게 느낀다. 이때는 다음과 같이 괄호를 사용해서 우선순위를 명시적으로 지정하면 된다.

 

정리

  • 연산자 우선순위는 상식선에서 생각하고, 애매하면 괄호를 사용하자
  • 누구나 코드를 보고 쉽고 명확하게 이해할 수 있어야 한다. 개발자들이 연산자 우선순위를 외우고 개발하는 것이 
    아니다! 복잡하면 명확하게 괄호를 넣어라!
  • 개발에서 가장 중요한 것은 단순함과 명확함이다! 애매하거나 복잡하면 안된다.

기본 산술 연산자는 많이 학습했기 때문에 넘겼지만 증감 연산자는 헷갈리는 부분이 있을 수 있기 때문에 정리했다.

 

증감 연산자

증가 및 감소 연산자를 줄여서 증감 연산자라 한다.
증감 연산자는 ++ 와 -- 로 표현되며, 이들은 변수의 값을 1만큼 증가시키거나 감소시킨다.
프로그래밍에서는 값을 1씩 증가하거나 1씩 감소할 때가 아주 많기 때문에 이런 편의 기능을 제공한다.

package operator;

public class OperatorAdd1 {
	public static void main(String[] args) { 
		int a = 0;
        a = a + 1;
		System.out.println("a = " + a); //1
        a = a + 1;
		System.out.println("a = " + a); //2 

        //증감 연산자
        ++a; //a = a + 1
        System.out.println("a = " + a); //3 
        ++a; //a = a + 1
        System.out.println("a = " + a); //4
    } 
}

실행 결과
a = 1 
a = 2 
a = 3 
a = 4

코드는 다음과 같이 수행된다.

//a = 0 
a = a + 1
a = 0 + 1 //변수 a의 값 확인(0) 
a = 1

//a = 1 
a = a + 1
a = 1 + 1 //변수 a의 값 확인(1) 
a = 2

 

a = a + 1 을 ++a 로 간단히 표현할 수 있는 것이 바로 증감 연산자이다. 
정리하면 해당 변수에 들어있는 숫자 값을 하나 증가하는 것이다.
++  (증가), --  (감소)
값을 하나 감소할 때는 --a 와 같이 표현하면 된다. 이것은 a = a - 1 이 된다.

 

전위, 후위 증감연산자
증감 연산자는 피연산자 앞에 두거나 뒤에 둘 수 있으며, 연산자의 위치에 따라 연산이 수행되는 시점이 달라진다.

  • ++a : 증감 연산자를 피연산자 앞에 둘 수 있다. 이것을 앞에 있다고 해서 전위(Prefix) 증감 연산자라 한다. 
  • a++ : 증감 연산자를 피연산자 뒤에 둘 수 있다. 이것을 뒤에 있다고 해서 후위(Postfix) 증감 연산자라 한다.

a = 1, b = 0
b = ++a //전위 증감 연산자

 

a = a + 1 //a의 증감 연산이 먼저 진행, a = 2 
b = a //이후에 a를 대입 b = 2
결과: a = 2, b = 2

a = 1, b = 0
b = a++ //후위 증감 연산자

b = a; //a의 값을 먼저 b에 대입 b = 1 
a = a + 1; //이후에 a의 값을 증가 a = 2

결과: a = 2, b = 1
참고로 다음과 같이 증감 연산자를 단독으로 사용하는 경우에는 다른 연산이 없기 때문에, 본인의 값만 증가한다.
따라서 전위이든 후위이든 둘다 결과가 같다.

 

 

비교 연산자

비교 연산자는 두 값을 비교하는 데 사용한다. 비교 연산자는 주로 뒤에서 설명하는 조건문과 함께 사용한다.

 

비교 연산자

  • ==  : 동등성 (equal to) 
  • !=  : 불일치 (not equal to)
  • >   : 크다 (greater than) 
  • <   : 작다 (less than)
  • >=  : 크거나 같다 (greater than or equal to) 
  • <=  : 작거나 같다 (less than or equal to)

 

비교 연산자를 사용하면 참( true ) 또는 거짓( false )이라는 결과가 나온다. 참 거짓은 boolean 형을 사용한다. 

 

여기서 주의할 점은 = 와 == ( = x2)이 다르다는 점이다.

  • = : 대입 연산자, 변수에 값을 대입한다. 
  • == : 동등한지 확인하는 비교 연산자

불일치 연산자는 != 를 사용한다. ! 는 반대라는 뜻이다.

 

문자열 비교
문자열이 같은지 비교할 때는 == 이 아니라 .equals() 메서드를 사용해야 한다.
== 를 사용하면 성공할 때도 있지만 실패할 때도 있다. 지금은 이 부분을 이해하기 어려우므로 지금은 단순히 문자열의 비교는 .equals() 메서드를 사용해야 한다 정도로 알고 있자, 자세한 내용은 별도로 다룬다.

 

논리 연산자

논리 연산자는 boolean 형인 true , false 를 비교하는데 사용한다.

 

논리 연산자

  • &&  (그리고) : 두 피연산자가 모두 참이면 참을 반환, 둘중 하나라도 거짓이면 거짓을 반환 
  • ||  (또는) : 두 피연산자 중 하나라도 참이면 참을 반환, 둘다 거짓이면 거짓을 반환
  • !  (부정) : 피연산자의 논리적 부정을 반환. 즉, 참이면 거짓을, 거짓이면 참을 반환
package operator; 

public class Logical1 {
	public static void main(String[] args) {
        System.out.println("&&: AND 연산");
        System.out.println(true && true); //true
        System.out.println(true && false);//false
        System.out.println(false && false);//false

		System.out.println("||: OR 연산");
		System.out.println(true || true); //true
		System.out.println(true || false);//true
		System.out.println(false || false);//false

        System.out.println("! 연산");
        System.out.println(!true); //false
        System.out.println(!false); //true

        System.out.println("변수 활용"); 
        boolean a = true;
        boolean b = false;
        System.out.println(a && b); // false
        System.out.println(a || b); // true
        System.out.println(!a);     // false
        System.out.println(!b);     // true
    } 
}

논리 연산자 활용
	public static void main(String[] args) { 
        int a = 15;
        //a는 10보다 크고 20보다 작다
        boolean result = a > 10 && a < 20; //(a > 10) && (a < 20) 
        System.out.println("result = " + result);
    }
  • && : 두 피연산자가 모두 참이어야 true 를 반환한다. 둘중 하나라도 거짓이면 false 를 반환한다. 
  • || : 두 피연산자 중 하나라도 참이면 true 를 반환한다. 둘다 모두 거짓이면 false 를 반환한다. 
  • ! : 피연산자의 논리적 부정을 반환한다. 참이면 거짓을, 거짓이면 참을 반환한다.

 

  • a && b 는 false 를 반환한다. 왜냐하면 둘 중 하나인 b 가 거짓이기 때문이다. 
  • a || b 는 true 를 반환한다. 왜냐하면 둘 중 하나인 a 가 참이기 때문이다. 
  • !a 와 !b 는 각각의 논리적 부정을 반환한다

대입 연산자

대입 연산자
대입 연산자( = )는 값을 변수에 할당하는 연산자다. 이 연산자를 사용하면 변수에 값을 할당할 수 있다. 
예를 들어, int a = 1 는 a 라는 변수에 1 이라는 값을 할당한다.


축약(복합) 대입 연산자
산술 연산자와 대입 연산자를 한번에 축약해서 사용할 수 있는데, 이것을 축약(복합) 대입 연산자라 한다. 
연산자 종류: += , -= , *= , /= , %=

 

이 연산자는 연산과 대입을 한번에 축약해서 처리한다. 다음 왼쪽과 오른쪽의 결과는 같다. 
i = i + 3  i += 3

i = i * 4  i *= 4

 

 

정리
자주 사용하는 연산자

  • 산술 연산자: + , - , * , / , %  (나머지)
  • 증가 및 감소 연산자: ++ , --
  • 비교 연산자: == , != , > , < , >= , <=
  • 논리 연산자: &&  (AND), ||  (OR), !  (NOT) 
  • 대입 연산자: = , += , -= , *= , /= , %=

다음 연산자들도 자주 사용하는데, 뒷 부분에서 학습한다

  • 삼항 연산자: ? :
  • instanceof 연산자: 객체 타입을 확인한다.
  • 그외: new , []  (배열 인덱스), .  (객체 멤버 접근), ()  (메소드 호출) 

비트 연산자는 실무에서 거의 사용할 일이 없다. 필요할 때 찾아보자.

  • 비트 연산자: & , | , ^ , ~ , << , >> , >>>