백기선 자바 스터디 1기 3주차

2022. 4. 10. 01:57Java/java-live-study

728x90
반응형

목표

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

학습할 것

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

산술 연산자

  • 기본적인 사칙연산
    • +
    • -
    • *
    • /
    • %
  • 이항 연산자
public class OperatorTest {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 5;

        System.out.println(num1 + num2); //7
        System.out.println(num1 - num2); //-3
        System.out.println(num1 * num2); //10
        System.out.println(num1 / num2); //0
        System.out.println(num1 % num2); //2

        // 아래 케이스는 ArithmeticException 이 발생하는 경우임
        // Divide by zero
        double errorCase1 = num1 / 0;
        int errorCase2 = num2 % 0;
    }
}

비트 연산자

  • 이항 연산자
    • & (AND)
    • |   (OR)
    • ^  (XOR)
    • >> (right shift)
    • << (left shift)
    • >>> (unsigned right shift)
  • 단일항 연산자
    • ~ (NOT)
public class OperatorTest {
    public static void main(String[] args) {
        int a = 3 & 1;  // 0011 & 0001 = 1
        int b = 2 | 1;  // 0010 | 0001 = 3
        int c = 3 ^ 1;  // 0011 ^ 0001 = 2
        int d = b >> 1; // 0011 에서 왼쪽으로 1칸 이동, 1(0001)
        int e = b << 1; // 0011 에서 오른쪽으로 1칸 이동, 6(0110)
        int f = ~a;     // 0001 -> 1111 1111 1111 1111 1111 1111 1111 1110

        // 1000 0000 0000 0000 0000 0000 0000 0000
        // ->
        // 0100 0000 0000 0000 0000 0000 0000 0000
        int g = -2147483648 >>> 1;
    }
}

관계 연산자

  • 이항 연산자
    • == (Equal to)
    • !=  (Not equal to)
    • >   (Greater than)
    • <   (Less than)
    • >= (Greater than or Equal to)
    • <= (Less than or Equal to)
  • 연산자의 결과 타입은 boolean 값
public class OperatorTest {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 5;

        System.out.println(num1 == num2); //false
        System.out.println(num1 != num2); //true
        System.out.println(num1 > num2); //false
        System.out.println(num1 < num2); //true
        System.out.println(num1 >= num2); //false
        System.out.println(num1 <= num2); //true
    }
}

논리 연산자

  • 이항 연산자
    • ||    (OR)
    • && (AND)
    • !     (NOT)
public class OperatorTest {
    public static void main(String[] args) {

        System.out.println(true || true); //true
        System.out.println(true || false); //true
        System.out.println(false || false); //false

        System.out.println(true && true); //true
        System.out.println(true && false); //false
        System.out.println(false && false); //false

        System.out.println(!true); //false
        System.out.println(!false); //true
    }
}

instanceof

  • 객체 타입을 확인할 때 사용하는 연산자이다.
  • 형변환 가능여부를 확인하여 boolean 값을 반환한다.
  • 주로 상속관계에서 부모 객체인지 자식 객체인지 확인하는데 사용한다.
class Parent {}
class Child extends Parent {}

public class OperatorTest {
    public static void main(String[] args) {
        Parent parent = new Parent();
        Child child = new Child();

        System.out.println(parent instanceof Parent); //true
        System.out.println(child instanceof Parent); //true
        System.out.println(parent instanceof Child); //false
        System.out.println(child instanceof Child); //true
    }
}

assignment(=) operator

  • 이항 연산자
    • =
    • +=
    • -=
    • *=
    • /=
    • %=
    • &=
    • ^=
    • |=
    • <<=
    • >>=
    • >>>=
  • 객체에 값을 할당한다.
  • 다른 연산자와 묶어서 사용 가능하다.
  • reference type의 경우 주소값을 할당하는 것 주의해야한다.
public class OperatorTest {
    public static void main(String[] args) {
        int num;

        num = 0; //0
        num += 10; //10
        num -= 6; //4
        num *= 2; //8
        num /= 2; //4
        num %= 3; //1
        num &= 3; //1
        num |= 6; //7
        num ^= 5; //2
        num <<= 2; //8
        num >>= 1; //4
        num >>>= 1; //2
    }
}

화살표(->) 연산자

화살표 연산자는 JAVA 8 버전부터 추가된 것으로, 람다 표현식을 지원하기 위한 연산자이다. 람다 표현식은 일종의 익명 함수인데, 익명 함수를 이해하기 위해서는 먼저 익명 클래스(Anonymous class)의 개념을 먼저 이해해야한다.

 

