Ch9-21~24. Math
0. 목차
Chapter9. java.lang 패키지와 유용한 클래스
Ch9 - 21. StringBuilder
Ch9 - 22. Math 클래스
Ch9 - 23. Math의 메서드
Ch9 - 24. Math의 메서드 예제
Ch9 - 21. StringBuilder
▶ StringBuilder란?
▷ StringBuilder ≒ StringBuffer
▶ StringBuilder와 StringBuffer의 차이점
▷ StringBuilder : 동기화X - 싱글 쓰레드 프로그램
▷ StringBuffer : 동기화O - 멀티 쓰레드 프로그램
▷ 동기화 : 멀티 쓰레드에 안전하게 하는 것(thread-safe)
- 싱글 쓰레드 : 한 번에 한 개의 작업
ex) 채팅창에서 파일 다운을 받는 동안은 채팅 못함 - 멀티 쓰레드 : 한 번에 n개의 작업
ex) 채팅창에서 파일 다운을 받는 동안 채팅 동시 진행 가능 - 멀티 쓰레드의 단점
- 여러 명이서 데이터 공유
- 데이터를 공유하다가 데이터가 손상 될 수 있음
- 이 때 데이터를 보호 해 주는 것이 동기화
- 여러 명이서 데이터 공유
▷ 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요 → 오히려 성능 저하
▷ 이럴 때 StringBuffer 대신 StringBuilder 사용하면 성능 향상
- 멀티 쓰레드 프로그램
StringBuffer sb; sb = new StringBuffer(); sb.append("abc");
- 싱글 쓰레드 프로그램으로 변경
StringBuilder sb; // StringBuffer → StringBuilder sb = new StringBuilder(); // StringBuffer → StringBuilder sb.append("abc");
StringBuffer → StringBuilder만 바꿔주고 다른 건 바꾸지 않아도 됨
Ch9 - 22. Math 클래스
▶ Math 클래스란?
▷ 수학관련 static 메서드의 집합
▷ static : 객체 생성 없이 사용 가능
▶ Math.round()로 소수점 아래 세 번째 자리에서 반올림
▷ 원래 값에 ×100
90.7552 * 100
// console
9075.52
▷ Math.round()사용 : 소수점 아래 첫자리에서 반올림
Math.round(9075.52)
// console
9076
▷ 다시 100.0으로 나눔
9076 / 100.0 // int ÷ double = double
// console
90.76 // double
9076 / 100 // int ÷ int = int
// console
90 // int
Ch9 - 23. Math의 메서드
▶ static double abs(double d)
▶ static float abs(float f)
▶ static int abs(int i)
▶ static long abs(long l)
▷ 주어진 값의 절대값을 반환
▷ 양수 → 양수
▷ 음수 → 양수
int i = Math.abs(-10);
double d = Math.abs(-10.0);
// console
10 // i
10.0 // d
▶ static double ceil(double d)
▷ ceil : 천장 → 숫자 올라감
▷ 주어진 값을 올림하여 반환
▷ 올림
▷ 반올림 아님 주의!
double d1 = Math.ceil(10.1);
double d2 = Math.ceil(-10.1);
double d3 = Math.ceil(10.000000015);
// console
11.0 // d1 10.1
-10.0 // d2 -10.1, -11 아님 주의!
11.0 // d3 10.000000015
▶ static double floor(double d)
▷ ceil : 바닥 → 숫자 내려감
▷ 주어진 값을 버림하여 반환
double d1 = Math.floor(10.9);
double d2 = Math.floor(-10.9);
// console
10.0 // d1 10.9
-11.0 // d2 -10.9, -10 아님 주의!
▶ static double max(double d, double d2)
▶ static float max(float f, float f2)
▶ static int max(int i, int i2)
▶ static long max(long l, long l2)
▷ 주어진 두 값을 비교하여 큰 쪽을 반환
double d = Math.max(10.9, 10.555555503);
int i = Math.max(0, -1);
// console
10.9 // d
0 // i
▶ static double min(double d, double d2)
▶ static float min(float f, float f2)
▶ static int min(int i, int i2)
▶ static long min(long l, long l2)
▷ 주어진 두 값을 비교하여 작은 쪽을 반환
double d = Math.min(10.9, 10.555555503);
int i = Math.min(0, -1);
// console
10.555555503 // d
-1 // i
▶ static double random()
▷ 0.0 ≤ 범위 < 1.0 범위에서
▷ 임의의 double 값을 반환
double d = Math.random(); // 0.0 ≤ d < 1.0 → 0.0 ~ 0.999999999999999...
int i = (int)(Math.random() * 10) + 1; // (int)(0.0*10) + 1 ≤ i < (int)(1.0*10) + 1 → 1 ~ 10
// console
0.05974693674939824 // d
7 // i
▶ static double rint(double d)
▷ 주어진 double 값과 가장 가까운 정수 값을 double로 반환
▷ 단, 두 정수의 가운데 있는 값
▷ 1.5, 2.5, 3.5 등은
▷ 짝수를 반환
double d1 = Math.rint(1.2);
double d2 = Math.rint(2.6);
double d3 = Math.rint(3.5);
double d4 = Math.rint(4.5);
// console
1.0
3.0
4.0
4.0
▶ static long round(double d)
▶ static long round(float f)
▷ 소수점 첫째 자리에서 반올림한 정수 값(long)을 반환
▷ 두 정수의 가운데 있는 값은 항상 큰 정수를 반환
▷ round() ≠ rint()
long l1 = Math.round(1.2);
long l2 = Math.round(2.6);
long l3 = Math.round(3.7);
long l4 = Math.round(4.5);
// console
1
3
4
5
Ch9 - 24. Math의 메서드 예제
▶ round() vs rint()
▷ round()와 rint() 반올림 : 0.0 ~ 2.0
public static void main(String[] args) {
for (double d = 0.0; d <= 2.0; d += 0.1) {
double d1 = Math.round(d);
double d2 = Math.rint(d);
// console
d_round_rint
0.0 0.0 0.0
0.1 0.0 0.0
0.2 0.0 0.0
0.3 0.0 0.0
0.4 0.0 0.0
0.5 1.0 0.0 // round() ≠ rint()
0.6 1.0 1.0
0.7 1.0 1.0
0.8 1.0 1.0
0.9 1.0 1.0
1.0 1.0 1.0
1.1 1.0 1.0
1.2 1.0 1.0
1.3 1.0 1.0
1.4 1.0 1.0
1.5 2.0 2.0 // round() = rint()
1.6 2.0 2.0
1.7 2.0 2.0
1.8 2.0 2.0
1.9 2.0 2.0
▷ 왜 다를까?
0.5 1.0 0.0 // round() ≠ rint()
1.5 2.0 2.0 // round() = rint()
▷ round()와 rint() 반올림 : 1.5 ~ 10.5
d_round_rint
1.5 2.0 2.0
2.5 3.0 2.0 // round() ≠ rint()
3.5 4.0 4.0
4.5 5.0 4.0 // round() ≠ rint()
5.5 6.0 6.0
6.5 7.0 6.0 // round() ≠ rint()
7.5 8.0 8.0
8.5 9.0 8.0 // round() ≠ rint()
9.5 10.0 10.0
10.5 11.0 10.0 // round() ≠ rint()
▷ 정수의 가운데(_.5)에서 round()와 rint() 반올림 차이
▷ 반올림에도 종류가 다양
-
round() : HALF_UP
무조건 올림 -
rint() : round even
even : 짝수
짝수가 나오면 올려줌
▷ 정확도 = rint() > round()
public static void main(String[] args) {
double sum = 0;
double sum1 = 0;
double sum2 = 0;
for (double d = 1.5; d <= 10.5; d++) {
double d1 = Math.round(d);
double d2 = Math.rint(d);
sum += d;
sum1 += d1;
sum2 += d2;
}
// console
d_round_rint
1.5 2.0 2.0
2.5 3.0 2.0
3.5 4.0 4.0
4.5 5.0 4.0
5.5 6.0 6.0
6.5 7.0 6.0
7.5 8.0 8.0
8.5 9.0 8.0
9.5 10.0 10.0
10.5 11.0 10.0
---
d_round_rint
60.0 65.0 60.0