Backend/Java

Java 문법 2주차 2-3,4,5 대입연산자~ 연산자 우선순위

chillmyh 2023. 11. 21. 16:33

2-3 대입연산자

package week02;

public class W05 {
    public static void main(String[] args) {
        // 대입연산자
        // 변수를 바로 연산해서 그 자리에서 저장하는(대입하는) 연산자
        // =(기본연산자), +=, -=, *= ....(복합대입연산자)
        // ++ : += 1
        // -- : -+ 1

        // 기본 대입 연산자
        int number = 10;
        number = number + 2;
        System.out.println(number); // 12

        number = number - 2;
        System.out.println(number); // 10

        number = number * 2;
        System.out.println(number); // 20

        number = number / 2;
        System.out.println(number); // 10

        number = number % 2;
        System.out.println(number); // 0
        System.out.println("----------");

        // 복합 대입 연산자
        number = 10;

        number += 2; // number = number + 2;
        System.out.println(number); // 12

        number -= 2; //number = number - 2;
        System.out.println(number); // 10

        number *= 2; // number = number * 2;
        System.out.println(number); // 20

        number /= 2; // number = number / 2;
        System.out.println(number); // 10

        number %= 2; // number = number % 2;
        System.out.println(number); // 0

        // ++, --
//        number = numbert + 1;
//        number += 1;
        number++;
        System.out.println(number); // 1

        number--;
        System.out.println(number); // 0
    }
}

 

package week02;

public class W06 {
    public static void main(String[] args) {
        // 대입연산자에서 주의해야 할 점 !!
        // ++, --
        int a = 10;
        int b = 10;
        int val = ++a + b--; // 21. ++a 는 a 앞에 ++가 붙어 +1처리가 된 후 다음 연산자 + 로 넘어갔지만
                            // b--에서는 ++a(11) + b 의 연산(+)이 !끝난 후! b값에 -1을 처리했기 때문에 21.
//        int val = ++a + --b; // 20. b앞에 --가 들어가 9인 상태로 연산(+)이 진행되었기 때문에 11 + 9 = 20
        System.out.println(a); // 11
        System.out.println(b); // 9
        System.out.println(val);
    }
}

 

2-4 기타연산자

package week02;

public class W07 {
    public static void main(String[] args) {
        // 기타 연산자
        // (1) 형변환 연산자
        int intNumber = 93 + (int)98.8; // 93 + 98
        System.out.println(intNumber); // 191

        double doubleNumber = (double)93 + 98.8; // 93.0 + 98.8
        System.out.println(doubleNumber); // 191.8

        // (2) 삼항연산자
        // 비교연산자와 항상 함께 쓰인다.
        // 비교연산자의 결과 : true or false -> 이 결과의 값에 따라 결정되는 무언가!
        // 조건 ? 참 : 거짓
        int x = 1;
        int y = 9;
        boolean b = (x == y) ? true : false; // false
        System.out.println(b); // false

        // x가 y랑 다르니? 응!
        String s = (x != y) ? "정답" : "오답";
        System.out.println(s); // 정답

        int max = (x > y) ? x : y; // 1 > 9가 맞음? 아니!->y
        System.out.println(max); // 9. y=9 이기 떄문.

        int min = (x < y) ? x : y; // 1 < 9가 맞음? 응! ->x
        System.out.println(min); // 1. x=1 이기 때문.

        // (3) instance of (3주차 -> 클래스, 객체)
        // 피 연산자가 조건에 명시된 클래스의 객체인지 비교하여
        // 맞으면 -> true
        // 틀리면 -> false
    }
}

 

2-5

[ 연산자 우선순위 : 산술 > 비교 > 논리 > 대입 ]

 - 연산자 여러개가 함께 있는 연산을 계산할때는 우선순위가 있다.

 - 위 우선순위에 따라서 최종적인 응답값이 결정된다.

 - 단, 괄호로 감싸주면 괄호안의 연산이 최우선순위로 계산!

package week02;

public class W08 {
    public static void main(String[] args) {
        int x = 2;
        int y = 9;
        int z = 10;

        boolean result = x < y && y < z; true && true
        System.out.println(result); // true
        System.out.println("-----");

        result = x + 10 < y && y < z; // 12 < 9 && 9 < 10
        System.out.println(result); // false
        System.out.println("-----");

        result = x + 2 * 3 > y; // 2 + 6 > 9
        System.out.println(result); // false

        result = (x + 2) * 3 > y; // 4 * 3 > 9
        System.out.println(result); // true
    }
}

error : true && true -> // true && true

 

 

 

연산 전에 두 피연산자의 타입이 다른 경우 타입을 일치시킨다.

- 두 피연산자의 타입을 같게 일치시킨다. (둘중에 저장공간 크기가 더 큰 타입으로 일치)

  - 피연산자의 타입이 'int' 보다 작은 'short' 타입이며면 'int'로 변환 

  - 피연산자의 타입이 'long' 보다 작은 'int', 'short' 타입이면 'long' 으로 변환

  - 피연산자의 타입이 'float'보다 작은 'long', 'int', 'short' 타입이면 'float'으로 변환 (float은 부동소수점이라 long보다 표현범위 큼)

  - 피연산자의 타입이 'double' 보다 작은 'float', 'long', 'int', 'short' 타입이면 'double'으로 변환

  - 이처럼, 변수 여러개를 연산했을 때 결과값은 피연산자 중 표현 범위가 가장 큰 변수 타입을 가지게 된다.

 

package week02;

public class W09 {
    public static void main(String[] args) {
        short x = 10;
        int y = 20;

        int z = x + y; // short인 x보다 int인 y가 더 큰 타입임으로 int z

        long lx = 30L; // long은 항상 접미사 L을 붙여준다.
        long lz = z + lx; // int z보다 long lx가 더 큰 타입임으로 long lz

        float fx = x;
        float fy = y;
        float fz = z; // x,y,z의 타입이 short, int, int로 float보다 작은 타입이라 float에 속할 수 있음.

        System.out.println(lz); // 60
        System.out.println(fx); // 10.0
        System.out.println(fy); // 20.0
        System.out.println(fz); // 30.0
    }
}

 

- 비트 연산

  - Byte 를 8등분한게 Bit

  - Bit는 0, 1 둘중의 하나의 값만을 저장하는 컴퓨터가 저장(표현)가능한 가장 작은 단위

  - 컴퓨터의 가장 작은 단위인 Bit 이기 때문에 연산중에서 Bit 연산이 가장 빠름

  - 물론 이전에 배운대로 0, 1 값으로 산술연산을 하거나, 비교연산을 할 수 있지만 비트 연산을 통해 자리수를 옮길수도 있음

  - '<<' (왼쪽으로 자리수 옮기기), '>>' (오른쪽으로 자리수 옮기기)

  - 0,1 은 2진수 값이기 때문에,

       자리수를 왼쪽으로 옮기는 횟수만큼 2의 배수로 곱셈이 연산되는 것과 동일

       자리수를 오른쪽으로 옮기는 횟수만큼 2의 배수로 나눗셈이 연산되는 것과 동일

ex ) 0101 -> 1010         1010 -> 0101

          5           10              10          5

 

package week02;

public class W10 {
    public static void main(String[] args) {
        System.out.println(3 << 2); // 12
        System.out.println(3 << 1); // 6
    }
}

 

위와 같은 원리로 >> 해서 자릿수를 오른쪽으로 옮기면

package week02;

public class W10 {
    public static void main(String[] args) {
        System.out.println(3 >> 2); // 0
        System.out.println(3 >> 1); // 1
    }
}

 

11 -> 00 = 0

11 -> 01 = 1