ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [whiteship] 온라인스터디 - 3주차. 연산자
    IT 발자취.../JAVA 2020. 11. 28. 14:17

    github.com/whiteship/live-study/issues/3

     

    3주차 과제: 연산자 · Issue #3 · whiteship/live-study

    목표 자바가 제공하는 다양한 연산자를 학습하세요. 학습할 것 산술 연산자 비트 연산자 관계 연산자 논리 연산자 instanceof assignment(=) operator 화살표(->) 연산자 3항 연산자 연산자 우선 순위 (option

    github.com

    산술 연산자

    산수 (Arithmetic) 연산자는 수학적인 계산에 사용되는 연산자이다.

    + 더하기
    - 빼기
    * 곱하기
    / 나누기
    % 나머지
    public static void main(String[] args) {
          // result 의 값은 3
          int result = 1 + 2;
          System.out.println(result);
    
          // result 의 값은 2
          result = result - 1;
          System.out.println(result);
    
          // result 의 값은 4
          result = result * 2;
          System.out.println(result);
    
          // result 의 값은 2
          result = result / 2;
          System.out.println(result);
    
          // result 의 값은 10
          result = result + 8;
          // result 의 값은 3
          result = result % 7;
          System.out.println(result);
    }

     

     

     

    비트 연산자 ( <<, >>, >>>)

    연산식 설명
    x << y 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다.
    ( 빈자리는 0으로 채워진다 )
    x >> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다.
    (빈자리는 정수 a의 최상위 부호비트와 같은 값으로 채워진다 )
    x >>> y 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다
    (빈자리는 0으로 채워진다)
    class Test {
        public static void main(String[] args) {
            System.out.println("2 << 3 = " + (2 << 3));
            System.out.println("16 >> 3 = " + (16 >> 3));
            System.out.println("-16 >> 3 = " + (-16 >> 3));
            System.out.println("-16 >>> 3 = " + (-16 >>> 3));
        }
    }
    
    // 결과
    // 2 << 3 = 16
    // 16 >> 3 = 2
    // -16 >> 3 = -2
    // -16 >>> 3 = 536870910

     

    관계 연산자

     

    연산자 기능
    > 왼쪽 항이 크면 참을, 아니면 거짓을 반환
    < 왼쪽 항이 작으면 참을, 아니면 거짓을 반환
    >= 왼쪽 항이 크거나 같으면 참을, 아니면 거짓을 반환
    <= 왼쪽 항이 작거나 같으면 참을, 아니면 거짓을 반환
    == 두 개 항의 값이 같으면 참, 아니면 거짓을 반환
    != 두 개 항이 다르면 참, 아니면 거짓을 반환

     

    논리 연산자

     

    &&
    (논리 곱)
    두 항이 모두 참인 경우에만 결과 값이 참입니다.
    그렇지 않은 경우는 거짓이다.
    ||
    (논리 합)
    두 항 중 하나의 항만 참이면 결과 값은 참이다.
    두 항이 모두 거짓이면 결과 값은 거짓이다.
    !
    (부정)
    단항 연산자이다. 참인 경우는 거짓으로 바꾸고 거짓인 경우는 참으로 바꾼다.

     

    instanceof

    instanceof는 객체 타입을 확인하는데 사용된다. 속성이 연산자이고 형변환이 가능한 지 해당 여부를 true 혹은 false로 가르쳐 준다.

    @Test
    public void 타입추론_var() {
      //given
      var message = "Hello, Java 10";
      //when
      //then
      assertThat(message).isInstanceOf(String.class);
    }
    @Test
    public void 타입추론_var() {
      //given
      var message = "Hello, Java 10";
      //when
      //then
      assertTrue(message instanceof String);
    }

     

    assignment(=) operator

    대입 연산자 설명
    = 왼쪽의 피연산자에 오른쪽 피연산자를 대입함
    += 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결과값을 왼쪽의 피연자에 대입합
    -= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결과값을 왼쪽의 피연산자에 대입함
    *= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결과값을 왼쪽의 피연산자에 대입합
    /= 왼쪽의 피연산자에 오른쪽의 피연산자를 나눈 후, 그 결과값을 왼쪽의 피연산자에 대입함
    %= 왼쪽의 피연산자에 오른쪽의 피연산자를 나눈 후, 그 나머지값을 왼쪽의 피연산자에 대입함
    &= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산 후, 그 결과값을 왼쪽의 피연산자에 대입함
    |= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산 후, 그 결과값을 왼쪽의 피연산자에 대입함
    ^= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산 후, 그 결과값을 왼쪽의 피연산자에 대입함
    <<= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결과값을 왼쪽의 피연산자에 대합함
    >>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결과값을 왼쪽의 피연산자에 대입함
    >>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결과값을 왼쪽의 피연산자에 대입함

     

    화살표(->) 연산자

    자바8부터 도입된 람다 표현식 작성을 위해서 사용된다.

    (매개변수목록) -> { 함수 몸체 }

    자바에서 람다 표현식을 작성할 때 유의해야할 사항은 다음과 같다.

    1. 매개 변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수있다.

    2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.

    3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다. (이때 세미콜론(;)은 붙이지 않음)

    4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.

    5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다. (이때 세미콜론(;)은 붙이지 않음)

    skyoo2003.github.io/post/2016/11/09/java8-lambda-expression

    () -> {}                     // No parameters; result is void
    () -> 42                     // No parameters, expression body
    () -> null                   // No parameters, expression body
    () -> { return 42; }         // No parameters, block body with return
    () -> { System.gc(); }       // No parameters, void block body
    () -> {
      if (true) { return 12; }
      else { return 11; }
    }                          // Complex block body with returns
    (int x) -> x+1             // Single declared-type parameter
    (int x) -> { return x+1; } // Single declared-type parameter
    (x) -> x+1                 // Single inferred-type parameter
    x -> x+1                   // Parens optional for single inferred-type case
    (String s) -> s.length()   // Single declared-type parameter
    (Thread t) -> { t.start(); } // Single declared-type parameter
    s -> s.length()              // Single inferred-type parameter
    t -> { t.start(); }          // Single inferred-type parameter
    (int x, int y) -> x+y      // Multiple declared-type parameters
    (x,y) -> x+y               // Multiple inferred-type parameters
    (final int x) -> x+1       // Modified declared-type parameter
    (x, final y) -> x+y        // Illegal: can't modify inferred-type parameters
    (x, int y) -> x+y          // Illegal: can't mix inferred and declared types

     

    3항 연산자

    조건식에 따라 결과를 저장하기 위해서 사용된다.

    조건식? 피연산자1:피연산자2

    아래는 간단한 테스트 코드이다. 

    "Pork"라는 것이 저장되어있는 String 타입의 지역 변수 a가 "Pork"와 동일하면 a에 "돼지고기"라는 값을 저장하고, 아니면 "소고기"를 저장한다.

    class Test {
        public static void main(String[] args) {
            var a = "Pork";
            a = a.equals("Pork") ? "돼지고기" : "소고기";
            System.out.println(a);
        }
    }

     

    연산자 우선 순위

    우선순위 연산자 내용
    1

    최우선연산자

     ( ., [], () )
    2

    단항연산자 

    ( ++,--,!,~,+/-   : 부정, bit변환>부호>증감)
    3

    산술연산자 

    ( *,/,%,+,-,shift) < 시프트연산자 ( >>,<<,>>> ) >
    4

    비교연산자

    ( >,<,>=,<=,==,!= )
    5

    비트연산자

    ( &,|,,~ )
    6

    논리연산자 

    (&& , || , !)
    7

    삼항연산자

    (조건식) ? :
    8 대입연산자 =,*=,/=,%=,+=,-=

     

     

    (optional) Java 13. switch 연산자 ( 표현식?)

    다음을 테스트해보기 위해서는 자바 13버전이 먼저 필요할 것같다.

    File > project structure... 

    Adopt-openjdk의 경우 14이상으로 설정?해야할거같음

    mkyong.com/java/java-13-switch-expressions/

    // 전통적 swich 문법
        private static int traditionlSwitch(String mode) {
            int result;
            switch (mode) {
                case "a":
                case "b":
                    result = 1;
                    break;
                case "c":
                    result = 2;
                    break;
                case "d":
                case "e":
                case "f":
                    result = 3;
                    break;
                default:
                    result = -1;
            }
            ;
            return result;
        }

    자바 13버전부터 더이상 java 12 value break 구문은 컴파일 되지 않고 대신 yield를 사용합니다.

    java 13 버전 부터는 값을 return 해줄 때 yield라는 키워들르 사용합니다.

    // Java 13, yield 사용
        private static int getValueViaYield(String mode) {
            int result = switch (mode) {
                case "a", "b":
                    yield 1;
                case "c":
                    yield 2;
                case "d", "e", "f":
                    // do something here...
                    System.out.println("Supports multi line block!");
                    yield 3;
                default:
                    yield -1;
            };
            return result;
        }

    자바 12버전부터 switch문에서의 :를 ->로 변경하여 사용할 수 있으며, break문을 생략할 수 있다.

    // Java 12, switch expression returns a value via label rules (arrow)
        private static int getValueViaArrow(String mode) {
            int result = switch (mode) {
                case "a", "b" -> 1;
                case "c" -> 2;
                case "d", "e", "f" -> {
                    // do something here...
                    System.out.println("Supports multi line block!");
                    yield 3;
                }
                default -> -1;
            };
            return result;
        }

     

    프리뷰 기능을 제공한다

    $ javac JEP354.java
    D:\test>javac JEP354.java
    JEP354.java:39: error: multiple case labels are a preview feature and are disabled by default.
                case "a", "b":
                          ^
      (use --enable-preview to enable multiple case labels)
    JEP354.java:76: error: switch expressions are a preview feature and are disabled by default.
            int result = switch (mode) {
                         ^
      (use --enable-preview to enable switch expressions)
    JEP354.java:77: error: switch rules are a preview feature and are disabled by default.
                case "a", "b" -> 1;
                              ^
      (use --enable-preview to enable switch rules)
    3 errors
    javac --enable-preview --release 13 Example.java
    java --enable-preview Example

     

    댓글

Designed by Gintire