티스토리 뷰


오늘도 저번에 이어서 Effective Java 2/E 의 내용중 일부를 포스팅 한다.


역시나 책에 나온 내용을 바탕으로 내가 이해한 대로 다시 포스팅 하는거라서 저자가 의도한 것과는 다른내용이 있을수도 있다a


책의 내용이 궁금한 사람들은 직접 구입해서 읽어보면 좋을꺼 같다.ㅎ


오늘의 포스팅 내용은 "불필요한 객체는 만들지 말라." 이다.


처음에 이 제목을 보고 '당연한 소리를 하고있어..' 라고 생각했다. 


그런데 책에는 크게 신경쓰지않고 제작한 코드에서 불필요한 객체가 생기고


그것이 프로그램의 속도에 영향을 준다는것을 강조하고 있었다.


그러한 실수의 예를 보면 다음과 같다.



다음과 같은 코드에서 isBabyBoomer() 함수가 문제이다. 


사용자의 생일 정보와 BabyBoomer 에 태어난 사람인지 아닌지 판단하는 이 함수는


일반적으로 봤을때 아무 문제가 없지만 만약 이러한 함수호출이 자주 빈번하게 호출된다면


프로그램의 성능에 영향을 준다.


PersonBad 클래스에서 boomStart, boomEnd의 경우 공통적으로 사용하고 바꾸는 경우가 없는 값이기 때문에


함수 호출시 매번 새로 계산하기보단 static 변수로 만들어서 불필요한 객체 생성을 막는다. 


이를통해 모든 PersonBad 함수내에서 공유하는게 더 효율적이다.


수정된 코드는 다음과 같다.



그렇다면 두 클래스간의 효율차이를 비교해보자. 



결과는 다음과 같다. 




책에 나온 또다른 예는 다음과 같다.


JDK 1.5부터는 자동 객체화( autoboxing )라는 것을 통해 기본 자료형과 그 객체 표현형을 섞어 사용할 수 있도록 해주면서 


둘 간의 변환은 자동으로 이뤄지게 한다. 


다음 예시는 Long과 long을 불필요하게 섞어 사용했을때의 효율 차이를 보여준다.




Long 타입인 sum이 for문에서 sum += i 를 할때 자동객체화를 통해 쓸데없이 Long 객체가 더 생성되고


이를 Integer.MAX_VALUE 만큼 생성되다 보니까 2의31승 개의 Long 객체가 더 만들어지게 된다. 


비교결과를 보자. 



예제는 두개의 차이를 강조하기 위해 상황을 설정했지만 불필요한 객체생성을 간과하고 프로그래밍을 하면


실제 프로그램에서도 충분히 프로그램 성능에 영향을 줄 것같다.




책의 내용은 여기까지이다.


책에는 더 자세한 설명을 해주니까 궁금하다면 책을 구입해서 읽어보면 좋을것 같다.

 

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~ 

댓글