자바스터디 3주차

Updated:

개요🙌

목표: 자바가 제공하는 다양한 연산자를 학습하자.

학습할 것

  • 산술 연산자(Arithmetic Operators)
  • 비트 연산자(Bitwise and Bit shift operators)
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (선택사항) Java 13, switch 연산자

산술 연산자(Arithmetic Operator)

산술연산자는 사칙연산을 의미한다.

산술연산자는 기본적으로 두 개의 피연산자(operand)를 요한다.

Operator Description
+ 더하기 연산자(String연산의 경우, 문자열 붙이기로 사용된다.)
- 빼기 연산자(String포함 안됨.)
* 곱하기 연산자
/ 나누기 연산자, 몫이 나옴.
% 나머지 연산자, 나머지 값이 나옴.

비트 연산자

비트 연산자는 비트를 다루는 연산자이다.

Operator Description
~[operand] 보수 연산자, 0 단위, 1단위의 비트를 변경함.
[operand1]«[operand2] [operand1]의 비트들을 [operand2]만큼 왼쪽으로 이동함.
[operand1]»[operand2] [operand1]의 비트들을 [operand2]만큼 오른쪽으로 이동함. 부호에 맞게 가장 왼쪽값을 채운다.(-일 경우, 1로 채움)
[operand1]»>[operand2] » 행위는 동일하나, LMB(Left Most Bit)에 0으로 채운다.
& AND 연산자
^ XOR 연산자
| OR 연산자

관계 연산자

관계 연산자는 하나의 피연산자가 다른 피연산자보다 크거나 작거나 같거나 같지 않음을 비교하는 연산자이다.

Operator Description
[operand1] == [operand2] 같은지 비교
[operand1] != [operand2] 다른지 비교
[operand1] > [operand2] [operand1]이 [operand2]보다 더 큰지 비교
[operand1] >= [operand2] [operand1]이 [operand2]보다 같거나 큰지 비교
[operand1] < [operand2] [operand1] 이 [operand2]보다 더 작은지 비교
[operand1] <= [operand2] [operand1]가 [operand2]보다 같거나 작은지 비교

주의: “=<”, “=>” 이런 연산자는 없음. 헷갈림 주의

논리 연산자

조건이 참인지 거짓인지 판별하는 연산자

Operator Description
[condition1]&&[condition2] [condition1]과(AND) [condition2]가 둘 다 TRUE면 TRUE
[condition1]||[condiiton2] [condition1] 또는(OR) [condition2] 중 하나만 TRUE면 TRUE

short-circuiting: 논리 연산자에서 “&&” 연산의 경우, 둘 다 참이여야 “참”인데, 처음 [condition1]이 false라면 [condition2]은 보지 않아도 되고, “||“의 연산의 경우, [condition1]이 참이면 뒤의 [condition2]은 보지 않아도 true가 된다. 이렇게 연산을 줄이는 것을 short-circuit연산이라고 한다.

단일 연산자

단일연산자(unary Operator)는 피연산자(Operand)가 하나만 있을 때, 사용하는 연산자를 말한다.

Operator Description
+ 양수(positive) 나타낼 때, 사용한다. (하지만 대부분 생략하고 나타낸다.)
- 단일 마이너스 연산자는 음수(negative)를 나타낸다.
++ 1 증가 단일 연산자
1 감소 단일 연산자
! 논리 보수 연산자로, Not을 의미한다. boolean값일 때 사용.

instanceof

instanceof 연산자는 객체의 특정 타입을 비교하는 연산자이다.

생성된 객체가 어떤 interface, class의 객체인지 판별하는 연산자이다.

주의: null은 어떤 인터페이스나 클래스로 생성된 인스턴스가 아니기 때문에 연산을 실행해보면 항상 false이다.

Assignment Operator

Assignment Operator(대입 연산자)는 다음과 같이 사용된다.

[Type] [variable] = [value] 오른쪽 valueType에 맞게 variable(변수)에 대입(Assignment)한다.

화살표 연산자(Arrow Operator)

Java 8 부터 도입된 연산자이다. Lambda Expression이라고 하고, 익명클래스를 대신해서 사용할 수 있도록 만들었다.

함수형 프로그래밍언어의 장점을 착안한다. 람다 표현식을 사용하면 일급 객체를 만들 수 있다. 이에 대해서는 다음에 정리해보겠다.

3항 연산자

3항 연산자로 if~else구문을 축약해서 사용할 수 있다.

기존 if~else구문

int max = 0;

if (a > b) {
    max = a;
} else {
	max = b;    
}

3항연산자

int max = a > b ? a : b;

연산자 우선 순위

연산자 우선 순위(Operator Precedence)

연산자 순위
postfix expr++, expr–
unary ++expr, –expr, + expr, -expr, ~,!
multiplicative *, /, %
additive +, -
shift «, », »>
relational <, <=, >, >=, instanceof
equality ==, !=
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive |
logical AND &&
logical OR ||
ternay ? :
assignment =,+=,-=,*=,/=,%=,&=,^=,|=,«=,»=,»>=

java switch 구문

switch 구문은 다중if문과 같다. if ~ else if ~ elseswitch문으로 표기 가능하다.

요일을 숫자로 표시하는 구문을 작성해보자.

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
int numberLetters = 0;
Day day = Day.WEDNDESDAY;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numberLetters = 6;
        break;
    case TUESDAY:
        numberLetters = 7:
        break;
    case THURSDAY:
    case SATURDAY:
        numberLetters = 8:
        break;
    case WEDNESDAY:
        numberLetters = 9:
        break;
    default:
        throw new IllegalStateException("Invalid day: " + day);
}

System.out.println(numberLetters);

java 12 버전부터는 화살표 연산자(->)를 사용하여 break문 없이 사용할 수 있다.

Day day = Day.WEDNESDAY;
int numberLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
    default -> throw new IllegalStateException("Invalid day: " + day);
}

위 처럼 switch구문(statement)를 switch 식(expression)으로 표기가 가능해졌다.

그리고 java13에서는 yield를 통해 switch식을 사용할 수 있다.

Day day = Day.WEDNESDAY;
int numberLetters = 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);
}
  • switch statementbreak
  • switch expressionyield
  • break, yield등은 colon case에서만 사용한다.

참고: 오라클 공식문서에서는 “arrow case” 사용을 추천하고 있다. “colon case”에서 break, yield구문을 빼먹기 쉽기 때문이다.

참고자료

Comments