연산자

이기영·2024년 5월 26일

Java 기초학습

목록 보기
3/14

목표

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

목차

1. 산술 연산자
2. 비트 연산자
3. 관계 연산자
4. 논리 연산자
5. instanceof
6. assignment(=) operator
7. 화살표(->) 연산자
8. 3항 연산자
9. 연산자 우선 순위
10. (optional) Java 13. switch 연산자


1. 산술 연산자

산술 연산을 수행하는 연산자입니다.

  산술 연산자의 종류: +, -, *, /, %
특히 나눗셈 연산자의 경우 두 피연산자가 정수인 경우에는 정수형 나눗셈이, 실수인 경우에는 실수형 나눗셈이 진행됩니다.

  추가로 증가연산자(++) 감소연산자(--) 가 있습니다.
값을 1씩 증가하거나 감소시키는데, 이 연산자의 위치에 따라 조금 사용법이 다릅니다. 앞에 붙게되면 증/감 후 연산수행하고, 뒤에 붙게되면 연산후 증/감 됩니다.



2. 비트 연산자

비트 연산자는 정수형 데이터의 개별 비트를 직접 조작하는 데 사용됩니다. Java에서 제공하는 주요 비트 연산자는 다음과 같습니다

연산자설명예제
비트 AND (&)두 비트가 모두 1일 때만 1을 반환합니다.int result = a & b;
비트 OR (\|)두 비트 중 하나라도 1이면 1을 반환합니다.int result = a \| b;
비트 XOR (^)두 비트가 다를 때만 1을 반환합니다.int result = a ^ b;
비트 NOT (~)비트의 값을 반전시킵니다 (0을 1로, 1을 0으로).int result = ~a;
왼쪽 시프트 (<<)비트를 왼쪽으로 이동시키고, 오른쪽에 0을 채웁니다.int result = a << 2; (a의 비트를 왼쪽으로 2칸 이동)
오른쪽 시프트 (>>)비트를 오른쪽으로 이동시키고, 왼쪽에 부호 비트를 채웁니다.int result = a >> 2; (a의 비트를 오른쪽으로 2칸 이동)
부호 없는 오른쪽 시프트 (>>>)비트를 오른쪽으로 이동시키고, 왼쪽에 0을 채웁니다.int result = a >>> 2; (a의 비트를 오른쪽으로 2칸 이동)

  이 연산자들은 정수 값을 비트 수준에서 조작할 때 유용하며, 특정 비트 패턴을 빠르게 계산하거나 확인하는 데 자주 사용됩니다.



3. 관계 연산자

관계 연산자는 두 피연산자 간의 관계를 비교하는 데 사용됩니다. Java에서 제공하는 주요 관계연산자는 다음과 같습니다.

연산자설명예제
==두 피연산자가 서로 같으면 true를 반환합니다.if (a == b)
!=두 피연산자가 서로 다르면 true를 반환합니다.if (a != b)
>왼쪽 피연산자가 오른쪽 피연산자보다 크면 true를 반환합니다.if (a > b)
<왼쪽 피연산자가 오른쪽 피연산자보다 작으면 true를 반환합니다.if (a < b)
>=왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 true를 반환합니다.if (a >= b)
<=왼쪽 피연산자가 오른쪽 피연산자보다 작거나 같으면 true를 반환합니다.if (a <= b)

  주로 조건문과 함께 사용되며, 두 값의 관계를 판단하여 프름을 제어하는데 유용합니다.



4. 논리 연산자

논리식의 결과에 따라 true, 또는 false를 반환하는 연산자 입니다.

연산자의 종류 : &&, ||, !

피연산자1피연산자2연산 결과 ( && )
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse


피연산자1피연산자2연산 결과 ( || )
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

주의 할점

public class Operator {
    public static void main(String[] args){
        int num1 = 0;
        int num2 = 0;
        boolean result;

        result = ((num1 += 10) < 0) && ((num2 += 10) > 0);
        System.out.println("num1: "+num1+" num2: "+num2 + " result: " + result);
        // 실행 결과: num1: 10 num2: 0 result: false
    }
}

  num1과 num2가 모두 10이 되어야 할것같지만, 실제로 num1은 10, num2는 0의 결과를 리턴합니다.


왜 그럴까?

  이유는 연산의 특성중 Short-Circuit Evaluation(SCE)에서 이유를 찾을 수 있습니다.

  ((num1 += 10) < 0) && ((num2 += 10) > 0) 이 연산을 진행할 때, &&의 왼편에 있는 연산이 먼저 실행되는데, 이때 num1은 증가합니다. 그리고 < 연산결과는 false이므로 아래와 같다고 볼 수있습니다.

false && ((num2 += 10) > 0)

  &&의 오른쪽 연산을 진행해야하지만, &&의 이전에 false가 왔기때문에, 오른쪽의 결과가 어떻든간에 result는 false가 됩니다.

그렇기 때문에 오른쪽을 비교할 필요가 없습니다.

  여기서 SCE의 특성이 나오는데, 정리하자면 아래와 같습니다.

  • &&의 왼쪽 피연산자가 false이면, 오른쪽 피연산자는 확인하지 않는다.
  • ||의 왼쪽 피연산자가 true이면, 오른쪽 피연산자는 확인하지 않는다.


