innn

[3주차] 연산자 본문

JAVA/스터디 자료 필타

[3주차] 연산자

33삼 2022. 6. 5. 20:40

목표 : 자바가 제공하는 다양한 연산자 학습

 

학습할 것 

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch operator

 

1. 산술 연산자

산술(arithmetic) 연산자는 수학적인 계산에 사용되는 연산자다

산술 연산자는 산술(arithmetic)이라는 의미 그대로 수학적인 계산에 사용되는 연산자로 유치원 및 초등학생 때 배우는 덧셈, 뻴셈, 곱셈, 나눗셈 등의 수학적 기호 연산자 를 뜻한다. 다만, 수학에서 사용하는 연산자와 프로그래밍에서 사용하는 연산자는 의미가 조금 다르니 그에 대해 살펴본다.

 

사칙 연산자( +  -  *  / )

덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)은 정말 자주 쓰이는 연산자로 모두가 잘 아는 사칙연산이다.

우선순위 역시 동일하게 적용되어 곱셈과 나눗셈은 덧셈이나 뺄셈보다 높기에 우선 적용된다.

 

  • 사용 예제코드

 

  • 실행 결과

(1): 10 / 4이면 2.5가 맞지만 출력 결과를 보면 2가 나온다 왜그럴까? 그 이유는 자료형에 있습니다. 연산에 사용된 두 피연산자는 모두 int 형이다.. 그럼 연산결과 역시 int형으로 반환을 하는데 결과값인 2.5는 실수형이기에 소숫점을 버리고 정수형인 2로 반환을 합니다. 그리고 이 때, 소숫점은 버림을 하지 반올림을 하지 않는다.

 

그럼 어떻게 소숫점까지 표현한 정확한 결과를 얻을 수 있을까? 그럼 피연산자중 한 쪽을 실수형으로 변환해야 한다. 위 예제코드 중 (2) 항목을 보면 b를 실수형(float)으로 변경해주었다.

 

위의 연산과정을 보면 두 피연산자의 타입이 각각 int형과 float형으로 일치하지 않기에 타입을 맞춰줘야하는데, 보통 범위가 넓은 쪽으로 매치가 되기에 int보다 범위가 넓은 float타입으로 일치시킨 뒤 연산을 수행한다.

 

 

피연산자가 정수형인 경우 나누는 수로 0을 사용하면 에러가 발생한다.

피연산자가 정수형인 경우, 나누는 수로 0을 사용하게 될 경우 ArithmeticException이 발생한다.

0이 아닌 부동 소숫점값(0.0f, 0.0d)를 사용하는것은 가능하지만 이 경우엔 무한대(Infinity)가 반환된다.

 

피연산자가 유한수가 아닌 경우의 연산결과

 

작은 범위로의 형변환도 가능하다.

 

 

int형 피연산자와 float형 피연산자간에 산술연산을 하면 범위가 더 큰 쪽으로 자동 캐스팅되어 연산을 수행한다. 그럼 int형으로 결과를 받고싶을 경우엔 어떻게 해야할까? 명시적 형변환을 해주면된다.

 

[실행 결과]

2

44

 

대신, 더 좁은 범위로 형변환을 하는 것이기 때문에 값의 손실이 발생할 수 있다.

 

 

⇒ int형을 byte형으로 변환하는경우 하위 8자리(1byte)만 보존하기에 그외에 값이 손실된다.

 

연산전에 충분히 큰 자료형을 사용해서 오버플로우를 막아라.

 

 

value로 무엇이 출력될까? 2 x 10¹² 값을 long(8 byte)에 저장하니 정상적으로 출력이 될 것 같지만, 실제로 출력 되는 값은-1454759936 로 엉뚱한 값이 출력된다. 그 이유는 long형으로 자동형변환을 하는 시점에서는 이미 오버플로우가 발생하여 값이 변조되었기 때문에 형변환이 된다한들 값이 변하지 않는 것이다.

 

int형 연산으로 overflow 발생

 

그렇기에 해당 연산이 진행되기 전 하나의 피연산자를 충분한 크기의 자료형으로 형변환을 해서 타입일치를 시켜 충분한 범위를 확보해야 한다.

 

 

1. a가 long으로 형변환되며 충분한 범위 확보

2. a와 b의 타입이 일치하지 않기 때문에 더 넓은 범위인 long으로 b를 형변환하여 타입 일치

3. 연산 수행하여 value에 대입

 

문자도 산술연산이 가능하다.

 

산술연잔자를 숫자형의 자료형 뿐 아니라 문자도 가능하다. 가능한 이유는 문자도 실제로 해당 문자의 유니코드(부호없는 정수)로 바꾸어 저장되기 때문이다.

 

 

⇒ c의 유니코드는 99이고, b의 코드는 98이다. 그렇기에 'c' - 'b'는 99 - 98이 되며 결과값은 1이된다.

이를 응용하면 특정 문자의 다음 문자값을 가져오는것도 가능하다.

 

 

c의 코드는 99이며 여기에 1을 더한 값인 100을 다시 char로 형변환 해준다면 d가 출력된다.