Effective Java 2판 2장

현재 Effective Java 2판을 읽고 이에 대한 간단한 포스팅을 한다.
읽은 페이지는 4장 109페이지까지. 1장은 서론이니 생략

Start reading technical books

경험이 쌓이면서 이전에 읽었던 책이 기억이 잘 기억이 나지 않는다. 또한 지식에 따라 이해하는 내용이 다를 수 있다. 그렇기 때문에 읽었던 책을 다시 읽는 것을 목표로 하고 있다.

Why This Book?

집에 많은 책이 있지만 이펙티브 자바와 같은 책은 자바의 특징이 담겨 있으나 어느정도는 대부분의 언어가 공유하는 내용을 담기도 한다. 그렇기 때문에 디자인 패턴을 담은 이책으로 시작하기로 한다.

2장 객체의 생성과 삭제

규칙 1 생성자 대신 정적 팩터리 메서드를 사용할 수 없는지 생각해보기

생성자를 안쓴다는 것은 new를 사용자가 하지 않는다는 것이고 호출하는 입장에서는 객체의 갯수를 조절할 수 없다. 객체를 무조건 하나만 쓰는 싱글턴이라거나 객체마다 커넥션을 유지하는 디비 연결같은 경우는 커넥션 풀을 사용하는데 이 경우에는 new를 조절해야한다. 사실 이 경우가 아니라더라도 굳이 new를 할 필요는 없다. 

규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하기

생성자의 인자가 많을때 생성자를 그대로 많게 하면 너무 많은 케이스를 고려해야하고 그렇다고 Set 메서드를 통해서 하면 객체가 너무 자주 바뀌게 된다. 따라서 Builder 패턴을 통해서 간단한 생성자만 두고 나머지는 나열하는 방식을 통해서 해결 한다. 

규칙 3 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하기

여기서는 싱글턴을 구현하는 방법을 설명하고 있다. 클래스 내부에서 해당 인스턴스를 가지는 맴버 변수를 private로 하나 선언하고 사용할때는 해당 객체를 리턴하는 함수를 통해서 사용하면 된다.

규칙 4 객체 생성을 막을 때는 private 생성자를 사용하기

abstract로 선언해도 하위에서 바꿀수 있기에 명백하게 private로 하라는 간단한 내용이다.

규칙 5 불필요한 객체는 만들지 말기

여러번의 연산을 해야하는 기능안에서 굳이 여러개의 객체를 만들면 속도가 저하되게 된다. 매번 바뀌어 있고 유지해야하는 객체라면 만들어야 하는것 맞아 보인다. 그러나 그게 아니면 한번만 만들어야 하며 정적 초기화 블록을 사용하면 된다. 또한 서로 다른 자료형을 잘못 쓰거나 Long, long들을 잘못 쓰면 해당 연산마다 객체를 생성하게 되는데 이 경우도 조심해야 한다.

나는 이와 비슷한 경우를  데이터베이스 코드에서 본적이 있다. 데이터베이스에서 상수값 들을 잘못 하드코딩하고 서로 다르지만 연산이 가능한 자료형과 연산을 하면 매번 형변환이 일어난다는 것이다. 이 경우 하드코딩을 변수로 바꿔주면 굳이 형이 다르더라도 최적화에서 알아서 해주기 때문에 문제가 사라진다. 이게 아니더라도 상수값은 언제라도 바뀔수 있는 값이기에 변수로 저장해주는것이 더 좋다고 생각한다. 

규칙 6 유효기간이 지난 객체 참조는 피하기

리스트의 크기를 동적으로 할당하는 경우에는 보통 2배씩 할당한다고 배운다. 이때 사이즈가 작아질경우 연결된 객체를 null 처리 하지 않으면 할당된 객체가 남아 있게 된다. 이 경우 해당 객체가 언제 사라질지 모르며 안사라질 가능성이 좀 커 보인다. null 처리를 해줘야 한다는 것이다. 
경험상 어떤 코드에서 메모리가 계속 증가하는 케이스를 본것 같은데 지금 생각해보니 이 케이스인 가능성이 좀 커 보인다. 내가 살펴볼 권한은 없으므로.. 패스하는 걸로

규칙 7 종료자 사용을 피하기

종료자는 finalize라는 키워드 이며 해당 객체가 사라질때 호출이 되는 함수이다. 생성자는 해당 객체를 생성하면 바로 호출이 되지만 종료자는 바로 되지는 않고 queue에 쌓여서 순번을 기다리다가 삭제되는 듯 하다. 만약 여기에 바로 실행해야되는 코드를 둔다면 그 코드가 언제 실행될지 알 수 없게 된다. 서버와 연결을 끊는 코드는 여기에 두면 안되고 다른 함수를 두어서 그 함수를 통해서 종료 해야한다. 구글에 검색해보니 java 9 이상에서는 종료자가 삭제된 듯 하다. https://stackoverflow.com/questions/56139760/why-is-the-finalize-method-deprecated-in-java-9

댓글

이 블로그의 인기 게시물

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법

고려대학교 야간대학원 중간 후기