728x90
ch9 - 21 ~ 24
StringBuilder, Math 클래스
ch9 - 21
StringBuilder
- StringBuffer 와 완전히 유사 하다.
- StringBuffer 는 동기화 되어 있다. 멀티 스레드에 안전 (thread-safe)
[ 참고 ]
싱글 스레드와 멀티 스레드가 있다.
싱글 스레드 : 한번에 1개의 작업.
멀티 스레드 : 한번에 n개의 작업.
지금까지 작성했던 코드 작성은 싱글 스레드의 개념 이였다.
카카오톡을 예시로 들어보자.
친구가 파일을 보내주면, 그 파일을 받고, 다운로드를 할 수 있다.
근데,
파일을 다운로드 하는 동안, 채팅을 할 수 없다면 ?
또는,
채팅을 하는 도중에는, 파일을 다운로드를 할 수 없다면 ?
즉, 동시에 작업을 진행 할 수 없다면 ?
=> 싱글 스레드 이다.
파일 다운로드 진행을 하면서, 동시에 채팅을 할 수 있다.
=> 멀티 스레드 이다.
그래서 요새 모든 프로그램 들은 멀티 스레드의 개념 이다.
하지만, 멀티 스레드의 단점이 존재 한다.
바로 한번의 n개의 작업을 동시에 하니까, 데이터를 공유 하게 된다.
노동 하는 사람을 예시로 들어보면,
여러개의 작업을 한사람이 하는게 아니라,
여러개의 작업을 여러 사람이 동시에 처리 한다면,
그것은 결국, 작업을 여러 사람들이 공유 하게 되는 것을 의미 한다.
즉, 누가 작업 하고 있는 도중에, 다른 사람이 그 작업을 건드릴 수 있게 된다.
그러면, 작업이 꼬이게 될 수도 있다.
이 작업이 프로그램 에서는 데이터가 되고,
즉, 동시에 작업을 하면 데이터가 꼬일 수 있는 여지가 존재 하게 된다.
이것을 막아주는게 "동기화" 개념 이다.
그래서 "동기화" 를 하면, 멀티 스레드에 안전 하게 된다는것이 이러한 개념 으로 볼 수 있다.
- 멀티 스레드 프로그램이 아닌 경우에는, 동기화는 불필요한 성능 저하를 일으키게 된다.
따라서, 이런 경우에는, StringBuffer 대신에 StringBuilder 을 사용 하면,
동기화 기능이 없기 때문에, 성능이 향상 된다. (싱글 스레드)
StringBuffer sb;
sb = new StringBuffer();
sb.append("abc");
↓
StringBuilder sb;
sb = new StringBuilder();
sb.append("abc");
멀티 스레드 작업이 아니라면, StringBuilder 을 사용 하면 된다.
클래스만 StringBuilder 으로 변경하면 되고, 그외 나머지는 모두 동일 하다.
더 자세한 내용은 "스레드" 개념을 공부.
ch9 - 22
Math 클래스
- 수학 관련 static 메서드의 집합
static 메서드 이기 때문에,
instance variable (인스턴스 변수 == iv) 가 없고,
따라서,
객체를 만들 필요가 없게 된다. (인스턴스화 할 필요가 없다)
public static final double E = 2.7182818284590452354; // 자연 로그의 밑.
public static final double PI = 3.14159265358979323846; // 원주율. (파이)
- round() 메서드로 원하는 소수점 아래 세 번째 자리에서 반올림이 가능.
1. 원래 값에 100을 곱한다.
90.7552 * 100 -> 9075.52
2. 위의 결과에 Math.round(9075.52) -> 9076
(소수점 아래 첫자리에서 반올림)
3. 위의 결과를 다시 100.0 으로 나누게 되면 ?
9076 / 100.0 -> 90.76
9076 / 100 -> 90
그냥 100으로 나누면, 결과가 90이 된다.
왜냐하면, 100은 int 이기 때문에, 소수점이 사라지기 때문 이다.
따라서, 100.0 으로 나눠서 소수점을 확실하게 처리 할 수 있도록 해줘야 한다.
float 나 double 로 나눠 주면 된다. (실수)
그래야 소수점 아래의 숫자들도 정확히 얻을 수 있게 된다.
ch9 - 23
Math 클래스의 메서드
abs >> absoulte (절대값)
ceil >> 올림 (천장)
floor >> 버림 (바닥)
max >> 두 값을 비교 해서 큰 숫자 반환.
min >> 두 값을 비교 해서 작은 숫자 반환.
rint >> 짝수 반올림 이다.
round >> 일반 반올림 이다. (무조건 반올림)
예시 01 )
import static java.lang.Math.*;
import static java.lang.System.*;
class Ex9_13 {
public static void main(String args[]) {
double val = 90.7552;
out.println("round(" + val + ") = " + round(val));// 반올림
val *= 100;
out.println("round(" + val + ") = " + round(val));// 반올림
out.println("round(" + val + ")/100 = " + round(val) / 100); // 반올림
out.println("round(" + val + ")/100.0 = " + round(val) / 100.0); // 반올림
out.println();
out.printf("ceil(%3.1f) = %3.1f%n", 1.1, ceil(1.1)); // 올림
out.printf("floor(%3.1f) = %3.1f%n", 1.5, floor(1.5)); // 버림
out.printf("round(%3.1f) = %d%n", 1.1, round(1.1)); // 반올림
out.printf("round(%3.1f) = %d%n", 1.5, round(1.5)); // 반올림
out.printf("rint(%3.1f) = %f%n", 1.5, rint(1.5)); // 반올림
out.printf("round(%3.1f) = %d%n", -1.5, round(-1.5)); // 반올림
out.printf("rint(%3.1f) = %f%n", -1.5, rint(-1.5)); // 반올림
out.printf("ceil(%3.1f) = %f%n", -1.5, ceil(-1.5)); // 올림
out.printf("floor(%3.1f) = %f%n", -1.5, floor(-1.5)); // 버림
}
}
[ console ]
반응형
'Java의 정석 > java.lang 패키지 & 유용한 클래스' 카테고리의 다른 글
문자열과 숫자 변환, 오토박싱 & 언박싱 (0) | 2023.09.02 |
---|---|
래퍼 클래스, Number 클래스 (0) | 2023.09.02 |
StringBuffer 클래스의 메서드 (0) | 2023.09.02 |
StringBuffer 클래스 (문자열 저장 & 다루기) (0) | 2023.09.01 |
StringJoiner, 문자열과 기본형 변환 (0) | 2023.09.01 |