일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- til
- 개발자취업
- 예외클래스
- 일반 예외
- 예외 처리
- 코딩테스트준비
- 예외
- 항해99
- 99클럽
- 로켓펀치 #취준컴퍼니 #취업 #일상 #취준생
- try-catch-finally 블록
- 실행 예외
- 다중 catch 블록
- throws 키워드
- Today
- Total
innn
[3주차] 연산자 본문
목표 : 자바가 제공하는 다양한 연산자 학습
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- 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형으로 자동형변환을 하는 시점에서는 이미 오버플로우가 발생하여 값이 변조되었기 때문에 형변환이 된다한들 값이 변하지 않는 것이다.
그렇기에 해당 연산이 진행되기 전 하나의 피연산자를 충분한 크기의 자료형으로 형변환을 해서 타입일치를 시켜 충분한 범위를 확보해야 한다.
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가 출력된다.
'JAVA > 스터디 자료 필타' 카테고리의 다른 글
[JAVA] 변수 (클래스 변수, 인스턴스 변수, 지역 변수) (0) | 2022.07.01 |
---|---|
[2주차] 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.06.04 |