이펙티브 자바
-
Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라Book/Effective Java 3E 2022. 12. 20. 06:00
가변인수(varargs)는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 구현 방식에 허점이 있습니다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어집니다. 그런데 내부로 감춰야 했을 이 배열을 그만 클라이언트에 노출하는 문제가 생겼습니다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생합니다. 다음 메서드에서는 형변환하는 곳이 보이지 않는데도 인수를 건네 호출하면 ClassCastException이 발생합니다. 컴파일러가 생성한 (보이지 않는) 형변환이 숨어 있기 때문입니다. 이처럼 타입 안전성이 깨지니 제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않습니다. package ..
-
Item 27. 비검사 경고를 제거하라Book/Effective Java 3E 2022. 11. 8. 23:00
제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것입니다. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등입니다. 대부분의 비검사 경고는 쉽게 제거할 수 있습니다. 할 수 있는 한 모든 비검사 경고를 제거하라 // warning 발생(javac 명령줄 인수에 -Xlint:uncheck 옵션 추가) Set exaltation = new HashSet(); // 비검사 경고 제거 Set exaltation = new HashSet(); 모두 제거한다면 그 코드는 타입 안정성이 보장됩니다. 즉, 런타임에 ClassCastException이 발생할 일이 없고, 잘 동작하리라 확신할 수 있습니다. @SuppressWarnings("unchec..
-
Item 12. toString을 항상 재정의하라Book/Effective Java 3E 2022. 10. 18. 21:30
toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 합니다. 또한 toString의 규약은 "모든 하위 클래스에서 이 메서드를 재정의하라"고 합니다. 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋습니다. 하지만 객체가 거대하거나 객체의 상태가 문자열로 표현하기에 적합하지 않다면 요약 정보를 담아야 합니다. toString을 구현할 때면 반환값의 포맷을 문서화할지 정해야 합니다. 전화번호나 행렬 같은 값 클래스라면 문서화하기를 권합니다. 포맷을 명시하면 그 객체는 표준적이고, 명확하고, 사람이 읽을 수 있게 됩니다. 포맷을 명시하기로 했다면, 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 ..
-
Item 11. equals를 재정의하려거든 hashCode도 재정의하라Book/Effective Java 3E 2022. 10. 18. 20:40
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 합니다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것입니다. Object 명세 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashC..