[자바의 정석] Chapter03. 연산자

Hyeonjun·2022년 9월 30일
0

자바의 정석

목록 보기
3/7
post-thumbnail

1. 연산자(Operator)

  • 연산자는 연산을 수행하는 기호를 말한다.
  • 자바에서는 사칙연산을 비롯해서 다양한 연산자들을 제공하낟.

1.1 연산자와 피연산자

연산자: 연산을 수행하는 기호

피연산자: 연산자의 작업 대상(변수, 상수, 리터럴, 수식)

  • 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.

2.3 식과 대입 연산자

연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것을 식(expression)이라 한다.

식을 계산하여 결과를 얻는 것을 ‘식을 평가(evaluation)한다고 한다.

  • 작성한 식을 프로그램에 포함시키려면 식의 끝에 ;을 붙여 문장으로 만들어야 한다.

2.4 연산자의 종류

종류연산자설명
산술 연산자+ - * / % << >>사칙 연산과 나머지 연산
비교 연산자> < ≥ ≤ == ≠크고 작음과 같고 다름을 비교
논리 연산자&&
대입 연산자=우변의값을 좌변에 저장
기타(type) ?: instanceof형변환 연산자, 삼항 연산자, instanceof 연산자

피연산자 개수에 의한 분류

  • 피연산자의 개수에 따라 n항 연산자라고 부른다.
  • 삼항 연산자는 오직 ? :뿐이다.
  • 피연산자의 개수로 부호 연산자를 구분할 수도 있다.
  • 연산자를 기능별, 피연산자의 개수별로 나누어 분류하는 것은 ‘연산자의 우선순위’때문이기도 하다.
  • 연산자마다 우선순위가 다르지만, 같은 종류의 연산자들은 우선순위가 비슷하기 때문에 각 종류별로 우선순위를 외우면 기억하기 더 쉽다.

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

  • 상식적인 수준에서 우선순위를 알 수 있음.

연산자의 결합규칙

  • 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자의 대입 연산자만 그 반대로, 오른쪽에서 왼쪽의 순서로 연산을 수행한다.

연산자의 우선순위

  1. 산술 > 비교 > 논리 > 대입
  2. 단항 > 이항 > 삼항
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽이다.

1.5 산술변환(usual arithmetic conversion)

  • 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전 형변환 연산자로 타입을 일치시켜야 한다.
  • 대부분의 경우 피연산자의 타입 중 더 큰 타입으로 일치시킨다.
    • 원래 값이 손실될 가능성이 있기 때문
  • 연산 전에 피연산자의 타입을 일치시키기 위해 자동 형변환 되는 것을 ‘산술변환’ 혹은 ‘일반 산술 변환’이라 하며, 이 변환은 이항 연산에서만 아니라 단항 연산에서도 일어난다.
  • 연산 결과의 타입은 피연산자의 타입과 일치한다.

산술변환 정리

  • 연산 수행 직전에 발생하는 피연산자의 자동 형변환
  • 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로)
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

2. 단항 연산자

2.1 증감 연산자 ++ —

  • 피연산자에 저장된 값을 1 증가 혹은 감소시킨다.
  • 피연산자의 왼쪽에 위치하면 전위형(prefixe), 오른쪽에 위치하면 후위형(postfix)라고 한다.
  • 전위형은 변수의 값을 먼저 증가시킨 후 변수의 값을 읽어옴
  • 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킨다.
  • 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야한다.

2.2 부호연산자 + -

  • -: 피연산자의 부호를 반대로 변경
  • boolean형과 char형을 제외한 기본형에만 사용할 수 있다.

3. 산술 연산자

  • 사칙 연산자 + 나머지 연산자

3.1 사칙 연산자 + - * /

  • 피연산자가 정수형인 경우 나누는 수로 0을 사용할 수 없다.
    • 실행시 에러(Runtime Error)가 발생한다.
    • 정확히는 ArithmeticException이 발생할 수 있다.
  • 나눗셈을 진행하는 경우 값 손실을 피하기 위해 피연산자 중 한쪽이라도 실수형으로 형변환 해야한다.
  • 리터럴 간의 연산은 컴파일러가 컴파일 시 계산해서 변수에 저장한다.
  • 수식에 변수가 들어가 있는 경우 컴파일러가 미리 계산을 할 수 없다. 따라서 명시적 형변환 해야한다.
  • int/int의 결과는 float, double이 아닌 int이다. 이 과정에서 나머지를 버림하게 된다.
    • 반올림이 필요하면 Math.round() 써라.

3.2 나머지 연산자 %

  • 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지값을 결과로 반환하는 연산자이다.
  • 나누는 수로 0을 사용할 수 없다.
  • 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.

