[새싹] 자바가 제공하는 다양한 연산자 학습

채상엽·2022년 5월 10일
0

Sproutt 2nd - Spring Study

목록 보기
30/32

layout: post
title: "자바가 제공하는 다양한 연산자"
date: 2022-05-04T00:00:00-00:00
author: sangyeop
categories: Sproutt-2nd


산술 연산자

연산자사용법설명
+a+ba와 b의 값을 더한다, 또한 문자열을 연결할때도 사용하기도 한다.
-a-ba의 값에서 b의 값을 뺀다.
*a*ba와 b의 값을를 곱한다.
/a/ba의 값을 b의 값으로 나눈 몫을 구한다.
%a%ba의 값을 b의 값으로 나눈 나머지 값을 구한다.

전위연산자

연산자사용법설명
++++aa의 값을 1증가 시킨다. a의 값은 1증가된 상태로 측정된다.
----aa의 값을 1감소 시킨다. a의 값은 1감소된 상태로 측정된다.

후위연산자

연산자사용법설명
++a++a의 값을 1증가 시킨다. a의 값은 1증가 되기 전 상태로 측정된다.
--a--a의 값을 1감소 시킨다. a의 값은 1감소 되기 전 상태로 측정된다.

비트 연산자

비트단위 연산자는 입력값의 이진수 또는 비트들로 동작한다. 이를 long, int, short, char, byte 등 정수형으로도 사용할 수 있다.

비트단위 연산자는 10진수와 동일하게 작동하고 연산자에 따라서 비트 단위로 연산을 수행한다. 연산이 수행되는 과정은 다음과 같다. 먼저 연산이 어떠한 과정으로 이루어 지는지를 알아보자.

  1. 피연산자가 이진수 표현으로 변환된다.
  2. 연산자는 각각의 이진수들을 이용해서 결과를 계산한다.
  3. 계산된 이진수 결과가 10진수로 변환되어 반환된다.

비트단위 논리 연산자

  • OR(|)

    두 정수의 각 이진수를 비교하고 둘 중 하나의 값이 1이라면 1을 반환한다.

    0110
    0101
    ----
    0111

    위와 같이 둘 다 0이라면 0이 되고, 둘 중 하나라도 1이라면 1이 반환된다.

  • AND(&)

    두 정수의 각 이진수를 비교하고 둘 다 1이라면 1을 반환하고, 그렇지 않다면 0을 반환한다.

    0110
    0101
    ----
    0100
  • XOR(^)

    두 정수의 각 이진수를 비교하고 둘의 값이 서로 다르다면 1을 반환한다.

    0110
    0101
    ----
    0011
  • 보수(~)

    한 정수의 보수는 해당 정수를 이진수로 바꾼 값에서 1과 0을 바꾼 값이 된다.

    0000 0110
    ---------
    1111 1001

비트 단위 Shift 연산자

이진수 쉬프트 연산자는 입력값의 모든 비트를 연산자에 따라 왼쪽과 오른쪽으로 이동시킬 수 있다. 사용법은 아래와 같다.

value <operator> <number_of_times>
  • Signed Left Shift(<<)

    <number_of_times>에 적은 숫자 만큼 비트를 왼쪽으로 옮기고 비어있는 오른쪽 공간은 0으로 채운다.

    12 << 2 
    // 00001100
    -------
    48
    // 00110000
  • Signed Right Shift(>>)

    <number_of_times>에 적은 숫자 만큼 비트를 오른쪽으로 옮긴다. 왼쪽 값은 입력된 값에 따라서 다르게 채우는데

    • 입력된 값이 양수일 때

      즉, 가장 왼쪽 비트 값이 0일때, 비어있는 왼쪽 공간을 0으로 채운다.

    • 입력된 값이 음수일 때

      즉, 가장 왼쪽 비트 값이 1일때, 비어있는 왼쪽 공간을 1로 채운다.

  • Unsigned Right Shigt(>>>)

    앞의 Signed Shift 연산자와 유사하지만, 입력값이 음수인지 양수인지에 상관없이 무조건 왼쪽 비어있는 공간을 0으로 채운다는 점이 다르다.

관계 연산자

  • ==

    동등성을 확인하는 연산자이다. 피연산자와 같은 객체이면 true를 반환하고, 그렇지 않으면 false를 반환한다.

  • !=

    비동등성을 확인하는 연산자이다. 피연산자와 같은 객체이면 false를 반환하고 그렇지 않으면 true를 반환한다.

  • <

    미만을 나타내는 연산자이다.

  • >

    초과를 나타내는 연산자이다.

  • <=

    이하를 나타내는 연산자이다.

  • >=

    이상을 나타내는 연산자이다.

관계 연산자는 데이터 여러 데이터 타입들을 지원한다

  • ==!= 연산자는 모든 primitive type에 사용이 가능하고, 객체들에게도 사용이 가능하다.
  • 이 외의 연산자들은 숫자형으로 표현된 타입에만 사용이 가능하며, 객체에는 사용할 수 없다.

논리 연산자

