[Java] 3주차 과제

4 minute read

전체적으로는 java in Nutshell을 참고합니다.

공부내용

  1. 산술 연산자
    • addition(+)
      1) 두수를 더해준다
      2) 두 string을 더해준다
      3) 둘중 하나가 string인 경우, 나머지도 string으로 변경한 다음 더해준다.
            System.out.println("Total: "+ 3 + 4); // prints "Total: 34", not 7!
      

      from java in a Nutshell, 7th Edition

    • substraction(-)
      1) 앞수에서 뒷수를 빼줌
      2) 뒤에서 나오지만 음수 unary operator로 쓰이기도 한다.
    • multiplication(*)
      1) 두수를 곱해준다.
    • division(/)
      1) 앞수에서 뒷수를 나눠준다.
      • 두수가 모두 integer이라면, 결과도 integer. 이때 나머지는 사라진다.
      • 두수가 모두 float-point 값이라면, 결과는 float-point값이다.
      • 분자가 정수이며, 분모에 해당하는 수가 0이라면,
             int a = 1;
             int b = 0;
             System.out.println(a/b); //throw ArithmeticException()
        
      • float-point값을 0으로 나눠주면 infinite 또는 NaN이 나온다.
             float a = 0.0f;
             float b = 0;
             System.out.println(a/b) //print NaN
             float c = 0.1f;
             System.out.println(c/b) //print Infinity
        
      • 결론 :
        • 분모가 float-point 0 -> infinity 또는 NaN
        • 분모가 int 0 -> ArithmeticException
    • modulo(%)
      1) 앞수 % 뒷수, 나머지를 반환
      2) sign은 앞수(first operand)를 따라간다.
            System.out.println(7%(-3)) // print 1
            System.out.println(-7%3) // print -1
      

      3) float-value의 case

      • 일반적으로 int와 동일
          System.out.println(4.3%2.1) // 대략 0.1 실제로는 0.09999999999999964이
        
    • Unary minus(-)
  2. 비트 연산자
    • low-level operator이며, 개별의 bit들은 integer value를 만든다. 이것을 이해하기 위해서는 반드시, binary number에 대해서 이해해야 한다.
    • float-value, boolean, array, object에는 사용할 수 없다.(특히, boolean의 경우에는 사용하면, 다른 결과가 나온다.(논리 연산자에서 설명))
    • 두수가 long이면 결과도 long이다. 그 외에는 int이다.
    • 연산기호
      a) complement(~) : 모든 자리수를 반대로(1->0, 0->1)
            byte b = ~12; // ~00001100 => 11110011
      

      two’s compliment : 양수인경우 : 일반적으로 10->2진법바꾸는 방식이 동일 음수인경우 : 보수를 취한후, 1을 더한값 ex)6 -> 0110 -> 1001+1 = 1010(2)

      b) AND(&) : 둘다 1이면 1, 나머지는 0

            int a = 00001010 & 00000111; // 00000010 or 2;
      

      c) OR(|) : 둘다 0이면 0, 나머지는 1

            int a = 00001010 | 00000111; // 00001111 or 15;
      

      d) XOR(^) : 같으면 0, 다르면 1

            int a = 00001010 ^ 00000111; // 00001101 or 13;
      

      f) Left shift(«) : 왼쪽 연산수를 오른쪽 연산수만큼 왼쪽으로 이동(가장높은 자리수는 왼쪽으로 이동하면 사라진다.)

            int a = 10 << 1; // 00001010 -> 00010100;
            // -> 10 * 2; 사실 c << b인 경우는 c*2^b이다.
            int b = -1 << 2; -1(2진수로 변환) 00000001 -> 11111110+1 -> 11111111; 
            left shift 2 한 값 : 11111100(10진수로 변환) 11111100-1 : 11111011 -> 00000100 : -4;
      

      e) Signed right shift(») : 왼쪽 연산수를 오른쪽 연산수만큼 오른쪽으로 이동(가장 낮은 자리수는 오른쪽으로 이동하면 사라진다.) 일반적으로는 2n으로 나눈것과 같다. 오른쪽으로 이동할 때 가장 높은자리수의 값은 유지된다.(sign Extension) 그래서 왼쪽 연산수가 음수인 경우에는, 2n로 나누는 방법을 사용할 수 없다.

            10 >> 1 // 00001010 -> 00000101 : 5(10/2)
            -50 >> 2 // 11001110 -> 11110011 = -13 이것은(50/4)와 다르다.
      

      h) Unsigned right shift(»>) : 왼쪽 연산수를 오른쪽 연산수만큼 오른쪽으로 이동, 옮겨갈때는 무조건 0으로 (zero extension)

            -1 >> 4 // 11111111 >> 4 : 00001111 = 15;
      

      출처 : Java in nutshell

  3. 관계 연산자(=비교 연산자)
    • Equals (==) 비교하는 두 값이 같으면 true, 다르면 false
      primitive타입은 피연산자 값 그 자체가 값은 지 확인한다.
      reference타입은 피연산자가 같은 object나 array를 참조하는지 확인한다.
    • Not Equals (!=) ==와는 정반대이다. primitive는 값 자체가 다르면 true, 같으면 false
      reference는 참조하는 객체나 array가 다르면 true, 같으면 false.
    • Less than (<) 오른쪽값이 왼쪽 값보다 크면 true, 작으면 false
    • Less than or equal(<=) 오른쪽값이 왼쪽 값보다 크거나 같으면 true, 작으면 false
    • Greater than (>) 오른쪽값이 왼쪽 값보다 크면 false, 작으면 true
    • Greater than or equal(>=) 오른쪽값이 왼쪽 값보다 크거나 같으면 true, 작으면 false
  4. 논리 연산자
    • conditional and(&&) : 둘다 true 인경우에 true
    • conditional or(||) : 둘중 하나만 true면 true
    • Boolean not(!) : 현재 Boolean값을 반대로 바꿔준다.
            Boolean a = true;
            a = !a; // then a = false;
      
    • Boolean and(&) : Boolean과 같이 쓰면 &&과 같고, integer와 쓰면 bitwise로 된다.
    • Boolean or(|) : Boolean과 같이 쓰면 ||과 같고, integer와 쓰면 bitwise로 된다.
    • Boolean xor(^) : Boolean과 같이 쓰면 exclusive or이다. 즉 둘중 하나만 true여야 true이고 나머지는 false. integer와 쓰면 bitwise가 된다.
  5. instanceof
    • object나 array가 요구되는 operator이다.
    • primitive는 안된다.
    • 사용법
        실제 instance instanceof type
        "hi" instance of String; // true
      
    • instance가 type과 같으면 true, 그렇지 않으면 false
    • inatance가 null이면 무조건 false
  6. assignment(=) operator
    • 정의 : 할당연산자(?)는 어떠한 값을 컴퓨터의 메모리에 저장하거나 할당하는 역할을 함
    • 왼쪽값을 lvalue, 오른쪽 값을 rvalue라고 한다.
    • 오른쪽 우선순위
        a=b=c // a=(b=c)와 같다.
      
    • assignment operator는 대수 연산기호(op)와 같이 사용이 가능하다.
        // 일반적 룰
        lvalue op= rvalue // a+=2;a=a+2 // a의 값에 2를 더해준다.
        // 주의 lvalue는 한번만 작동한다.
        a[i++] += 1은 a[i++] = a[i++] + 1과는 다르다.
      
    • +=,-=,*=,/=,«= »= ..등으로 사용가능
  7. 화살표(->) 연산자
    • lamdbastream를 위한 연산자이다.(이후설명)
  8. 3항 연산자
    • if와 else를 한번에 처리할 수 있는 연산방법
    • format
        (chk)?a:b // chk가 true이면 return a, otherwise b
        int a = 2;
        int b = 3;
        int big = (a>b)?a:b;
        System.out.println(big) // 3;
      
    • 예시
        Boolean getBytelimitBySellerId = simpleServiceImpl().getBytelimitBySellerId(sellerId);
        Boolean getBytelimitByItemNo = simpleServiceImpl().getBytelmitByItemNo(no);
        Byte limitByte = (getBytelimitBySellerId>getBytelimitByItemNo)?getBytelimitBySellerId:getBytelmitByteItemNo;
      
  9. 연산자 우선 순위(predence and associativity)

    우선순위 연산자 내용
    1 (),[] 괄호,대괄호
    2 -,~,++,– 부정, 증감 연산자
    3 *,/,% -> +,- 곱셉, 나눗셈 -> 덧셈, 뺼샘
    6 «,»,»> 비트 연산자
    7 <,<=,>,>= 비교 연산자
    8 ==,!= 비교 연산자
    9 & -> ^ -> | 비트 연산자 앞부터 우선
    10 && -> || 논리 연산자 앞부터 우선
    11 ?: 조건 연산자(삼항)
    12 =,+=,-=,… 그외

    from https://toma0912.tistory.com/66

  10. (optional) Java 13. switch 연산자
    • switch이용해서 값을 넣어주는 방식이다.
        int code = 1;
        String ttt = switch(code)
        {
            case 1:
                yield "1";
            case 2:
                yield "2";
            default:
                yield "default";
        };
        System.out.prinlnt(ttt); // 1;
      

Leave a comment