4. 비교 연산자

  • 비교 연산자는 두 피연산자를 비교하는데 사용되는 연산자이다.
  • 주로 조건문과 반복문의 조건식에서 사용됨.
  • true, false 두가지 연산 결과를 가진다.
  • 이항 연산자이므로 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후 비교한다.

4.1 대소비교 연산자 < > ≤ ≥

  • 두 피연산자의 값의 크기를 비교한다.

4.2 등가비교 연산자 == ≠

  • 두 피연산자의 값이 같은지 다른지 비교하는 연산자.
  • 기본형의 경우 변수에 저장되어 있는 값이 같은지 비교한다.
  • 참조형의 경우 객체의 주소값이 같은지(같은 객체를 가리키고 있는지)를 비교한다.
  • 기본형과 참조형은 서로 형변환이 불가능하므로 등가비교 연산자로 비교할 수 없다.
  • 실수형은 근사값으로 저장되어 오차가 발생할 수 있다. 특히 실수형과 정수형을 비교하는 경우 발생할 수 있다. (10.0 ≠ 10.0f)
  • 실수형 간의 비교에서 float을 기준으로 형변환시켜 비교해야 한다.
    • float타입의 값을 double타입으로 형변환해도 오차가 적어지지 않는다.
    • 빈 부분을 0 혹은 1로 채우기 때문.

문자열의 비교

  • 두 문자열을 비교할 때는 비교 연산자 ==대신 equals()라는 메서드를 사용해야한다.
  • 두 문자열의 내용이 같은지 비교하기 위해 equals()를 사용한다.
  • 대소문자 구분하지 않고 비교하고 싶다면 equalsIgnoreCase()를 사용할 수 있다.

5. 논리 연산자

  • 둘 이상의 조건을 AND나 OR로 연결하여 하나의 식으로 표현할 수 있게 해준다.

5.1 논리 연산자 && || !

  • 피연산자로 boolean형 혹은 boolean형 값을 결과로 하는 조건식만 허용한다.
  • || (OR) : 피연산자 중 어느 한쪽만 true여도 true
  • && (AND): 피연산자 양쪽 모두 true여야 true

효율적인 연산(short circuit evaluation)

  • 논리 연산자는 효율적인 연산을 한다.
  • OR의 경우 좌측 피연산자가 참이면 우측 피연산자의 값은 평가하지 않는다.
  • AND의 경우 좌측 피연산자가 거짓이면 우측 피연산자의 값은 평가하지 않는다.

논리 부정 연산자 !

  • 참이면 거짓, 거짓이면 참으로

5.2 비트 연산자 & | ^ ~ << >>

  • 피연산자를 비트단위로 논리연산한다.
  • | (OR) : 피연산자 중 한 쪽의 값이 1이면 1을 결과로 얻는다. 아니면 0
  • & (AND): 피연산자 양쪽이 모두 1이여야만 1을 결과로 얻는다. 아니면 0
  • ^ (XOR): 두 연잔자의 값이 서로 다르면 1, 아니면 0

비트 전환 연산자 ~

  • 피연산자를 2진수로 표현했을 때 0은 1로, 1은 0으로 바꾼다. 논리 부정 연산자와 유사.
  • 1의 보수를 얻을 수 있다.
    • 이 때문에 비드 전환 연산자를 1의 보수 연산자라고도 한다.

쉬프트 연산자 << >>

  • 오른쪽 혹은 왼쪽으로 이동하는 연산자.
  • x >> n : x / 2^n
  • x << n : x * 2^n

6. 그 외의 연산자

6.1 조건 연산자 ? :

  • 삼항 연산자는 조건 연산자 뿐.
  • 조건식 ? 식1 : 식2
    • 조건식이 참이면 식1을 수행한다.
    • 조건식이 거짓이면 식2를 수행한다.
  • if문으로 간단하게 이해할 수 있다.

6.2 대입 연산자 = op=

  • 변수와 같은 저장 공간에 값 또는 수식의 연산 결과를 저장하는데 사용.
  • 오른쪽 피연산자의 값(식이라면 평가값)을 왼쪽 피연산자에 저장한다.
  • 저장된 값을 연산 결과로 반환한다.
  • 연산자들 중 가장 낮은 우선순위를 가진다.

l-value와 r-value

  • l-value: 왼쪽 피연산자
    • 반드시 변수처럼 변경할 수 있는 것이어야 한다.
    • 리터럴이나 상수같이 값을 저장할 수 없는 것들은 l-value가 될 수 없다.
  • r-value: 오른쪽 피연산자
    • 변수 뿐만 아니라 식이나 상수 등 모두 가능하다.

복합 대입 연산자

  • 대입 연산자는다른 연산자(op)와 결합하여 op=와 같은 방식으로 사용할 수 있다.
  • +=, -=, 등등
profile
더 나은 성취

0개의 댓글