불필요한 객체 생성을 피해라

요약

변경되지 않는 객체를 사용할 때마다 새로운 객체를 만들지 말자.

불필요한 객체 생성을 하는 예시

String

1
2
String bad = new String("bikini"); //안좋은 예시
String good = "bikini"; //무난한 예시

new String(“bikini”)로 문자열을 만드는 경우 불필요한 문자열 객체를 만든다.
왜? “bikini”라는 코드 자체가 문자열 객체를 만들기 때문이다.

문자열 객체를 만들고 다시 새로운 객체로 만드는 코드인 셈이다.

반면 두번째 줄 코드는 가상 머신에서 문자열 리터럴을 하나 만들어서 재사용한다.

1
2
3
for (int i = 0; i < 100; i++) {
new String("bikini"); //얼마나 많은 문자열 객체가 만들어질까?
}

반복문에 위처럼 문자열 객체를 만들면 불필요한 객체가 생기게 된다.

정적 팩터리 메서드로 불변 클래스 효율적으로 만들기

1
2
Boolean trueBoolean = new Boolean("true"); //안좋은 예시
Boolean falseBoolean = Boolean.of("false"); //좋은 예시

Boolean 클래스는 객체 내부가 변경되지 않는 불변 객체이다.
불변 객체는 굳이 사용할 때마다 객체를 만들어주지 않아도 된다.

새로운 객체를 만들기보다는 만들어진 객체를 반환하는 기능을 정적 팩터리 메서드로 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public final class Boolean implements java.io.Serializable,
Comparable<Boolean>, Constable
{
public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

@SuppressWarnings("unchecked")
public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");

private final boolean value;

@java.io.Serial
private static final long serialVersionUID = -3665804199014368530L;

@Deprecated(since="9")
public Boolean(boolean value) {
this.value = value;
}

@Deprecated(since="9")
public Boolean(String s) {
this(parseBoolean(s));
}

//생략

public static Boolean valueOf(String s) {
return parseBoolean(s) ? TRUE : FALSE;
}
}

Boolean 객체 내부를 보면 자신의 인스턴스들을 내부에서 클래스 변수로 가지고 있다.
정적 팩터리 메서드로 전달받은 인수에 맞는 인스턴스를 반환해주면 된다.

Share