개발/Java

자바 연산자 (Operator)

Debin 2022. 5. 13.
반응형

백기선님이 과거에 진행했던 Java 스터디 3주차 스터디 입니다.

산술 연산자

  • 산술 연산자에는 사칙 연산자(+ ,- ,* ,/ )와 나머지 연산자(%)가 있다.
  • 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선 순위가 높으므로 먼저 처리된다.
  • 피연산자(연산자가 아닌 것, ex 1, 10)가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 
  • boolean 타입을 제외한 모든 기본형 타입에서 사용이 가능하다.
  • 계산하는 값의 결과가 변수의 타입의 범위를 넘어서면 오버 플로우가 발생할 수 있다.

코드 예제

byte a = 10;
byte b = 10;
byte c = (byte) a + b; 
//JVM은 기본적으로 32바이트로 계산하므로 a와 b 두 개의 피연산자들을 int형으로 바꾸어 계산한다.
//따라서 명시적 캐스팅이 필요하다.

int a = 10;
double b = 6.8;
System.out.println(a + b); //16.8 실수형으로 바뀐다.


int a = 10;
char  b = 'a';
char c = (char)(a + b);
int d = a + b;
System.out.println(c); //k
System.out.println(d); //107

비트 연산자

  • 비트 연산자는 피연산자를 비트단위로 논리 연산한다.
  • 피연산자로 실수는 허용하지 않으며, 정수(문자 포함)만 허용한다.
  • |, &, ^, ~, <<, >>, >>> 가 있다.

비트 논리 연산자 : | (OR 연산자), & (AND 연산자), ^ (XOR 연산자), ~ (NOT 연산자)  

X Y X | Y X & Y X ^ Y ~x
1 1 1 1 0 0
1 0 1 0 1 0
0 1 1 0 1 1
0 0 0 0 0 1

자바 비트 논리 연산자 사용

쉬프트 연산자 : <<, >>, >>>

연산자 사용 설명
<< x << y 정수 x의 각 자리 비트를 왼쪽으로 y만큼 이동한다. 빈자리는 0으로 채워진다.
>> x >> y 정수 x의 각 자리 비트를 오른쪽으로 y만큼 이동한다. 빈자리는 최상위 부호 비트와 같은 값으로 채워진다.
>>> x >>> y 정수 x의 각 자리 비트를 오른쪽으로 y만큼 이동한다. 빈자리는 0으로 채워진다.
8 << 2
//8은 2진수로 00001000이다.
//8 << 2는 10진수 8의 2진수를 왼쪽으로 2자리 이동시킨다.
//00100000 32가 된다.
//빈자리는 0으로 채워진다.

-8 >> 2
//-8은 11111000이다.
//부호를 유지하기 위해 빈 자리에 1을 넣는다.
// 11111110 -2다.

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

결과는 모두 boolean 값으로 리턴된다.

연산자 설명 true인 경우 false인 경우
> 좌변 값이 크면 true, 아니면 false 3 > 1 1 > 5
< 좌변 값이 작으면 true, 아니면 false 2 < 4 3 < 2
>= 좌변 값이 크거나 같으면, true 아니면 false 3 >= 3 3 >= 2
<= 과변 값이 같거나 작으면, true 아니면 false 7 <= 9 5 <= 1
== 두 값이 같으면 true, 아니면 false 1 == 1 1 == 2
!= 두 값이 다르면 true, 아니면 false 1 != 2 1 != 1

논리 연산자

  • &와 &&는 차이가 있다.
  • &&는 앞 피연산자의 결과가 true면 뒤 피연산자를 연산한다. 즉 앞 피연산자의 결과가 false면 뒤 피연산자를 연산하지 않고 false를 리턴한다.
  • &는 상관 없이 앞 피연산자, 뒤 피연산자 모두 연산해 결과를 리턴한다.
  • |와 ||도 차이가 있다.
  • &&도 똑같이 앞 피연산자의 결과가 true면 바로 true를 리턴한다. 
  • |는 상관 없이 앞 피연산자, 뒤 피연산자 모두 연산해 결과를 리턴한다.
