'리터럴'에 해당되는 글 1건

  1. 2011.04.07 Effective Java - 항목 5. 불필요한 객체의 생성을 피하자.
2011.04.07 22:54
 객체를 재사용하면 객체 생성에 소요되는 시간과 리소스를 아낄 수 있으므로,  오류가 없는 범위내에서(특히 불변 객체) 같은 객체는 재사용하는 것이 좋다.

 특별한 테크닉이 있는 것은 아니지만 주의해야 할 것은  String 을 사용할 때와 자바 1.5 이상에서 생긴 기본형의 auto-boxing 기능을 사용할 때이다.

 먼저 String의 경우는 String s = new String("Hello World!"); 와 String s = "Hello World!";를 예로 들어 설명하겠다.

 new String("Hello World!") 를 반복 실행 할 경우 실행때마다 새로운 String 인스턴스를 만들 것이다.
 하지만 "Hello World!"로 생성을 하면 실행 할 때 마다 String 인스턴스를 만드는 것이 아니라 하나의 String 인스턴스에서 동일한 리터럴을 갖도록 재사용 될 것이다. 리터럴에 대한 설명은 아래에 있다.

리터럴(literal) 이란?

 코드 안에  지정한 상수 값을 말하며, 자바에서는 리터럴 풀(pool)메모리 영역에 보관한다. 그리고 같은 값을 갖는 리터럴이 코드에 여러 번 나오더라도 하나만 만들어 공유한다.
 따라서 문자열 리터럴의 경우 String s1 = "Java" String; s2 = "Java"; 의 경우  "Java"라는 같은 String 객체를 참조한다. 참고로 두 개 이상의 객체 참조변수가 이처럼 같은 객체를 참조하는 것을 객체 Aliasing이라고 한다.


 비슷한 용법으로 기본형인 boolean의 경우 Boolean(String)보다  Boolean.valueOf(String)과 같은 팩토리 메소드를 사용하는 것이 바람직하다.

 Auto-boxing을 사용하는 경우는 기본형을 쓸 수 있는 곳에는 기본형을 쓰는 습관을 들이면 된다. 아래의 잘못된 예제를 보자.
 
위의 코드의 경우 Long으로 sum을 선언하여서 long인 i와 더하기를 한번 할 때 마다 불필요한 Long 객체를 만들므로 매우 느려진다.




하지만 뒤에서 살펴볼 방어 복사(Defensive copying, 항목 39)에서는 이와 반대의 주장을 하는데 새로운 것을 생성해야 할때는 기존 객체를  사용하지 말자고 한다.
 방어 복사가 필요한 곳에서 객체의 재사용을 했을 때의 불이익은 찾기 힘든 어려운 잠재적 결함이 생길 수 있고 보안에도 구멍이 뚤리는 등의 치명적일 수 있으나, 기존 객체를 사용해도 되는 곳에서 쓸데없는 객체를 만들었을때의 불이익은 성능에만 영향을 주기 때문에 신중히 사용해야한다.
신고
Posted by JAVA_HOME

댓글을 달아 주세요


티스토리 툴바