Java/이펙티브 자바
-
아이템13. clone 재정의는 주의해서 진행하라Java/이펙티브 자바 2023. 6. 18. 16:38
핵심정리1 - clone 규약 핵심 정리 : 애매모호한 clone 규약 - clone 규약 ㆍx.clone() != x 반드시 true ㆍx.clone().getClass() == x.getClass() 반드시 true ㆍx.clone().equals(x) true가 아닐 수도 있다. - 불변 객체라면 다음으로 충분하다. ㆍCloenable 인터페이스를 구현하고 ㆍclone 메서드를 재정의한다. 이때 super.clone()을 사용 핵심정리2 - 가변 객체 clone 정의하는 방법 핵심 정리 : 가변 객체의 clone 구현하는 방법 - 접근 제한자는 public, 반호나 타입은 자신의 클래스로 변경한다. - super.clone을 호출한 뒤 필요한 필드를 적절히 수정한다. ㆍ배열을 복제할 때는 배열의 c..
-
아이템 12. toString을 항상 재정의하라Java/이펙티브 자바 2023. 6. 18. 16:12
핵심정리 - toString은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. - Object의 toString은 클래스이름@16진수로 표시한 해시 코드 - 객체가 가진 모든 정보를 보여주는 것이 좋다. ㆍ하지만 기선쌤은 노출가능한 정보만 보여주는게 좋다고 한다. - 값 클래스라면 포맷을 문서에 명시하는 것이 좋으며 해당 포맷으로 객체를 생성할 수 있는 정적 팩터리나 생성자를 제공하는 것이 좋다. - toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하는 것이 좋다. ㆍex) getter 제공 - 경우에 따라 AutoValue, 롬복 또는 IDE를 사용하지 않는게 적절할 수 있다. ㆍ원하는 포맷(ex. 좌표)
-
아이템11. equals를 재정의하려거든 hashCode도 재정의하라Java/이펙티브 자바 2023. 6. 17. 18:53
핵심 정리1 - hashCode 규약 - equals 비교에 사용하는 정보가 변경되지 않았다면 hashCode는 매번 같은 값을 리턴해야 한다. ( 변경되거나, 애플리케이션을 다시 실행했다면 달라질 수 있다. ) - 두 객체에 대한 equals가 같다면, hashCode의 값도 같아야 한다. - 두 객체에 대한 equals 가 다르더라도, hashCode의 값은 같을 수 있지만 해시 테이블 성능을 고려해 다른 값을 리턴하는 것이 좋다. 해시충돌 // 다른 인스턴스인데 같은 hashCode를 쓴다면? - 해시충돌 System.out.println(number1.equals(number2));// false System.out.println(number1.hashCode()); System.out.print..
-
아이템10. equals는 일반 규약을 지켜 재정의하라Java/이펙티브 자바 2023. 6. 7. 11:28
핵심정리 1 - equals가 필요없는 경우 핵심정리 : equals 를 재정의 하지 않는 것이 최선 - 다음의 경우에 해당하면 equals를 재정의 할 필요가 없다. - 각 인스턴스가 본질적으로 고유하다. ㆍ싱글톤, Enum - 인스턴스의 '논리적 동치성'을 검사할 필요가 없다. ㆍ객체의 동일성을 비교 안할 때 - 상위 클래스에서 재정의한 equals가 하위 클래스에도 적절하다. ㆍList, Set - 클래스가 private 이거나 package-private이고 equals 메서드를 호출할 일이 없다. ㆍpublic 클래스면 equals 가 호출안된다는 보장이 안되기 때문에. 핵심정리 2 - equals 규약 - 반사성, 대칭성 핵심 정리: equals 규약 - 반사성 : A.equals(A) == ..
-
아이템9. try-finally 보다 try-with-resources 를 사용하라.Java/이펙티브 자바 2023. 6. 7. 10:17
핵심정리 - try-finally 는 더이상 최선의 방법이 아니다. (자바7부터) - try-with-resources를 사용하면 코드가 더 짧고 분명하다. - 만들어지는 예외 정보도 훨씬 유용하다. static String firstLineOfFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } } 문제 1. try-finally static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); Outp..
-
아이템8. finalizer와 cleaner 사용을 피하라Java/이펙티브 자바 2023. 6. 4. 17:10
핵심정리 - finalizer와 cleaner는 즉시 수행된다는 보장이 없다. - finalizer와 cleaner는 실행되지 않을 수도 있다. - finalizer 동작 중에 예외가 발생하면 정리 작업이 처리되지 않을 수도 있다. - finalizer와 cleaner는 심각한 성능 문제가 있다. - finalizer는 보안 문제가 있다. - 반납할 자원이 있는 클래스는 AutoCloseable을 구현하고 클라이언트에서 close()를 호출하거나 try-with-resourse를 사용해야 한다. * finalizer는 객체 생성하기 바빠서 finalizer 큐에 들어있는 레퍼런스를 제 때 GC해주기 어렵다 * finalizer와 cleaner는 권장하지 않는다. * autoclosable과 try-res..
-
아이템7. 다 쓴 객체 참조를 해제하라.Java/이펙티브 자바 2023. 6. 1. 15:40
핵심정리 - 어떤 객체에 대한 레퍼펀스가 남아있다면 해당 객체는 가비지 컬렉션의 대상이 되지 않는다. - 자기 메모리를 직접 관리하는 클래스라면 메모리 누수에 주의해야 한다. ㆍ예) 스택, 캐시, 리스너 또는 콜백 첫번째, 참조 객체를 null 처리하는 일은 예외적인 경우이며 가장 좋은 방법은 유효 범위 밖으로 밀어내는 것이다. public Object pop() { if(size == 0) { throw new EmptyStackException(); } Object result = elements[--size]; elements[size] = null; // 다 쓴 참조 해제 return result; } 두번째, WeakHashMap 을 사용하는 경우 (특정한 자료구조를 사용) 1. @Test vo..
-
아이템6. 불필요한 객체 생성을 피하라Java/이펙티브 자바 2022. 11. 10. 17:39
핵심정리 - 문자열 ㆍ사실상 동일한 객체라서 매번 새로 만들 필요가 없다 ㆍnew String("자바") 을 사용하지 않고 문자열 리터럴("자바")을 사용해 기존에 동일한 문자열을 재사용하는 것이 좋다 ○ JVM 은 pool에서 캐싱하고 있기에 new String을 한다면 강제적으로 새로운 문자열을 만드는 것이다. public class Strings { public static void main(String[] args) { String hello = "hello"; // 이 방법 권장 X String hello2 = new String("hello"); String hello3 = "hello"; System.out.println(hello == hello2); // false System.out.p..