본문 바로가기

프로그래밍/자바(java)

[이펙티브 자바] 객체 생성과 파괴(2)

1. Boxing type 대신 Primitive Type을 권장한다.

 

 

왼쪽 사진이 Boxing Type으로 계산 했을 경우고 오른쪽이 primitive Type으로 사용하였을 경우이다.

실제 실행 속도를 계산해보면 10배정도의 빠른 실험 결과를 볼 수 있다.

Boxing Type을 남용하지 않도록 주의하는 것 뿐만 아니라, 의도치 않은 Auto Boxing을 조심해야한다.

 

2. UtilClass에서 또한 primitive type을 권장한다.

 

 

숫자 타입인지 검증하는 유틸을 만든다고 생각한다면 반환값을 boolean 과 같이 프리미티브 타입을 권장한다.

 

단, primitive type이 항상 옳은 것은 아니다.

 

 

price가 null인것과 0은 의미가 다르다.

0은 이벤트 중 0원으로 측정할 수 있는것이고 price가 null이면 등록이 정해지지 않은 상태를 의미한다.

 

 

주의해야 할 내장 Method

 

 

String 클래스에서 지원하는 matches 을 예를 들면 안에 내부에서 Pattern과 Macher을 새로 만들어 비교를 한다.

 

 

최적화된 내용으로는 Pattern instance를 한번만 생성하여 재활용하여 사용한다.

 

 

 

2. 다 쓴 객체 참조를 해제하라

 

유효 Scope 밖으로 넘어가면 자동으로 GC의 대상이 된다.

 

힙영역

 

힙영역은 인스턴스 생성시 메모리에 쌓입니다.

  • 참조형(class, interface, enum, Array 등) 자료형도 같이 저장됩니다.
Instance instance = new Instance();  -> heap에 존재

 

 

스택영역

 

스택영역은 int, long과 같은 변수를 생성하였을때 쌓이는 메모리 영역입니다.

 

  • 메소드가 호출될 때마다 생성되고, 메소드가 끝나면 삭제가 됩니다.
int price = 1000;

 

 

finalizer, cleaner를 피하라

 

 

 

finalize는 객체 소멸자라고도 말하며, 리소스 누수를 위해 GC가 발동할떄 필요하지 않는 것이라고 리소스를 정리해달라고 요청한다.

하지만, Java 9부터는 사용을 하지말라고 금하고 있다.

여기 문제점은 즉시 리소스 정리를 받을 수 없다는 단점이 있다.

 

 

GC관련해서는 System.gc()가 존재를 한다.

GC에 힌트를 주는 역활을 하는데 gc가 작동하면 다른 작업들이 잠시 멈추어서 속도에 영향을 주어 사용을 금하고 있고, 무조건 GC가 작동하여 리소스를 제거하는 것이 아니기때문에 사용하지 않는 것이 좋다.

 

 

try-finally 대신 try-with-resources 사용

 

 

IO 관련해서 리소스를 제거 할때, close로 닫는 경우가 많았다.

finally 를 이용해서 close를 무조건 닫게 되어 있다.

하지만, Exception시 stack trace에 어려움이 있는 단점이 있다.

또한, 개발자의 실수로 닫지 않는경우 계속해서 리소스를 참조하는 상황이 이루어진다.

 

 

 

 

try-with-resource를 try에서 소괄호안에 넣어주면 AutoCloseable를 하게 되어 finally에 close를 안해줘도 된다는 장점이 있다.