2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 17] 다단계 연산을 도와주는 가변 동반 클래스 #53

Closed NuhGnod closed 1 year ago

NuhGnod commented 1 year ago

p.110에서 성능문제에 대처하는 방법으로 다단계 연산들을 예측하여 기본 기능으로 제공하는 방법을 소개하고 있습니다. 이때 BigInteger클래스에서는 모듈러 지수 같은 가변 동반 클래스를 사용한다고 되어있습니다. String클래스는 StringBuilder 라는 가변 동반 클래스를 사용하고 있다고 하는데,

이 가변 동반 클래스로 어떤 다단계 연산(혹은 어떤 다단계 연산 속도를 높이는 지)을 수행하는지 궁금합니다.

ssstopeun commented 1 year ago

BigInteger클래스에서 사용하는 가변 동반 클래스의 경우 클라이언트들이 원하는 복잡한 연산들을 정확히 예측할 수 있어 package-private으로 충분하고 그러한 연산을 BigInteger클래스에서 모두 처리해주게 됩니다.

하지만 String의 경우 예측이 되지않아 public으로 제공하게 됩니다.

1개이상의 문자열들을 더하는 상황을 예로 들자면

String s1 = "이펙티브";
String s2 = "자바";
String s3 = s1 + s2;

String s4 = "item 1";
s3 += s4;

이렇게 String 객체로 문자열을 더하게 되면 String 객체는 변경이 불가능하기 때문에 문자열을 연결하면 새 문자열이 생성되고 이전 문자열은 가비지 컬렉터로 들어갑니다.

100개의 문자열이 연결되면 그만큼의 메모리를 잡아먹게 되는 것입니다. 이때 가변 동반 클래스인 StringBuilder를 사용하면 변경 가능한 문자열 객체를 만들어주게 되고 새로운 메모리를 할당하지 않고 문자열만 객체에 추가하게 됩니다.

StringBuilder sb = new StringBuilder();
sb.append("이펙티브").append("자바");
sb.append("item 1");

따라서 많은 문자열을 추가하는 상황에서 string에 비해 연산속도를 올려 수행할 수 있을 것같습니다.