일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- string
- 코딩테스트
- implement
- Math
- Binary Search
- database
- Class
- greedy
- 구현
- bit manipulation
- SQL
- Number Theory
- Data Structure
- simulation
- Tree
- geometry
- hash table
- array
- java
- Binary Tree
- dynamic programming
- 코테
- Matrix
- Method
- Counting
- sorting
- 자바
- Stack
- two pointers
- Today
- Total
코린이의 소소한 공부노트
산술 연산자와 산술 변환 본문
산술 연산자는 수 연산을 담당하고 있는 연산자이다. 종류와 기능은 아래 링크에 자세히 설명되어있다.
2021.12.28 - [Java] - 연산자(operator)의 종류와 우선순위, 결합규칙
해당 글의 내용 중 나눗셈 설명 부분만 보면, 빨간색 글씨 부분이 영 시원치 않다.
4) / 나누기
System.out.println(11 / 3); // 3
System.out.println(11.0 / 3); // 3.666...
System.out.println(12 / 3); // 4
- 이항 연산자
- 두 피연산자의 나눗셈 결과를 반환한다.
- 정수 간의 나눗셈의 경우, 나눈 몫을 반환한다.
정수와 실수, 실수와 실수 간의 나눗셈은 2번째 코드처럼 결과가 나온다. 하지만 정수 간의 나눗셈은 위에서 설명한 것처럼 몫을 반환하게 된다. 피연산자에 실수가 있을 때와 없을 때 연산 결과에 차이가 나이가 나는 이유는 산술 변환 때문이다. 그래서 내가 의도하는 바에 맞게 정수끼리의 나눗셈 또는 실수가 섞인 나눗셈을 하면 된다.
산술 변환은 연산 전에 피연산자의 타입을 일치시키는 것을 말한다. 이 변환에는 2가지 규칙이 있다.
1. 두 피연산자의 타입을 비교해 더 큰 타입으로 일치시킨다.
// 같은 정수형
// int(4 byte) < long(8 byte)
int + long -> long + long -> long
// 같은 실수형
// float(4 byte) < double(8 byte)
float + double -> double + double -> double
// 정수형 < 실수형
int + float -> float + float -> float
long + float -> float + float -> float
이 이유는 아래 링크에 설명되어있다. 링크 글 아래쪽에 요약본이 있으니 그것을 읽어봐도 무방하다.
2021.12.29 - [Java] - 형변환(type casting)
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
정수형의 접미사에 대해 생각해보면,
- int는 정수형의 기본형으로 정수 리터럴을 쓰고 접미사는 없다.
- long은 int와 같은 리터럴을 쓰면서 접미사 L(소문자도 가능)을 붙인다.
- byte와 short은 int와 같은 리터럴을 쓰고, int가 아닌데도 아무런 접미사를 쓰지 않는다.
long은 접미사를 쓰지만 byte와 short이 접미사가 없는 이유가 산술 변환으로 설명된다.
// byte + short -> short + short -> short (X)
byte + short -> int + int -> int
// 문자형 2 byte + 숫자형 2 byte의 결과는??
char + short -> int + int -> int
long과는 달리 byte, short, char를 접미사를 붙여서 구분하는 것보다 int로 변환하는 것을 선택한 이유는 해당 타입의 범위가 너무 작아서 연산 시 overflow가 발생하는 일이 너무 많아지기 때문이다. 예를 들면,
// short의 범위는 대략 -3만~+3만
short s = 300;
short result = s*s; // error: type mismatch
short은 int로 산술 변환되기 때문에 s*s의 결과는 int가 된다. 이때 int는 short보다 범위가 크기 때문에 형변환 없이 대입하려고 해서 에러가 발생한 것이다.
int로 변환되는 규칙 때문에 에러가 발생할 수도 있지만, 이 규칙 덕분에 1가지 재밌는 계산을 할 수 있다.
System.out.println('7'-'0'); // 7
// '7'의 코드는 55
// '0'의 코드는 48
char + char -> int + int -> int
char는 int보다 작은 타입이라 int로 변환돼서 55 - 48 = 7이 되는 것이다.
[쿠키글] Math 클래스 - 산술 연산에 필요한 메서드나 상수를 제공해준다.
1. Math.round()
round 메서드는 실수의 소수 첫째 자리에서 반올림한 결과를 반환해준다.
// 3.141592를 3.14로 만들기
double pi = 3.141592;
double shortPi = Math.round(pi * 100) / 100.0;
// -> double shortPi = Math.round(314.1592) / 100.0;
// -> double shortPi = 314 / 100.0;
// -> double shortPi = 3.14
System.out.println(shortPi); // 3.14
우리가 3.141592를 3.14로 만들려면 소수 셋째 자리에서 반올림하면 그만이지만, round는 첫째 자리에서 반올림하기 때문에 100을 곱해 소수 셋째 자리를 소수 첫째 자리로 만들어서 round 메서드를 사용해야 한다. 그리고 다시 원래대로 돌아가기 위해 다시 100으로 나눠줘야 하는데, 여기서 100.0이 아닌 100으로 나누게 되면 정수 간의 나눗셈이 되어 3.14가 아닌 3이 반환되므로 조심해야 한다.
2. Math.random()
random 메서드는 0 이상 1.0 미만의 임의의 double값을 반환하는 메서드이다.
// 0 <= x < 1인 double값 5개 출력
for (int i = 1; i <= 5; i++) {
System.out.println(Math.random());
}
// 0.4920414497208425
// 0.6999178505636193
// 0.9585977499718097
// 0.8705568182170237
// 0.07470437599367685
이를 이용해 우리가 원하는 범위의 값도 임의 추출을 할 수 있다. 보통 정수를 많이 쓰니 정수를 기준으로 설명하겠다.
1) 주사위를 10번 던진다.
0.0 <= Math.random() < 1.0
// 주사위는 1부터 6까지 6개의 숫자로 이루어져있다.
// 1) 6을 곱하고 int로 형변환한다.
0 <= (int)(Math.random() * 6) < 6
// 2) 1부터 시작하므로 1을 더해준다.
1 <= (int)(Math.random() * 6) + 1 < 7
// 3) 10번 던지는 것을 표현하기 위해
// for문을 10번 돌린다.
for (int i = 1; i <= 10; i++) {
System.out.println((int)(Math.random() * 6) + 1);
}
2) -5부터 5 사이의 정수 5개 임의 추출
0.0 <= Math.random() < 1.0
// -5 이상 5 이하의 정수의 개수는 11개이다.
// 1) 11을 곱하고 int로 형변환한다.
0 <= (int)(Math.random() * 11) < 11
// 2) -5부터 시작하므로 5을 빼준다.
-5 <= (int)(Math.random() * 11) - 5 < 6
// 3) 5번 임의추출하는 것을 표현하기 위해
// for문을 5번 돌린다.
for (int i = 1; i <= 5; i++) {
System.out.println((int)(Math.random() * 11) - 5);
}
2), 3)번의 내용은 이해가 갈 것이라 생각하고 1)번만 설명하겠다.
원래 random 메서드의 구간의 크기는 1.0 - 0.0 = 1이기 때문에, 내가 원하는 값의 개수가 n개라면 n을 곱해야 구간의 크기가 n - 0 = n이 되어 원하는 값을 추출할 수 있다. 그래서 주사위 문제에서는 6을, 임의 추출 문제에서는 11을 곱한 것이다.
'Java' 카테고리의 다른 글
조건 연산과 대입 연산 (0) | 2022.01.01 |
---|---|
비교 연산과 논리 연산 (0) | 2021.12.31 |
형변환(type casting) (0) | 2021.12.29 |
연산자(operator)의 종류와 우선순위, 결합규칙 (0) | 2021.12.28 |
정수의 오버플로우(overflow) (0) | 2021.12.16 |