연산자 연산 true인 경우 false인 경우
& AND true & true true & false, false & false
&& AND true && true false & true, false & false
| OR true | true, true | false false | false
|| OR true | true, true | false false | false
! NOT !false !true

instanceof 

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
  • 주로 조건문에 사용되며 instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
  • 그리고 연산의 결과로 boolean값인 true와 false 중의 하나를 반환한다.
  • instanceof를 이용한 연산 결과를 true로 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 의미한다.
  • 아래 코드에서 보면 자바 모든 클래스의 조상인 Object를 instanceof 연산자에 사용했다.
  • if문에서 값이 true라고 나와서 true1이 출력되었다. 
  • 요약하면, 실제 인스턴스와 같은 타입의 instanceof 연산 이외에 조상 타입의 instanceof 연산에도 true를 결과로 얻는다.
  • instanceof 연산의 결과가 true이므로 위 경우도 형변환을 해도 아무런 문제가 없다는 것을 의미한다.

instanceof 예제 코드
예제코드 실행 결과물

assignment(=) operator

  • =는 대입 연산자다.
  • 대입 연산자는 변수와 같은 저장 공간에 값 또는 수식의 연산 결과를 저장한다.
  • 아래 코드를 확인해보면 lvalue와 rvalue가 존재한다.
  • rvalue는 변수뿐만 아니라 식이나 상수 등이 모두 가능하지만, lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다.
  • 그래서 리터럴이나 상수 같이 값을 지정할 수 없는 것들은 lvalue가 될 수 없다.
  • op= 복합 대입 연산자도 존재한다. 예를 들면 +=, -=, *= , <<=, ^= 등이 있다.
int x = 3; // 변수에 x에 3이 저장되고,
System.out.println(x); // 연산 결과인 3인 출력한다.

x = y = 4; // y = 4 가 진행되고, x = y 가 진행된다

x = y // x는 lvalue, y는 rvalude 라고 한다.

화살표 연산자

  • Java 8에서는 새로운 기능인 람다 표현식이 추가됨과 동시에 람다 표현식을 구성하는 데 사용되는 화살표 연산자가 Java에 등장했다.
  • 표현식 본문에서 인수를 분리한다. 람다의 매개변수 리스트와 바디를 구분한다.
  • ->는 매개변수를 받아 {} 중괄호를 실행시키는 것이다.
  • 코드를 더욱 간결하게 만들어준다.
(int a, int b) -> { System.out.println(a+b); }

더 자세한 람다 표현식 포스팅은 아래에서 확인할 수 있다.

https://devdebin.tistory.com/119?category=1004578 

 

람다 표현식이란?

람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다의

devdebin.tistory.com

3항 연산자

  • 3항 연산자는 (조건문) : ? 참 : 거짓 구조를 가지고 있다. 예시로 바로 살펴보자.
  • 조건문 ? 식1 : 식2
  • 조건문이 참이라면 식1을 리턴한다. 조건문이 거짓이라면 식2를 리턴한다.
System.out.println( 1 < 3 ? "one" : "three"); //one 출력된다

연산자 우선 순위

  • 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
  • 단항 (1) > 이항 (2) > 삼항 (3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
  • 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

연산자의 종류와 우선 순위

JAVA 13. switch 연산자

  • 화살표 연산자를 사용할 수 있다. 보고 처음에는 코틀린의 when이 생각났다.
  • yield 기능을 사용해 값을 리턴할 수 있다.
public class MyClass { 
    public static void main(String[] args) { 
        int a = 10; 
        int result = switch (a) { 
            case 0, 1 -> { 
                yield 1; 
            } 
            case 2 -> { 
                yield 2; 
            } 
            case 3, 4, 5 -> { 
                yield 3; 
            } 
            default -> { 
                yield -1; 
            } 
        }; 
        
        System.out.println(result); 
    } 
}

틀린 부분이나 부족한 부분 피드백은 언제든 환영입니다!! 이상으로 포스팅을 마칩니다. 감사합니다.

 

참고 자료

자바의 정석(저자 : 남궁성)

https://kdg-is.tistory.com/225

반응형

댓글