전체 글
-
이펙티브 자바 Item 13 - clone 재정의는 주의해서 진행하라언어/Effective Java 2024. 5. 29. 15:34
clonable의 역할복제해도 되는 클래스임을 나타내는 믹스인 인터페이스이다.Object 클래스에 protected clone()라는 메서드가 있다.Cloneable 인터페이스는 clone() 메서드의 동작 방식을 결정한다.Cloneable을 구현하지 않는 인스턴스에서 clone()를 호출하면 CloneNotSupportedException을 던진다.clone() 사용해보기static class Entry implements Cloneable { String key; String value; public Entry(String key, String value) { this.key = key; this.value = value; ..
-
이펙티브 자바 Item 12 - toString은 항상 재정의하라언어/Effective Java 2024. 5. 29. 14:25
Object의 기본 toString은 클래스_이름@16진수로_표시한_해시코드를 반환한다. toString 규약 사람이 읽기 쉬운 정보를 반환하라 모든 하위 클래스에서 재정의하라 toString 메서드는 객체를 println,printf 문자열 연결, assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 사용된다. 좋은 toString은 이 인스턴스를 포함하는 객체에서 유용하게 쓰인다. toString() 메서드 재정의 시 주의점 객체가 가진 주요 정보는 모두 보여주는 것이 좋다.정보가 너무 많을 때는 간단히 요약된 정보를 보여줄 수도 있다. 포맷을 명시하기로 했으면, 명시한 포맷에 맞는 문자열과 객체를 상호전환 할 수 있는 정적 팩토리나 생성자 함께 제공하면 좋다. toString이 반환..
-
이펙티브 자바 Itme 10 - equals는 일반 규약을 지켜 재정의 하라언어/Effective Java 2024. 5. 28. 21:46
1. equals를 재정의 하면 안 되는 경우 1. 각 인스턴스가 본질적으로 고유할 때 값 클래스(Integer, String 처럼 값을 표현) 가 아닌 동작하는 개체를 표현하는 클래스(Thread)2. 인스턴스의 '논리적 동치성' 검사할 일이 없을 때 (동등성)논리적 동치성 검사의 1가지: Pattern의 인스턴스가 같은 정규 표현식을 나타내는 지 검사 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 들어맞을 때 같은 특징을 가지면 equals를 상속받아 사용하는 걸 권장한다.4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없을 때 // equals가 실수로 호출되는 걸 막고 싶다면@Override public boolean equals..
-
이펙티브 자바 Item 11 - equals를 재정의하려거든 hashCode도 재정의하라언어/Effective Java 2024. 5. 28. 16:12
equals를 재정의한 클래스는 hashCode도 재정의 해야한다. 그렇지 않으면 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생한다. 동등성: 객체가 주소값이 다르더라도 내용이 같다면 같은 거로 보는 것 (equals())동일성: 객체의 주소값이 다르면 아무리 같은 내용이더라도 같지 않다고 보는 것 (ex == ) 값만 같은지 아예 같은 객체인지 비교하기 위해선 동등성과 동일성이 보장되어야함!!1.hashCode 일반 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode도 변하면 안 된다.애플리케이션을 다시 실행한다면, 이 값이 달라져도 상관없음equals가 두 객체가 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환한다.논..
-
이펙티브 자바 Item 9 - try-finally 대신 try-with-resources를 사용하라언어/Effective Java 2024. 5. 28. 12:04
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다.ex)InputStream, OutputStream, java.sql.Connection 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다.전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. try-finally는 자원을 회수하는 최선의 방책이 아니다! static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] bu..
-
이펙티브 자바 Item7 - 다 쓴 객체의 참조를 해제하라언어/Effective Java 2024. 5. 28. 11:29
자바에서 사용하지 않는 객체의 경우 GC에서 알아서 회수를 해주며, 메모리 관리를 해준다. 하지만 GC가 메모리 관리를 해준다고 완전 신경을 꺼야하는 건 아니다! GC에서는 특정 상황에서 메모리 누구가 발생하고, 우리는 그러한 상황을 인지하고 대응해야한다. 메모리 누수는 겉으로 잘 드러나지 않아 수년간 잠복하는 사례도 존재한다. 철저한 코드리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도한다. 따라서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다.메모리 누수가 발생하는 경우 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_CAP..
-
이펙티브 자바 Item6 - 불필요한 객체 생성을 피하라언어/Effective Java 2024. 5. 27. 16:35
불필요한 객체 생성을 피하면서 자원을 절약해야한다.같은 기능의 객체를 새로 생성하는 대신, 객체 하나를 재사용하는 편이 나을 때가 많다.특히, 불변 객체는 언제든지 재사용할 수 있다. 같은 기능 수행하는 객체에 대한 재사용 강조싱글톤 사용 (내가 구현할 때)static factory 메서드 사용 (구현된 것을 사용할 때)객체 캐싱 (무거운 객체일 때 미리 초기화 혹은 flyweight 패턴 고려) 같은 인스턴스 대변하는 여러 타입을 굳이 만들지 말 것 박싱 클래스는 꼭 필요한 경우만 사용 1. 문자열 객체 생성 같은 값임에도 다른 래퍼런스인 경우 - 기존 인스턴스를 재사용하자 문자열의 경우 항상 new 로 새로운 문자열을 생성하기 보다 같은 문자열이라면, "java"처럼 리터럴로 생성한다. 2. s..
-
이펙티브 자바 Item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라언어/Effective Java 2024. 5. 27. 15:54
사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 1. 자원 직접 주입 대부분의 클래스는 여러 리소스에 의존한다. 책에서는 SpellChecker와 Dictionary를 예로 든다.두 객체 사이에는 의존관계가 있다. 아래는 static 유틸리티를 잘못 사용한 예이다. - 이는 유연하지 않고 테스트가 어렵다.public class SpellChecker { private static final Lexicon dictionary = ...; // 의존하는 리소스 (의존성) private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static..