아이템 6 - 불필요한 객체 생성을 피하라
불필요한 객체 생성을 피하는 것은 메모리 효율성과 성능을 향상시키는 데 중요한 포인트다.
String 객체 비교 예시
String 리터럴 비교
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
두 문자열은 String Constant Pool에 저장되며, 같은 리터럴이기 때문에 동일한 객체를 참조한다. 따라서 ==로 비교해도 true가 나오고, equals 메서드로 비교해도 true다.
new 키워드로 생성한 String
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
new로 생성된 문자열은 힙 영역에 별도의 객체로 생성된다. 따라서 두 객체의 주소값이 다르므로 == 비교는 false, equals 메서드는 내용이 같기 때문에 true다.
intern() 메서드 사용
String str1 = "abc";
String str2 = new String("abc").intern();
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
intern() 메서드를 사용하면 새로운 객체가 String Constant Pool에 저장된다. 이로 인해 str1과 str2는 동일한 객체를 참조하므로 ==와 equals 모두 true다.
Integer 객체 비교 예시
Integer 캐싱
Integer a = 5;
Integer b = 5;
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true
Integer c = 500;
Integer d = 500;
System.out.println(c == d); // false
System.out.println(c.equals(d)); // true
a==b 는 true 이지만 c==d는 false이다.
Integer 클래스는 -128에서 127 범위의 값을 캐싱하여 동일한 객체를 참조한다. 따라서 a와 b는 캐싱되어 동일한 객체이므로 ==는 true, equals도 true다. 하지만 c와 d는 500으로 캐싱 범위를 넘어가므로 서로 다른 객체를 참조하게 되어 ==는 false지만, equals는 true다.
sum()
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
- 이 메서드는 0부터 Integer.MAX_VALUE (2,147,483,647)까지의 모든 정수를 더한 값을 반환한다.
- Long sum = 0L;로 초기화하며, for 루프를 통해 각 값을 누적한다.
- sum 변수의 타입이 Long이기 때문에 불필요한 오토 박싱 과정이 발생하여 성능 저하를 유발할 수 있다.
박싱된 기본 타입보다는 기본 타입을 사용하고, 의도치 않은 오토박싱이 숨어들지 않도록 주의하자.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 8 finalizer와 cleaner 사용을 피하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 7 다 쓴 객체 참조를 해제하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2024.12.03 |