논리연산자는 "AND", "OR" 그리고 "NOT" 과 같은 논리적인 연산을 수행할 때 사용된다.

  • &&

    양쪽의 조건이 모두 참일 경우 true를 반환한다. 그렇지 않을 경우 false를 반환한다.

    condition1 && condition2
  • ||

    양쪽 조건 중 하나 이상이 참이라면 true를 반환한다. 둘 모두 거짓이라면 false를 반환한다.

    condition1 || condition2
  • !

    주어진 조건을 만족하지 않거나, false 일경우 true를 반환한다. 만약 condition이 false라면 true일 경우에 true를 반환하고, true 라면 false 일 경우 true를 반환한다.

    !(condition)

instanceof

instanceof는 어떤 객체가 주어진 타입에 해당하는 객체인지 검사하는 바이너리 연산자이다. 결과로는 true 또는 false를 반환한다. 흔히 타입 비교 연산자로 알려져 있다.

확인되지 않은 객체를 캐스팅하기 전에, instanceof가 사용된다. 그렇게 함으로써 ClassCastException을 피하도록 도와준다. 사용법은 아래와 같다.

(object) instanceof (type)
public class Car {
    public Car() {
    }
}
public class SUV extends Car{
    public SUV() {
    }
}
public class Main {
    public static void main(String[] args) {
        SUV suv = new SUV();
        System.out.println(suv instanceof Car);
    }
}
true

assignment(=) operator

아마 프로그래밍을 하면서 가장 많이 사용하는 연산자 중 하나일 것이다. 할당 연산자는 변수에 값을 할당할 때 사용한다. 할당 연산자의 왼쪽은 변수이고 오른쪽에는 할당하고자하는 이 들어간다. 사용법은 아래와 같다

(type) (variable) (operator) (value);
  1. 기본적인 할당 연산자

    연산자의 왼쪽에 할당하고자 하는 변수, 오른쪽에 값을 적어 연산자를 사용하는 방법이다. 이때 할당하고자 하는 값의 타입과 할당되는 변수의 타입이 일치해야 한다.

    int a = 1;
  2. 복합 할당 연산자

    +,-,*,/ 와 함께 사용되는 = 연산자를 의미한다.

    int a = 1;
    a = a+1;

    위의 코드는 아래와 같다

    int a = 1;
    a += 1;

화살표(->) 연산자

-> 화살표 연산자는 람다 함수를 정의한다. 람다로 인해 코드를 디자인하고 작성하는 방법을 크게 바뀌었다. 람다로 인해 함수형 프로그래밍이 가능해졌다. 이것은 프로그래밍의 패러다임이 바뀌었음을 의미한다.

람다 표현법

parameters -> body
  • parameters

    람다의 파라미터는 단일 파라미터의 경우에는 소괄호()가 생략될 수 있으며, 여러개의 파라미터가 들어갈 경우 쉼표,로 구분할 수 있다.

  • ->

    화살표 연산자라고도 한다. 이는 문법적으로 parametesbody를 분리하기 위해 사용된다.

  • body

    여러개의 문장을 사용하여 중괄호{}가 사용될 경우 세미콜론;이 요구되며, 그렇지 않을 경우 중괄호와 세미콜론의 생략이 가능하다.

람다의 타입 추정
람다에서 파라미터의 타입을 지정하지 않으면 컴파일러는 바디로부터 파라미터의 타입을 추정한다. 만약 타입을 지정할 경우에는 모든 파라미터의 타입을 지정해야 하며, 그렇지 않을 경우에는 모든 파라미터의 타입을 지정해서는 안된다. 그렇지 않으면 컴파일러 에러가 발생한다.

(int a) -> a + a // a와 a를 더한 int 타입의 값을 반환한다.
x -> x * x // x의 타입을 추정하여, x를 x로 곱한 값을 반환한다.
() -> System.out.prinnln("TEST") // 반환 값이 없이 "TEST"를 출력한다.

3항 연산자

3항 연산자 ?는 값 반환이 가능한 if-else의 축약형이다. 사용법은 다음과 같다.

booleanExpression ? expression1 : expression2

첫 번째 피연산자는 반드시 boolean 표현이어야 한다. 만약 첫 번째 피연산자가 참이면 expression1을 반환하고, 거짓이라면 expression2를 반환한다.

number==100 ? "숫자가 100입니다." : "숫자가 100이 아닙니다";

연산자 우선 순위

자바에서 연산은 다음 연사자 우선순위 표에 따라서 수행이 된다.

연산자우선순위
postfix increment and decrement++, --
prefix increment and decrement and unary(단한연산자)++,--,+,-,~,!
multiplicative*,/,%
additive+,-
shift<<,>>,>>>
relational<,>,<=,>=,instanceof
equality==,!=
bitwise AND&
bitwise exclusive OR^
bitwise inclusive OR|
logical AND&&
logical OR||
ternary? :
assignment=,+=,-=,*=,/=,%=,&=,^=,|=,<<

(optional) Java 13. switch 연산자

기존에 장황하던 switch-case문을 Java 13에서 개선하였다. 기존의 switch-case문을 보자

String name = "채";
switch(name) {
  case "채":
    System.out.println("일치합니다");
    break;
  case "상":
    System.out.println("일치하지 않습니다");
    break;
}

이를 개선해보면 다음과 같다.

switch(name) {
    case "채" -> System.out.println("일치합니다");
    case "상" -> System.out.println("일치하지 않습니다");
}

참고문헌

profile
프로게이머 연습생 출신 주니어 서버 개발자 채상엽입니다.

0개의 댓글