익명 클래스(Anonymous class)란?

익명 클래스란 해당 클래스의 객체 생성과 동시에 클래스를 정의하는 클래스를 의미한다. 특정 클래스가 여러번 호출되지 않거나, 클래스 내부에 필드나 여러개의 메소드를 정의할 필요가 있는 경우 익명 클래스로 정의해 사용할 수 있다.

interface AnonymousClass {
    void func1();
    void func2(String str);
}

public class OperatorTest {
    public static void main(String[] args) {
        AnonymousClass ac = new AnonymousClass() {
            String str = "Hello Anonymous class";
            @Override
            public void func1() {
                System.out.println(str);
            }

            @Override
            public void func2(String str) {
                System.out.println(str);
            }
        };
    }
}

익명 클래스가 일반적인 클래스 정의 방법에 비해 간단하지만, 클래스 내부에 필드도 필요하지 않고, 딱 하나의 메소드만 존재하는 경우(함수형 인터페이스)엔 익명 클래스 문법 조차 과하게 느껴질 수 있다. 람다 표현식을 사용하면 함수형 인터페이스에 대해 간편하게 처리할 수 있다.

 

람다식(Lambda expressions)

추상 메소드를 단 한개 가지고 있는 인터페이스를 함수형 인터페이스(Functional Interface)라고 하는데 이 함수형 인터페이스의 인스턴스를 만들때 사용할 수 있다.

@java.lang.FunctionalInterface
interface FunctionalInterface {
    void func1();
}

public class OperatorTest {
    public static void main(String[] args) {
        FunctionalInterface fi = () -> System.out.println("func1");
    }
}

3항 연산자

  • 3항 연산자
    • (조건식) ? 식1(true) : 식2(false)
  • 첫 번째 피연산자인 조건식의 결과에 따라 다른 결과를 반환한다.
  • 조건식이 true면 두 번째 피연산자인 식1이, false면 세 번째 피연산자인 식2가 반환된다.
public class OperatorTest {
    public static void main(String[] args) {
        int a = 1 > 10 ? 1 : 2; //2
    }
}

연산자 우선 순위

우선순위 연산자 설명 결합 방향
1 []    . 첨자 연산자/ 멤버 연산자 왼쪽에서 오른쪽으로
2 expr++    expr-- 후위 증/감 연산자 왼쪽에서 오른쪽으로
3 !    ~    +    -    ++expr    --expr    (type) 논리 NOT /  비트 NOT / 양의 부호 / 음의 부호 / 전위 증/감 연산자 / 타입캐스팅 오른쪽에서 왼쪽으로
4 *    /    % 곱셈 / 나눗셈 / 나머지 왼쪽에서 오른쪽으로
5 +    - 덧셈 / 뺄셈 왼쪽에서 오른쪽으로
6 <<    >>    >>> 왼쪽 시프트 / 오른쪽 시프트 / 부호 비트까지 오른쪽 시프트 왼쪽에서 오른쪽으로
7 <    <=    >    >=    instanceof 관계 연산자(4) / 인스턴스 실제 타입 반환 왼쪽에서 오른쪽으로
8 ==    != 관계 연산자(2) 왼쪽에서 오른쪽으로
9 & 비트 AND 왼쪽에서 오른쪽으로
10 ^ 비트 XOR 왼쪽에서 오른쪽으로
11 | 비트 OR 왼쪽에서 오른쪽으로
12 && 논리 AND 왼쪽에서 오른쪽으로
13 || 논리 OR 왼쪽에서 오른쪽으로
14 ?: 삼항 연산자 오른쪽에서 왼쪽으로
15 = 대입 및 복합 대입 오른쪽에서 왼쪽으로

(optional) Java 13. switch 연산자

JAVA 13 버전부터 switch 연산자가 추가 되었다. (기존의 switch 문과는 다른 개념이다!) 

 

예제

    Day day = Day.WEDNESDAY;
    int numLetters = switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            System.out.println(6);
            yield 6;
        case TUESDAY:
            System.out.println(7);
            yield 7;
        case THURSDAY:
        case SATURDAY:
            System.out.println(8);
            yield 8;
        case WEDNESDAY:
            System.out.println(9);
            yield 9;
        default:
            throw new IllegalStateException("Invalid day: " + day);
    };
    System.out.println(numLetters);

 

 

728x90
반응형