일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- 개발입문
- 리터럴
- 사용자입력
- 자바클래스
- 변수
- 알고리즘
- 코드업자바
- 코딩테스트
- Algorithm
- 코드업
- 기초프로그래밍
- SWEA파이썬
- C#프로그래밍
- 제어구조
- 백준파이썬
- Java
- 수학연산
- C#변수
- 디자인패턴
- SWEA
- 코드업100제자바
- 자바연산자
- 코드업100제
- 프로그래머스파이썬
- 자바
- Literal
- VARIABLE
- c#
- Codeup
- 백준
- Today
- Total
제니노트
사칙 연산자, 산술 변환 [자바] 본문
산술 연산자
사칙 연산자
사칙연산자에는 덧셈(+),뺄셈(-),곱셈(*),나눗셈(/)이 있다.
class Ex5 {
public static void main(String args[]) {
int a = 10;
int b = 4;
System.out.printf("%d + %d = %d\n", a, b, a + b);
System.out.printf("%d - %d = %d\n", a, b, a - b);
System.out.printf("%d * %d = %d\n", a, b, a * b);
System.out.printf("%d / %d = %d\n", a, b, a / b);
System.out.printf("%d / %f = %f\n", a, float(b), a / float(b));
결과
10 + 4 = 14
10 - 4 = 6
10 * 4 = 40
10 / 4 = 2
10 / 4.000000 = 2.500000
10/4의 경우 2.5가 아닌 2가 나오는 것을 볼 수 있다.
int 10 / int 4 = int 2 //소수점이하는 버려진다.
따라서
int 10 / float 4.0f -> float 10.0f / float 4.0 -> float 2.5f
로 변경해줘야 올바른 값이 나온다.
두 피연산자의 타입이 일치하지 않으므로, float 타입으로 일치시킨 후에 연산을 수행하는 것을 알 수 있다. float -> int 의 경우 값손실이 있으므로 float 로 변경되는 것이다.
산술 변환
위의 연산과정을 본다면, 두 피연산자의 타입이 일치하지 않으므로, float 타입으로 일치시킨 후 연산을 수행한다.
이것이 바로 산술 변환이다.
이는 규칙이 있는데
1) 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
이는 값손실이 일어나지 않도록 큰 타입으로 맞춰주는 것이다.
long + int -> long + long -> long
8bit 4bit 8 8 8
float + int -> float + float -> float
double + float -> double + double -> double
float의 예시로. float는 4byte이고 int 는 4byte이다. 하지만 표현범위는 float 가 더 크므로 float float 연산으로 바뀐다.
또한 double은 8byte이고 float는 4byte이다. 표현범위는 double이 더 크므로 float가 double로 바뀐다.
그 후 반환은 일치된 타입으로 반환된다.
2) 피연산자의 타입이 int 보다 작은 타입이면 int로 변환된다.
byte + short -> int + int -> int
char + short -> int + int -> int
int 보다 작은 타입에는 byte,short,char 가 있다.
char은 2byte, short 2byte의 char 1byte 이다. 이는 다 연산 시 int형으로 변환된다.
왜그럴까?
byte는 범위가 -128~127. char은 0~6만 short는 ±3만이다.
예를 들어 300*300의 연산을 가정하면 답이 9만이다. 이렇게 별거 아닌 작은 계산을 해도 위의 범위를 쉽게 넘어버린다.
범위를 벗어나면 오버플로우가 발생하므로 바람직하지 않은 결과가 나온다.
이를 막으려고 일단 int 로 바꿔주는 것이다.
그러면 overflow가 발생하지 않아 잘못된 결과가 나오지 않는다.
'2'-'0' 의 경우를 한번 보자
char - char의 연산은 그럼 int - int 로 바뀐다.
int 보다 작은 타입이므로 int로 바뀌는 것이다
문자 2는 유니코드 문자표에서 '2'는 50에 대입되고 '0'은 48에 대입된다.
따라서 답은 2이다.
이는 문자를 숫자로 바꿀 때 사용되는 방법인데
유니코드의 경우 연속적으로 배치되어있으므로 50-48 = 2 이므로 이 방법이 가능한 것이였다
바로'2'를 int 형으로 변환하면 (int)'2' 50으로 되니 이에 유의하자
참고 : https://www.youtube.com/watch?v=gz0jjUBITtw&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=27
'Java > Java 입문' 카테고리의 다른 글
비교 연산자,문자열의 비교 [자바] (0) | 2023.06.23 |
---|---|
반올림 Math.round(),나머지 연산자 [자바] (0) | 2023.06.10 |
형변환 연산자, 자동 형변환 [자바] (0) | 2023.06.09 |
증감연산자,부호연산자 [자바] (0) | 2023.05.31 |
연산자의 우선순위와 결합법칙 [자바] (0) | 2023.05.31 |