Operator

eunsol Jo·2022년 1월 8일
1

☕️  Java

목록 보기
3/4

산술 연산자

  • +, -, *, /, %
  • 정수(소수점무시)
  • 실수(정밀도까지 소수점 계산)
  • 0으로 나누기 안됨
  • 타입캐스팅과 프로모션이 발생 → 이로인한 값손실을 주의

이항연산자 연산방식

  1. int보다 작은 타입은 int로 변환
    • byte, char, short → int
  2. 피연산자 중 표현번위가 큰 타입으로 형변환
    • char + int → int + int → int
    • long + float → float + float ⇒ float

유의사항

byte a = 10;
byte b = 20; 
byte c = a + b; // ① complie 에러! 
byte c = (byte) a + b; // ② complie 에러! 
byte c = (byte) (a + b); // ③ OK!

① 연산방식1번에 따라 연산시에 int로 변환되므로 byte타입인 c에 대입불가함

② (byte) a + b; → byte + int → int + int → int Error

③ (byte) (a + b); → (byte) int + int → (byte) int → byte OK

증감연산자

  • ++ , —
  • 후위연산 : 해당 라인을 지나고 실행 / 전위연산 : 해당 라인 수행시 실행

비트 연산자

a. Sift 연산자

1) a << b

a의 비트를 왼쪽으로 b만큼 이동

ex. -176 << 3 이라면

  • 왼쪽으로 3칸이동 int(4byte=32bit)
  • 0으로 채워짐
  • 맨앞자리는 부호를 의미
  • 결과적으로 -1408이 나온다.
-17611111111111111111111111101010000
-176 << 311111111111111111111111101010000000= -1408

2) a >> b

a의 비트를 오른쪽으로 b만큼 이동 (공백은 MSB로 채워짐 ⇒ 결과값 부호 동일)

ex. -176 >> 3 이라면

  • 오른쪽으로 3칸이동 int(4byte=32bit)
  • 1로 채워짐 *-176의 부호(MSB)가 1(마이너스)이라서
  • 맨앞자리는 부호를 의미
  • 결과적으로 -22이 나온다.
-17611111111111111111111111101010000
-176 >> 311111111111111111111111111101010000= -22

3) a >>> b

a의 비트를 오른쪽으로 b만큼 이동 (단, 공백은 무조건 0으로 채워짐 ⇒ 결과값 부호가 바뀔수 있음)

ex. -176 >> 3 이라면

  • 오른쪽으로 3칸이동 int(4byte=32bit)
  • 0로 채워짐 *코드를 보면 0이 생략되서 이진수 표현시 29자리로 나옴
  • 맨앞자리는 부호를 의미
  • 결과적으로 536870890이 나온다.
-17611111111111111111111111101010000
-176 >>> 300011111111111111111111111101010000= 536870890

b. 비트 연산자

연산자논리기능
&AND두 비트 모두 1이면 결과가 1, 아니면 0
|OR두 비트 중 하나라도 1이면 결과가 1, 아니면 0
^XOR두 비트가 서로 다르면 결과가 1, 아니면 0
~NOT1을 0으로, 0을 1로 부정 (보수)
  • 피연산자를 비트단위로 연산한다.
  • 실수형(double, float) 제외 모두 사용가능
  • int로 자동 타입변환 후 연상수행 → byte, short, char의 연산결과는 int이다.
xyx | yx & yx ^ y
11110
10101
01101
00000

논리 연산자

xyx || y (OR)x && y (AND)
truetruetruetrue
truefalsetruefalse
falsetruetruefalse
falsefalsefalsefalse
  • 피연산자 + 연산결과 모두 반드시 boolean이어야 함.
  • && 가 || 보다 우선순위가 높다.

관계 연산자(비교 연산자)

  • true / false를 리턴한다.
  • 참조형에는 == 와 != 만 사용할 수 있다.
  • >, <, >=, <=, ==, !=

유의할 케이스

instanceof

  • 자바의 다형성 특징에 따라서, 상속관계의 up/down 캐스팅이 가능
  • 타입 변경시 해당 연산자를 통해 true/false 확인후 진행하면 ClassCastException을 방지할 수 있다.

▶︎ 상속관계

▶︎ 다형성

assignment(=) operator

  • 대입연산자 : 변수에 값을 할당.
  • 연산방향 (←) : 오른쪽에서 왼쪽으로
  • op= 으로도 사용가능 ex. i += 3; = i = i + 3;

화살표(→) 연산자

  • Java8부터 사용
  • Lambda Expression(람다 표현식)
    • 함수형 프로그래밍을 가능하게함
    • 람다 = 익명함수

[더 자바, Java8] 0~1. 함수형 인터페이스와 람다

3항 연산자

  • 조건문 ? 조건1 : 조건2
  • 참이면 조건1이 실행되고 거짓이면 조건2가 실행된다.
  • 코드는 간결하나 컴파일속도는 빨라지지 않음
  • 과하게 사용시 가독성 저하

연산자 우선 순위

  • 괄호
  • 산술 > 비교 > 논리 > 대입
  • 단항 > 이항 > 삼항
-x + 3 // 단항 > 이항
x + 3 * y // * / > + -
x + 3 > y -2 // 산술 > 비교
x > 3 && x < 5 // 비교 > 논리

x << 2 + 1 // + > shift   => x << (2 + 1) 와 같음
x < -1 || x > 3 && x < 5 // AND > OR     => x < -1 || (x > 3 && x < 5) 와 같음
종류연산방향연산자우선순위
단항 연산자++ — + - ~ ! (타입)높음
산술 연산자* / %
+ -
<< >> >>>
비교 연산자< > <= >= instanceof
== !=
논리 연산자&
^
|
&&
||
삼항 연산자?:
대입 연산자= *= /= %= += <<= >>= >>>= &= ^= !=낮음

Java 13. switch 연산자

  1. Java12이전 버전
switch(test)
{
    case 1:
        result = 3;
        break;
    case 2:
        result = 3;
        break;
    case 3:
        result = 33;
        break;
}
  1. Java12이후(Enhanced switch)

1) 케이스 나열

    int test = 0;

    switch(test)
    {
        case 1, 2:
            result = 3;
            break;
        case 3:
            result = 33;
            break;
    }

2) → 사용으로 break생략 가능

    switch(test)
    {
        case 1, 2 -> 3;
        case 3 -> 33;
    }

3) break value; 기능 지원

  1. Java13이후 (yield추가됨)
switch(test)
{
    case 1, 2 -> 3;
    case 3 ->
    {
        yield 33;
    }
    // case 3 -> yield 33; 블록 밖에서 쓸 수 없다.

}

참조
자바의 정석
https://velog.io/@uhan2/Java-Operator

profile
Later never comes 👩🏻‍💻

0개의 댓글