5. instanceof

  instanceof는 객체가 특정 클래스의 인스턴스인지를 확인하는데 사용되는 연산자 입니다. 리턴값은 true, false 입니다.

예시 코드

class Animal {
    // Animal 클래스 구현 내용
}

class Dog extends Animal {
    // Dog 클래스 구현 내용
}

class Cat extends Animal {
    // Cat 클래스 구현 내용
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        System.out.println(animal1 instanceof Dog); // true
        System.out.println(animal2 instanceof Dog); // false
        System.out.println(animal2 instanceof Cat); // true
    }
}
  • Animal1은 Dog의 클래스의 인스턴스 이므로 true를 반환합니다.
  • 그러나 animal2는 Cat의 인스턴스이므로 false를 반환합니다.
  • 마지막은 물론 animal2는 Cat이므로 true입니다.


6. assignment(=) operator

할당(대입) 연산자 =는 값을 할당하는데 사용됩니다. 왼쪽 피연산자에 오른쪽 피연산자 값을 할당합니다.

int x = 10;             // 정수 값 할당
double y = 3.14;        // 실수 값 할당
char c = 'A';           // 문자 값 할당
boolean flag = true;    // 논리 값 할당
String name = "Lee";    // 문자열 값 할당


7. 화살표(->) 연산자

화살표(->) 연산자는 람다 표현식에서 사용됩니다. 람다 표현식은 함수형 프로그래밍의 핵심 개념으로, 익명 함수를 간결하게 표현하는 방법입니다. Java8부터 도입되었습니다.

사용 방법

(parameters) -> expression
// 또는
(parameters) -> { statements; }

  매개변수를 본문(하나의 표현식이거나 여러 문장의 블록)에 연결합니다.

예시 코드

Comparator<Integer> comparator = new Comparator<Integer>() {
    public int compare(Integer a, Integer b) {
        return a.compareTo(b);
    }
};

이랬던 코드가

Comparator<Integer> comparator = (a, b) -> a.compareTo(b);

이렇게 변화 합니다.

  여기서 (a, b) -> a.compareTo(b)는 두 개의 정수를 비교하는 비교자를 나타냅니다. 이것은 두 정수를 받아서 첫 번째 정수가 두 번째 정수보다 작으면 음수를 반환하고, 같으면 0을 반환하고, 크면 양수를 반환합니다.

  람다 표현식을 사용하면 코드를 더 간결하고 가독성 있게 만들 수 있으며, 함수형 프로그래밍 스타일을 채택할 수 있습니다.



8. 3항 연산자

3항 연산자는 세 개의 피연산자를 갖는 조건부 연산자입니다. 조건식의 결과에 따라 두 개의 표현식 중 하나를 선택하여 반환합니다.

조건식 ? 표현식1 : 표현식2
여기서 조건식은 참 또는 거짓으로 평가될 수 있는 표현식 입니다. 만약 조건식이 참이면 표현식1이 반환되고, 거짓이면 표현식2가 반환됩니다.

예시 코드

int x = 10;
String result = (x > 0) ? "양수입니다." : "음수입니다.";
System.out.println(result);

이 코드에서 출력값은 양수입니다.가 출력될 것입니다.



9. 연산자 우선 순위

연산자의 우선 순위는 표현식에서 연산이 수행되는 순서를 결정합니다. 우선 순위가 높은 연산자가 먼저 계산되고, 낮은 우선 순위 연산자는 나중에 계산됩니다. 수학적인 우선 순위와 비슷합니다.

  기본적으로 연산자에는 우선수누이가 있으며, 괄호의 우선순위가 제일 높습니다. 다음으로는 산술 > 비교 > 논리 > 대입의 순서이며, 단항 > 이항 > 삼항의 순서입니다.

  연산자의 연산 진행방향은 왼쪽에서 오른쪽으로 수행되며, 단항 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행됩니다.



10. (optional) Java 13. switch 연산자

switch 문의 확장된 형태입니다. 기존의 switch 문과는 다르게 switch 표현식은 값을 반환할 수 있으며, 각 case에 대한 값도 명시적으로 지정할 수 있습니다.

예시 코드

int dayOfWeek = 3;
String dayName = switch (dayOfWeek) {
    case 1 -> "Monday";
    case 2 -> "Tuesday";
    case 3 -> "Wednesday";
    case 4 -> "Thursday";
    case 5 -> "Friday";
    case 6, 7 -> {
        yield "Weekend";
    }
    default -> throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeek);
};

  이 코드에서 switch 표현식은 dayOfWeek 변수를 평가하고 해당하는 문자열 값을 dayName 변수에 할당합니다. 즉, dayOfWeek가 3이면 dayName에는 "Wednesday"가 할당됩니다.

  yield 키워드는 "Weekend"라는 것을 반환하고 switch 블록을 종료합니다.


switch 표현식의 주요 특징은 다음과 같습니다

  1. case 라벨은 콜론(:) 대신 화살표(->)를 사용합니다.
  2. 각 case는 값을 반환할 수 있습니다.
  3. 여러 case를 쉼표(,)로 결합하여 하나의 case로 처리할 수 있습니다.
  4. default 블록도 값을 반환할 수 있습니다.
  5. 모든 경우를 처리하거나, default 블록을 제공해야합니다.
profile
안녕나를소개하지이름은HaBu직업은Programer취미는tai chi meditation

0개의 댓글