[Java의 정석] Chapter 03 연산자 operator

치즈말랑이·2021년 12월 29일
0

자바의 정석

목록 보기
2/3

2021-12-28~2021-12-29

[연습문제]

[3-1] x++ 연산이 된 후 x값은 계속 +1된 상태로 저장이 된다.
[3-7] 반올림 -> 0.5를 더한다

        int far = 100;
        float ccc = (int)((5 / 9f * (far - 32))*100+0.5)/100f;
        System.out.println("far = " + far);
        System.out.println("ccc = " + ccc);

[3-8] byte와 char에는 캐스팅 반드시 하고, long에 L붙이기

1. 연산자(operator)

연산자(operator): 연산을 수행하는 기호(+,-,*,/ 등)
피연산자(operand): 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.
식: 연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한 것
식을 계산하여 결과를 얻는 것을 식을 평가(evaluation)한다고 한다.

  1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
  2. 단항(1) > 이항(2) > 삼항 (3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼족에서 오른쪽이다

산술 변환
1. 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

단항 연산자
증감 연산자 ++ : 피연산자의 값을 1 증가시킨다.
감소 연산자 -- : 피연산자의 값을 1 감소시킨다.

부호 연산자 + -

산술 연산자
사칙 연산자 +, -, *, /

        long a = 1_000_000L; // 1,000,000 1백만
        long b = 2_000_000L; // 2,000,000 2백만

        long c = a * b; // a*b = 2,000,000,000,000?
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);

여기서 long대신 int를 사용하면 연산결과가 int타입의 최대값을 넘어서서 오버플로우가 발생해 이상한 값이 나온다.

수식에 변수가 들어가 있는 경우에는 컴파일러가 미리 계산을 할 수 없기 때문에 형변환을 해주어야 한다.

char c2 = c1 + 1; // X
char c2 = (char) (c1+1); // O

나머지 연산자 % : 왼쪽의 피 연산자를 오른족 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다. 나누는 수가 음수이면 음수의절대값으로 나눈 나머지와 결과가 같다.

비교 연산자
대소비교 연산자 <, >, <=, >=
참이면 true, 거짓이면 false를 반환한다. 기본형 중에서는 boolean을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.

등가비교 연산자 ==, !=
==: 두 값이 같으면 true, 아니면 false
!=: 두 값이 다르면 false, 아니면 true

비교 연산자도 이항 연산자 이므로 연산을 수행하기 전에 형변환을 통해 두 피연산자의 타입을 같게 맞춘 다음 피연산자를 비교한다.

   10 == 10.0f
-> 10.0f == 10.0f
-> true

하지만 0.1 == 0.1f는 false인데, 정수형과 달리 실수형은 근사값으로 저장되므로 오차가 발생할 수 있기 때문이다.

두 문자열을 비교할 때는 비교연산자 ==대신 equals() 메서드를 사용해야 한다. 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이므로(객체가 같은지), 문자열의 내용이 같은지 비교하기 위해서이다.
대소문자 구별하지 않고 비교하고 싶으면 equalsIgnoreCase() 사용

논리 연산자
||(or 결합): 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
&&(and 결합): 피연산자 양쪽 모두 truedldjdi true를 결과로 얻는다.

||의 경우 두 피연산자 중 어느 한 쪽만 참이어도 전체 연산결과가 참 이므로 좌측 피연산자가 true이면 우측 피연산자의 값은 평가하지 않는다.
&&의 경우 한쪽만 거짓이어도 전체 연산결과가 거짓이므로 좌측 피연산자가 false이면 우측 피연산자는 평가하지 않는다.

논리 부정 연산자 !
true와 false를 반대로 바꾼다.

ch <= 'a' || ch >= 'z'
!('a' <= ch && ch <= 'z')

비트 연산자 &, |, ^, ~, <<, >>
|: 피연산자 중 한ㅈ 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&: 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^: 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
모두 2진법에서 계산.

비트 전환 연산자 ~: 0을 1로, 1을 0으로 바꾼다. 1의 보수 연산자라고도 부른다.

쉬프트 연산자 <<, >>
피연산자를 2진수로 표현했을 때 각 자리를 오른쪽(>>), 왼쪽(<<)으로 이동시킨다.
8<<2 는 왼쪽 피연산자인 10진수 8의 2진수를 왼쪽으로 2자리 이동한다.
자리이동으로 인해 저장범위를 벗어난 값은 버려지고 빈자리는 0으로 채워진다.
'>>'연산자의 경우 부호가 있는 정수는 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채운다.
x << n은 x * 2^n의 결과와 같다.
x >> n은 x / 2^n의 결과와 같다.

조건 연산자 ?:
조건식 ? 식1 : 식2
조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.
조건식의 결과가 true이면 식1이, false이면 식2가 연산결과가 된다.
if문과 같은 역할을 한다.
조건 연산자를 중첩해서 사용하면 셋 이상 중의 하나를 결과로 얻을 수 있다.

result = x > 0 ? 1 : ( x==0 ? 0 : -1);

오른쪽 부터 계산하므로 괄호부터 계산한다.

대입 연산자 =
오른쪽 피연산자의 값을 왼쪽 피연산자에 저장한다.
대입 연산자의 왼쪽 피연산자를 lvalue(left value)라고 하고, 오른쪽 피연산자를 rvalue(right value)라고 한다.

복합 대입 연산자
대입 연산자는 다른 연산자와 결합하여 사용할 수 있다. 결합된 두 연산자는 공백없이 붙여써야 한다.

profile
공부일기

0개의 댓글