package CHAPTER02;

public class OperatorExample { // 연산자 예제 클래스
    public static void main(String[] args) {
        
        // **1. 비교 연산자**
        int x = 10, y = 5; // 정수형 변수 선언 및 초기화

        System.out.println("x == y : " + (x == y)); // false (x와 y가 같은지 비교)
        System.out.println("x != y : " + (x != y)); // true (x와 y가 다른지 비교)
        System.out.println("x > y  : " + (x > y));  // true (x가 y보다 큰지 비교)
        System.out.println("x < y  : " + (x < y));  // false (x가 y보다 작은지 비교)
        System.out.println("x >= y : " + (x >= y)); // true (x가 y보다 크거나 같은지 비교)
        System.out.println("x <= y : " + (x <= y)); // false (x가 y보다 작거나 같은지 비교)

        // **2. 논리 연산자**
        boolean a = true, b = false; // 논리형 변수 선언

        System.out.println("a && b : " + (a && b)); // false (둘 다 true여야 true)
        System.out.println("a || b : " + (a || b)); // true (하나라도 true면 true)
        System.out.println("!a     : " + (!a));     // false (a의 반대값)

        // **3. 비트 연산자**
        int num1 = 5; // 0101 (2진수)
        int num2 = 3; // 0011 (2진수)

        System.out.println("num1 & num2  : " + (num1 & num2));  // 1 (0001) - 비트 AND 연산
        System.out.println("num1 | num2  : " + (num1 | num2));  // 7 (0111) - 비트 OR 연산
        System.out.println("num1 ^ num2  : " + (num1 ^ num2));  // 6 (0110) - 비트 XOR 연산
        System.out.println("~num1        : " + (~num1));       // -6 (1010) - 비트 NOT 연산 (2의 보수)

        // **4. 시프트 연산자**
        int num3 = 4;  // 0100 (2진수)
        int num4 = -4; // 1111 1100 (2진수, 음수의 2의 보수 표현)

        System.out.println("num3 << 1  : " + (num3 << 1));  // 8 (1000) - 왼쪽 시프트 연산 (2배 증가)
        System.out.println("num3 >> 1  : " + (num3 >> 1));  // 2 (0010) - 오른쪽 시프트 연산 (2배 감소)
        System.out.println("num3 >>> 1 : " + (num3 >>> 1)); // 2 (0010) - 논리적 시프트

        System.out.println("num4 >> 1  : " + (num4 >> 1));  // -2 (음수는 부호 유지)
        System.out.println("num4 >>> 1 : " + (num4 >>> 1)); // 부호 없이 이동 (양수로 변환됨)

        // **5. 삼항 연산자**
        int num5 = 10, num6 = 20;

        // 삼항 연산자를 사용하여 최소값 구하기
        int min = (num5 < num6) ? num5 : num6;
        System.out.println("더 작은 값: " + min); // 10

        // 삼항 연산자를 사용하여 짝수/홀수 판별
        String result = (num5 % 2 == 0) ? "짝수" : "홀수";
        System.out.println("num5는 " + result); // num5는 짝수

        // 삼항 연산자를 중첩하여 최대값 구하기
        int max = (num5 > num6) ? num5 : (num6 > 15) ? num6 : 15;
        System.out.println("최대값: " + max); // 20
    }
}

