본문 바로가기

개발 스토리/Java live study

Java 3주차 : 연산자

목표

자바가 제공하는 다양한 연산자를 학습하세요.


학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

산술 연산자

산술 연산자에는 사칙 연산자(+, -, *, /)와 나머지 연산자(%)가 있다. 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈연산자보다 우선순위가 높으므로 먼저 처리된다. 그리고 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 만일 0으로 나눈다면, 실행 시에 에러가 발생한다.

 

public class Main {

    public static void main(String[] args) {
        
        int a = 10;
        int b = 3;

        System.out.println("a + b = " + (a + b));
        System.out.println("a - b = " + (a - b));
        System.out.println("a * b = " + a * b);
        System.out.println("a / b = " + a / b);
        System.out.println("a % b = " + a % b);
    }
}
/** 출력
 * a + b = 13
 * a - b = 7
 * a * b = 30
 * a / b = 3
 * a % b = 1
 * */

비트 연산자

비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수를 표현했을 때의 각 자리를 아래의 규칙에 따라  연산을 수행한다. 피연산자로 실수는 허용하지 않는다.

 

  • | (OR연산자) - 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
  • & (AND연산자) - 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
  • ^ (XOR연산자) - 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
  • ~ (NOT연산자) - 0은 1로, 1은 0으로 바꾼다.
x y x | y x & y x ^ y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0
x ~x
1 0
0 1

 


관계 연산자

관계 연산자는 두 피연산자를 비교하는데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 ture와 false 둘 중의 하나이다.

 

비교연산자 연산결과
> 좌변 값이 크면, true 아니면 false
< 좌변 값이 작으면, true 아니면 false
>= 좌변 값이 크거나 같으면, true 아니면 false
<= 좌변 값이 작거나 같으면, true 아니면 false
== 두 값이 같으면, true 아니면 false
!= 두 값이 다르면, true 아니면 false

 

public class Main {

    public static void main(String[] args) {
        
        int a = 10;
        int b = 3;

        System.out.println("a > b = " + (a > b));
        System.out.println("a < b = " + (a < b));
        System.out.println("a >= b = " + (a >= b));
        System.out.println("a <= b = " + (a <= b));
        System.out.println("a == b = " + (a == b));
        System.out.println("a != b = " + (a != b));
    }
}
/** 출력
 a > b = true
 a < b = false
 a >= b = true
 a <= b = false
 a == b = false
 a != b = true
 * */

논리 연산자

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

 

  • || (OR결합) - 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
  • && (AND결합) - 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
  • ! (부정연산자) - 피연산자가 true이면 false를, false면 true를 결과로 반환한다.
x y x || y x && y
true true true true
true false true false
false true true false
false false false false

 

x !x
true false
false true

 

public class Main {

    public static void main(String[] args) {
        
        boolean a = true;
        boolean b = false;

        if (a && b) {
            System.out.println("a 와 b 모두 true입니다.");
        }

        if (a || b) {
            System.out.println("a 와 b 둘 중 하나는 true입니다.");
        }

        if (!b) {
            System.out.println("!b의 결과는 true입니다.");
        }
    }
}
/** 출력
 a 와 b 둘 중 하나는 true입니다.
 !b의 결과는 true입니다.
 * */

instanceof

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof연산자를 사용한다. 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 연산의 결과로 boolean값인 true와 false 중의 하나를 반환한다.

 

public class Main {

    public static void main(String[] args) {

        ElectricCar ec = new ElectricCar();

        if (ec instanceof ElectricCar) {
            System.out.println("This is a ElectricCar instance.");
        }

        if (ec instanceof Car) {
            System.out.println("This is a Car instance.");
        }

        if (ec instanceof Object) {
            System.out.println("This is a Object instance.");
        }

    }
}

class Car {}
class ElectricCar extends Car {}

/** 출력
 This is a ElectricCar instance.
 This is a Car instance.
 This is a Object instance.
 * */

assignment(=) operator (대입연산자)

대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산들의 결합 방향은 오른쪽에서 왼쪽입니다. 또한, 자바에서는 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입 연산자를 제공합니다.

 

대입 연산자 설명
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에서 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
&= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
|= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
^= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
<<= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
>>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.

화살표(->) 연산자

화살표 연산자는 람다 표현식이다. 람다 표현식이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다.

 

// 메소드
int min(int x, int y) {
	return x < y ? x : y;
}

// 람다 표현식
(x, y) -> x < y ? x: y

 

위의 예제처럼 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있습니다.

그런데 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 합니다. 따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있습니다.

 

// 람다 표현식
(x, y) -> x < y ? x : y;

// 익명 클래스
new Object() {
	int min(int x, int y) {
    	return x < y ? x : y;
    }
}

 

이러한 람다 표현식은 메소드의 매개변수로 전달될 수도 있으며, 메소드의 결괏값으로 반환될 수도 있습니다. 따라서 람다 표현식을 사용하면, 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여줍니다. Java SE 8부터는 이러한 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었습니다.


삼항 연산자

삼항 연산자는 피연산자를 세 개나 가지는 조건 연산자입니다.

삼항 연산자의 문법은 다음과 같습니다.

 

조건식 ? 반환값1 : 반환값2

 

물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환합니다.

 

int x = 5;
int y = 3;
int result;

result = x > y ? x : y;
// result = 5;

// 과정
result = (5 > 3) ? 5 : 3;
result = (true) ? 5 : 3;
result = 5;

연산자 우선순위

종류 연산자 우선순위
단항 연산자 ++    --    +    -    ~   ! 높음
산술 연산자 *   /   %  
+   -
<<   >>
비교 연산자 <   >   <=   >=   instanceof
 
논리 연산자 &
^
|
&&
||
삼항 연산자 ?:
대입 연산자 =    +=   -=   *=   /=   %=
<<=   >>=   &=   ^=   |=
낮음

 

- 참고 자료

자바의 정석

www.tcpschool.com/java/java_operator_assignment

www.tcpschool.com/java/java_lambda_concept

www.tcpschool.com/java/java_operator_etc