Closed zpqmdh closed 2 months ago
Q.
이때, String의 StringBuilder 로도 함께 예를 들고 있는데, BigInteger 과 String 이 둘의 차이가 무엇인지 궁금합니다. 부가적으로 가변 동반 클래스를 어떻게 클라이언트의 요구를 예측하여 구현하였는지도 궁금합니다.
A.
아래 사진은 BigInteger가 있는 math 패키지 내부의 여러 클래스들입니다.
BigInteger, BigDecimal 클래스는 내부에서 사용하는 여러 가변 동반 클래스들인 BitSeive, MutableBigInteger 등을 사용하고 있습니다. 이것들은 모두 package-private하다는 특징을 가지는데 이러한 클래스들을 사용자가 사용하지 않아도 어떤 연산들을 할 지 예측이 가능하기 때문입니다.
클라이언트가 BigInteger를 사용해서 무언가를 한다면 보통 다른 BigInteger 타입의 수를 가져와서 연산을 수행하지 다른 String 타입을 가지고 와서 연산을 수행하지는 않을 것입니다. 따라서 구현자의 입장에서 두 수를 이용하여 어떤 연산을 수행할 것인지에 대해 정확히 예측이 가능합니다.
반면 String의 경우에는 다릅니다. 예를 들어 어떤 문자나 문자열을 추가해야 하는 경우, 입력이 항상 char 또는 String으로 들어온다는 보장이 어디에도 없습니다. 문자, 문자열은 물론이고 정수, 소수와 같은 여러 수들도 함께 들어올 수 있기 때문입니다. 또한 몇개의 문자가 추가적으로 들어오는지도 예측할 수 없을 것입니다. 따라서 String의 동반 클래스를 구현하는 사람의 입장에서 클라이언트가 어떤 연산을 수행하는지에 대해 정확히 예측이 힘듭니다.
따라서 이런 경우에는 클라이언트가 원하는 연산을 스스로 진행할 수 있도록 동반 클래스를 public으로 열어두고 구현을 진행하는 것이 좋다는 것을 책에서 서술하고 있습니다.
책 p.110에는 불변 객체의 단점에 대한 해결 방식 중 하나로, 다단계 연산(multiple operation)들을 예측하여 기본 기능으로 제공하는 방법에 대해 설명하고 있습니다. 예로는
BigInteger
의 모듈러 지수 같은 다단계 연산 속도를 높여주는 가변 동반 클래스(companion class) 를package-private
으로 선언한 것을 들고 있습니다.이때,
String
의StringBuilder
로도 함께 예를 들고 있는데,BigInteger
과String
이 둘의 차이가 무엇인지 궁금합니다. 부가적으로 가변 동반 클래스를 어떻게 클라이언트의 요구를 예측하여 구현하였는지도 궁금합니다.