[Java의 정석] ch3. operator

llunaB·2022년 2월 21일
0

java의 정석

목록 보기
2/2

1. 연산자

1.4 연산자의 우선순위와 결합규칙

  • 쉬프트 연산자는 덧셈 연산자보다 우선순위가 낮다.
x << 2 + 1
  • 비트 연산자는 비교 연산자보다 우선순위가 낮다.
data & 0xFF == 0
  • 논리연산자 중 AND 가 OR 보다 우선순위가 높다.
x < -1 || x > 3 && x < 5

1.5 산술 변환

연산 수행 직전에 발생하는 피연산자의 자동 형변환

  1. 두 피연산자의 타입을 같게 일치시킨다.(보통 큰 타입으로 일치)
  2. 피연산자의 타입이 int 보다 작은 타입이면 int로 변환된다.
  • long + int -> long + long -> long
  • byte + short -> int + int -> int

2. 단항 연산자

2.1 증감 연산자 ++ --

  • j = ++i; 전위형 - 변수의 값을 증가시키고 읽어온다.
  • j = i++; 후위형 - 변수의 값을 먼저 읽어온 후 값을 증가시킨다.
int i = 5, j = 5;
System.out.println(i++);    // 참조하고 증가
System.out.println(++j);    // 증가하고 참조
System.out.println("i = " + i + ", j = " + j);

// 5
// 6
// i = 6, j = 6

3. 산술 연산자

3.1 사칙 연산자

  • 나누기 연산자의 두 연산자가 모두 int 이면 연산결과 역시 int 타입이다.
  • 올바른 연산결과를 얻으려면 두 피연산자 중 한 쪽을 실수형으로 형변환한다.
10 / 4 = 2
10 / 4.0f = 2.5f
  • 결과값의 경우, 크기가 작은 자료형의 변수를 큰 자료형의 변수에 저장할 때는 자동으로 형변환 되지만, 반대로 큰 자료형 값을 작은 자료형 변수에 저장하려면 명시적으로 형변환 해야 한다.
  • int 타입의 최댓값은 2 * 10910 ^9 이므로 이를 넘어가면 오버플로우가 발생하고, 이를 다시 long 으로 바꿔도 소용이 없다. 따라서 연산할 때 피연산자중 하나를 long 타입으로 미리 바꾸어둔다.

4. 비교 연산자

4.1 대소비교 연산자 < > <= >=

4.2 등가비교 연산자 == !=

5. 논리 연산자

5.1 논리 연산자 && || !

  • x는 10보다 크고 20보다 작다.
10 < x && x < 20
  • x 는 2의 배수 또는 3의 배수이다.
x % 2 == 0 || x % 3 == 0
  • x는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
(x % 2 == 0 || x % 3 == 0 ) && x % 6 != 0
  • 문자 ch는 숫자 ('0'~'9')이다.
'0' <= ch && ch <= '9'
  • 문자 ch는 대문자 또는 소문자이다.
('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

+ 효율적인 연산

OR 연산의 경우 연산결과가 '참'인 확률이 높은 피연산자를 연산자의 왼쪽에 두면, 우측 피연산자 값을 평가하지 않을 확률도 높아지므로, 더 빠른 연산 결과를 얻을 수 있다.
반대로, AND 연산의 경우 좌측 연산이 '거짓' 이라면 우측 피연산자를 평가하지 않으므로 마찬가지 결과를 얻는다.

public class OperatorEx26 {
    public static void main(String[] args) {
        int a = 5;
        int b = 0;

        System.out.printf("a=%d b=%d%n", a, b);
        System.out.printf("a!=0 || ++b != 0 = %b%n", a != 0 || ++b != 0); // 좌측 피연산자가 참이라서, 우측 실행 안됨
        System.out.printf("a=%d b=%d%n", a, b);
        System.out.printf("a==0 && ++b != 0 = %b%n", a == 0 && ++b != 0); // 좌측 피연산자가 거짓이라, 우측 실행 안됨
        System.out.printf("a=%d b=%d%n", a, b);
    }
}

+ 논리부정연산자 !

// 논리부정 연산자 활용한 토글 버튼 구현
public class OperatorEx27 {
    public static void main(String[] args) {
        // 인스턴스 생성
        Toggle toggle = new Toggle();
        toggle.click();
        toggle.click();
        toggle.click();

        Toggle2 toggle2 = new Toggle2();
        toggle2.onClick2(true);
        toggle2.onClick2(false);
    }
}


// 클래스 변수 활용
class Toggle {
    static boolean b = true;
    void click (){
        Toggle.b = !b;
        if (b) {
            System.out.printf("참 : %b%n", b);
        }
        else {
            System.out.printf("거짓 : %b%n", b);
        }
    }
}


class Toggle2 {
    private boolean mtnIsActive;
    void onClick2 (boolean b) {
        if (b) {
            System.out.printf("참 : %b%n", b);
        }
        else {
            System.out.printf("거짓 : %b%n", b);
        }
        mtnIsActive = !mtnIsActive;
    }
}

5.2 비트 연산자

profile
안녕하세요. 성장하는 주니어 개발자입니다. :-)

0개의 댓글