effective java
-
clone 재정의는 주의해서 진행하라JAVA/Effective java 2021. 1. 20. 18:09
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고 그마저도 protected라는 데 있다. 따라서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 그렇다면 메서드 하나 없는 Cloneable 인터페이스는 무슨 일을 할까? 이 인터페이스는 Object의 protected 메서드인 clone의 동작 방식을 결정한다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSu..
-
toString을 항상 재정의하라JAVA/Effective java 2021. 1. 19. 12:30
Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환할 뿐이다. toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. 이 같은 toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. toString메서드는 객체를 println, printf, 문자열 연결, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불리고 이는 직접 호출되지 않더라도 다른 어딘가에서 쓰일 거란 이야기이다. 또 작성한 객체를 참조하는 컴포넌트가 오류 메시지를 로깅할 때 자동으로 호..
-
더이상 쓰지 않는 객체 레퍼런스는 없애자 + Weak ReferenceJAVA/Effective java 2021. 1. 2. 20:41
메모리 직접 관리 자바에 GC (가비지 콜렉터)가 있기 때문에 메모리 관리에 대해 신경 쓰지 않아도 될 거라고 생각하기 쉽지만 그렇지 않다. 다음 코드를 살펴보자. 여기서의 size는 index에 역할을 하고 있다. pop()을 보면 내가 넣을 장소가 아닌 뺄 장소로 이동해야 하기 때문에 먼저 --size를 하고 반환한다. 배열은 계속해서 값을 넣기만 하고 없어지지는 않는다. 스택에 계속 쌓다가 많이 빼냈다고 치자, 그래도 스택이 차지하고 있는 메모리는 줄어들지 않는다. 왜냐면 저 스택의 구현체는 필요없는 객체에 대한 레퍼런스를 그대로 가지고 있기 때문이다. 가용한 범위라는 것은 실제 유의미한 element를 가지고 있는 범위이고 이는 size 보다 작은 부분들이다. 그 값 보다 큰 부분에 있는 값들은 ..
-
private 생성자로 noninstantiability를 강제할 것JAVA/Effective java 2020. 12. 30. 15:08
단순히 static 메서드와 static 필드를 모아두는 유틸리티 클래스들을 만들고 싶을 때가 있다. OOP적 사고와는 다소 거리가 있지만 나름의 쓰임새는 있다. Arrays에 배열 관련 메서드, Collections에 정적 메서드 와 팩토리 등이 그 예이다. 또한 final 클래스와 관련된 메서드들을 모아놓을 때도 사용하게 된다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 것은 불가능하기 때문이다. 따라서 이같은 유틸리티 클래스는 인스턴스를 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 생성되는 기본 생성자는 public한 생성자이다. 클라이언트는 이 생성자가 자동 생성된 것인지 구분할 수 없다. 실제로 공개된 API들도 의도치 않게 인스턴스화할 수 있게 된 클래스가 ..