반응형

StringBuilder

  • StringBuffer는 동기화되어 있다. 멀티 쓰레드에 안전(thread-safe)

 

StringBuilder클래스는 StringBuffer와 똑같다. 다만, 한가지 차이점이 있다.
StringBuffer는 동기화 처리가 되어있는 한편, StringBuilder는 동기화 처리가 되어있지 않다.

동기화가 뭐냐면, 멀티 쓰레드에 안전하게하는 것을 동기화라고 한다.

 

싱글 쓰레드와 멀티 쓰레드가 있는데,
싱글 쓰레드는 한번에 1개의 작업만 하는 것이다.
멀티 쓰레드는 한번에 여러개의 작업을 하는 것이다.

우리가 지금까지 작성했던 것들은 전부다 싱글 쓰레드다.

13장에서 멀티 쓰레드로 프로그래밍 하는 것을 공부할 예정이다.

한번에 n개씩 작업한다는 것은 무슨 의미냐면,
카카오톡같은 경우에 채팅을 하면 풍선말이 생기는데,
친구가 파일을 보내주면, 그 파일을 내가 다운받게 되는데,
이 파일이 다운되는동안에도 채팅할 수 있는 것을 의미한다.

싱글 쓰레드라면, 파일이 다운되는 동안 채팅할 수 없다.

즉,
1. 파일다운로드
2. 채팅
이 두가지 작업을 동시에 작업할 수 있는 것이 멀티 쓰레드이다.

이러한 멀티 쓰레드에도 단점이 있는데,
한번에 여러작업을 같이하다보니까 데이터를 공유한다.
공유하고 있는 데이터를 다른 작업에서 건드릴 수 있다.
그러면, 데이터가 꼬일 수 있다. 이러한 것을 막아주는 것이 "동기화"이다.

즉, "동기화"는 데이터를 보호하는 것이다.

위에서 설명한 StringBuffer는 동기화 되어 있어서 멀티 쓰레드에 안전하다는 말이 이해되었을 것이다.
자세한것은 13장에서 공부하자.

어쩃든, StringBuffer와 StringBuilder의 차이점은 "동기화 여부"

StringBuffer는 동기화 되어있고,
StringBuilder는 동기화 되어있지 않다.

 

  • 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능 저하

그런데, 이 동기화는 멀티 쓰레드 프로그램이 아닌 경우, 불필요하다. (성능저하 될 수 있음)

  • 이럴 때는 StringBuffer대신 StringBuilder를 사용하면 성능 향상

그래서, 싱글 쓰레드 프로그램일 때는, StringBuffer대신, StringBuilder를 사용해서 성능을 향상시키는 것이 권장사항이다.

 

그래서 싱글 쓰레드 작업인 경우,
좌측코드를 우측코드처럼 StringBuffer대신 StringBuilder를 사용하면 된다.

 


 

Math클래스

  • 수학관련 static메서드의 집합

Math클래스는, 수학관련된 메서드를 모아놓은 클래스이다.
이 메서드들은 전부 iv는 없고 메서드만 있기때문에 static메서드이다.
iv가 없으므로 객체를 만들 필요가 없다.

 

이 코드에는 상수가 2개 있다. E, PI
E는 자연로그의 밑, PI는 원주율이다.

 

  • round()로 원하는 소수점 아래 세 번째 자리에서 반올림하기

 

90.7552를 소수점 셋째자리에서 반올림하고싶으면 어떻게 하면 될까?

먼저, 90.7552에 *100을 한다. 소수점을 두자리 옮겨준다. 그러면 9075.52가 되는데,

여기다가 Math.round(9075.52)를 하게되면, 9076이 된다.

그리고 이 결과를 다시 100.0으로 나누는 9076/100.0 을 하면,90.76이 된다.

즉, 처음에 구하려고 했던 907552를 소수점 셋째자리에서 반올림한 값을 구할 수 있다.

 


 

Math클래스의 메서드

 

static doulbe abs(double a)
static float abs(float f)
static int abs(int f)
static long abs(long f)
는 전부, 절대값을 반환하는 메서드이다.  양수는 양수로, 음수는 양수로 반환한다.
int i = Math.abs(-10); 을 하면 i = 10이 된다.

static double ceil(double a)은 주어진 값을 올림하는 메서드다.
double d = Math.ceil(10.1);을 하면  d = 11.0이다.
double d2 = Math.ceil(-10.1);을 하면 d2 = -10.0이다.

static double floor(double a)는 주어진 값을 버림하여 반환한다.
double d = Math.floor(10.8);을 하면 d = 10.0이다.
double d2 = Math.floor(-10.8);을 하면 d2 = -11.0이다.

static double max(double a, double b)는 double a와 double b를 비교하여 큰 쪽을 반환한다.
double d = Math.max(9.5, 9.50001);을 하면, d = 9.50001이 반환된다.
int i = Math.max(0, -1);을 하면  i = 0이 반환된다.

 

 

static double min(double a, double b)는 주어진 두 값을 비교하여 작은 쪽을 반환한다.
double d = Math.min(9.5, 9.50001); 을 하면 d = 9.5를 반환한다.
int i = Math.min(0, -1);을 하면 Math.min(0, -1);을 하면 i = -1을 반환한다.

static double random()은 0.0~1.0범위의 임의의 double값을 반환한다. (1.0은 범위에 포함되지 않는다. )
doubl 3 = Math.random(); 을 하면, 0.0 <= d < 1.0 의 d를 반환한다.
Int i = (int)(Math.random()*10) + 1을 하면, 1 <= i < 11의 i를 반환한다.

static double rint(double a)
static long round(double a)
는 둘다 반올림 메서드인데,
반올림 하는 방법이 다르다.

static double rint(double a)는 짝수반올림이다.
double d = Math.rint(1.2);를 하면 d = 1.0을 반환하고,
double d2 = Math.rint(2.6);을 하면 d2 = 3.0을 반환한다.
double d3 = Math.rint(3.5);을 하면 d3 = 4.0을 반환한다.
double d4 = Math.rint(4.5);을 하면 d4 = 4.0을 반환한다.

소수점 첫째자리가 5일 때, 정수부분이 홀수면 올림을 하고, 짝수면 버림을 한다.
그래서 round보다 좀더 정확도가 높다.

static double round(double a)는 일반적인 반올림이다.
long l = Math.round(1.2); 일때 l = 1이고,
long l2 = Math.round(2.6); 일 때 l2 = 3이고,
long l3 = Math.rount(3.5); 일 때 l3 = 4이고,
long l4 = Math.round(4.5);일 때 l4 = 5이다.

double d = 90.7552; 일 때,
double d2 = Math.round(d*00)/100.0;을 하면 d2 = 90,76이다.

 

반응형

'JAVA' 카테고리의 다른 글

오토박싱 & 언박싱, 문자열과 숫자변환  (0) 2022.04.19
래퍼 클래스, Number 클래스  (0) 2022.04.18
StringBuffer 클래스의 메서드  (0) 2022.04.16
StringBuffer 클래스  (0) 2022.04.15
StringJoiner, 문자열과 기본형 변환  (0) 2022.04.15