이 챕터에서는 객체를 무분별하게 생성하지 말라는 메시지를 담고 있다.

가장 처음 나오는 예시를 보자

//case1
String s = new String("bikini");

//case2
String s =  "bikini";

처음 자바를 배울 때 case2처럼 사용하길래, 아 더 짧으니까 저걸 사용하는 구나 정도로만 생각했다.

그러나 자바를 공부하면서 메모리 할당과 문자열 리터럴 생성방식을 배우고 나서 시야가 넓어졌다.

 

case1의 경우 new 연산자를 사용하여 객체를 새로 생성하기 때문에 Heap영역에 메모리를 할당한다.

반면 case2는 String Constant Pool(상수 풀)에 저장된 메모리를 확인하고 동일 데이터 있을 시에 재사용 한다.

 

다음 예시를 보면 이해할 수 있다.

class Test {
    public static void main(String[] args) {

        String literal_A = "Sun";
        String literal_B = "Sun";

        String object_A = new String("Sun");
        String object_B = new String("Sun");

        System.out.println(literal_A == literal_B); //true
        System.out.println(object_A == object_B); //false
        System.out.println(literal_A == object_A); //false
        System.out.println(literal_A.equals(object_A)); //true

    }
}

아무튼 이 내용은 여기까지 설명하고, new를 사용할 시에 불필요하게 객체가 생성된다는 의미이다.

책에서는 아이템 1에서 배운 정적 팩토리를 사용하거나 '비싼 객체'인지 판단하는 것이 중요하다고 한다.

 

비싼객체는 메모리를 많이 잡아먹는 객체를 의미할 것이며 결국 불필요한, 중복되는 기능이 많은 객체들이 여기에 포함될 것이다.(책에서는 예시로 isRomanNumeral을 제시했다.)

 

또한 오토박싱에 대해 언급했는데

오토 박싱은 기본타입 데이터를 참조타입 형태(래퍼클래스)로 바꿔주는 것이다.

이 사진을 보면 이해가 쉽게 될것이다.

 

 

그럼 이건 왜 사용하느냐? 자세히는 모르지만 제네릭에서 기본형 값을 사용하지 못할 때 주로 사용한다고 한다.

 

이 말인 즉슨 기본형으로 다루기 힘든 데이터를 래퍼클래스로 변환하여 사용하라는 의미인 것 같다.

그리고 책에서는 불필요하게 오토박싱을 하지 말라고 한다!

+ Recent posts