[Java의 정석] 3장 연산자

이정규·2022년 1월 12일
0

Java의 정석

목록 보기
3/7

연산자 우선순위

산술 연산자

char c1 = 'a';

// char c2 = c1 + 1;  // 컴파일 에러가 발생한다.
char c2 = 'a' + 1;    // 컴파일 에러가 발생하지 않는다.

해당 코드에서 리터럴 간의 연산이 일어나기 때문에 컴파일 에러가 발생하지 않는다.
리터럴 간의 연산시에는 컴파일 시에 컴파일러가 계산한 뒤에 그 결과를 대체한다.

char c1 = 'a';
char c2 = c1 + 1;

수식에 변수가 들어가 있는 경우에는 컴파일러가 미리 계산을 할 수 없다.

char + int에서 char형이 int형으로 자동 형변환이 일어난 후 int형으로 결과값이 나온다.
이를 char형에다가 넣기 때문에 컴파일 에러가 발생하는 것이다. 이를 방지하려면 명시적 형변환을 해줘야한다.

char c1 = 'a';
char c2 = (char) c1 + 1;

비교 연산자

public static void main(String args[]) {
	System.out.println("%b\n", 10.0 == 10.0f); // True
	System.out.println("%b\n", 0.1 == 0.1f);   // False
}

앞서 말했듯이 float형은 정밀도가 약 7자리, double형은 약 15자리라고 했다.
바로 여기서 차이가 난다.
10.0, 10.0f 오차가 발생하지 않는다.
0.1, 0.1f는 정밀도의 차이로 인해 오차가 발생한다.

float f  = 0.1f; // 0.10000000149011612
double d = 0.1;  // 0.10000000000000001

그래서 double과 float의 값을 비교하려면 double -> float로 형변환한 다음에 비교해야 올바른 비교가 가능하다.

논리 연산자

효율적인 연산

  • x && y && z
    x가 거짓이라면 해당 연산은 거짓임이 자명하다. 그래서 뒤 연산은 진행하지 않는다.
  • x || y || z
    x가 참이라면 해당 연산은 참임이 자명하다. 그래서 뒤 연산은 진행하지 않는다.

거짓 또는 참일 확률이 높은 것을 앞에다 배치하여 효율적인 연산을 하게끔 할 수 있다.

참고
https://nullmaster.tistory.com/131
Java의 정석 3판

profile
강한 백엔드 개발자가 되기 위한 여정

0개의 댓글