2021-02-17-TIL

String + operator vs StringBuilder.append()

The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. For additional information on string concatenation and conversion, see The Java Language Specification. - https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html

Java15의 docs를 보면 위와 같이 나온다. 자세한 구현내용을 보려면 JAVA Language Specification 을 참조하라고 한다. 그래서 해당 링크를 클릭해보면 본문 중에 다음과 같은 내용을 볼 수 있다.

An implementation may choose to perform conversion and concatenation in one step to avoid creating and then discarding an intermediate String object. To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression. - https://docs.oracle.com/javase/specs/jls/se15/html/jls-15.html#jls-15.18.1

Java 15.18.1 기준으로 String의 + 연산자는 내부적으로 자바 컴파일러가 알아서 StringBuffer나 비슷한 기술을 통해서 String 객체를 마구 생성하는 것을 방지해준다고 한다. 하지만 이는 자바의 일정 버전 이상에만 해당하므로 아직까지는 호환성을 위해 StringBuilder나 StringBuffer을 사용하는 것이 바람직한 것 같다.


private 생성자, 불필요한 객체

static private constructor utility class

자바에는 private 기본 생성자와 정적 메서드나 필드만으로 구성된 클랫그가 존재한다. 또는 이렇게 구현할 수가 있다. 이러한 클래스는 다른 곳에서 생성자를 호출할 수 없으므로 하위 클래스를 만들 수 없다.

예를 들어, java.util.Arrays와 같이 기본 자료형이나 배열에 적용되는 각종 메서드를 제공하는 클래스가 자바 라이브러리에 있다. 이런 클래스는 직접 인스턴스화해서 사용되는 것이 목적이 아니라, 유틸리티 메서드를 제공하는 유틸리티 클래스 에 해당한다.

이러한 유틸리티 클래스는 외부에서 객체(인스턴스)를 생성하는 것이 불필요하다. 따라서 private 기본 생성자를 선언하여 이를 방지해줄 수 있다.

References:

  • https://yavuztas.dev/java/collections/streams/2019/08/10/java8-utility-class.html#:~:text=Static%20Classes%20in%20Java,prevent%20creating%20instances%20of%20them.
  • https://stackoverflow.com/questions/7074713/should-a-utility-class-be-static
  • https://www.vojtechruzicka.com/avoid-utility-classes/

Upcasting advantages

https://www.geeksforgeeks.org/upcasting-in-java-with-examples/

https://www.geeksforgeeks.org/upcasting-vs-downcasting-in-java/#:~:text=Upcasting%3A%20Upcasting%20is%20the%20typecasting,object%20to%20a%20parent%20object.&text=Instead%20of%20all%20the%20members,object%20to%20a%20child%20object.

두 개 뽑아서 더하기

7분 정도만에 풀었다. 만들 수 있는 모든 수 라는 부분과 예시에서 중복이 없다는 것을 확인하여 HashSet을 떠올렸고, 오름차순이라는 말에서 Collections.sort()을 사용하거나, 아예 TreeSet을 사용하여 저장하면 정렬된 순서로 저장될 것이라고 생각했다.

Arrays.indexOf == -1 을 이용해서 중복제거가 가능하다.

List.contains()를 사용해서 중복제거가 가능하다.