Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 Java8에서 부터 기존 인터페이스에 default 메소드를 추가할 수 있게 되었다. 이 메소드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메소드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 디폴트 메소드 public interface Calculator { int sum(int num1, int num2); int minus(int num1, int num2); default int multiple(int num1, int num2) { return num1 * num2; } } public class EngineeringCalc impleme..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 불변 클래스 인스턴스 내부 값을 수정할 수 없는 클래스 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바 플랫폼 라이브러리에도 String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal이 여기에 속한다. 불변 클래스는 가변 클래스보다 설계 및 구현, 사용이 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 클래스 생성 규칙 객체의 상태를 변경하는 메소드(변경자)를 제공하지 않는다. 불변이라는 단어와 같이 변하지 않아야하기 때문에 객체 상태를 변경할 수 없도록 변경자를 제공하지 않아야 한다. 클..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 Comparable Comparable 인터페이스를 살펴보면 compareTo라는 추상 메소드 하나만 존재한다. public interface Comparable { public int compareTo(T o); } 이름과 같이 매개변수로 들어온 것과 자신을 비교하는 것이다. 아래 차이점을 제외하면 Object.equals()와 동일한 기능을 한다. 단순 동치성 비교 순서 비교 + 제네릭 즉, Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서(natural order)가 있음을 뜻한다. public class ComparableTest ..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 간혹 우리는 기존 객체의 값을 그대로 가진 새로운 객체를 생성해 사용해야할 경우가 있다. 이럴 때, clone() 메소드를 이용하면 효율적으로 생성할 수 있지만, 해당 메소드는 Object 클래스 내부에 선언되어 있다. public class Object { @IntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; } @IntrinsicCandidate란, 구현을 JVM 상에서 해주는 부분을 명시하는 어노테이션이다. 즉, JVM 종류에 따라 구현이 달라지게 되고, nat..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 .equals() 메소드는 함정이 많아 자칫하면 끔찍한 결과를 초래한다. 문제를 회피하는 가장 쉬운 방법은 아예 재정의하지 않는 것이다. 그냥 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같게 되는 것이다. 아래 중 하나라도 해당된다면 재정의하지 않는 것이 최선이다. 각 인스턴스가 본질적으로 고유하다. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package-private이고, equals 메소드를 호출할 일이 없다. 재정의하는 경우 객체 식별성(object..
Effective Java 3/E를 공부하며 작성한 글입니다. 혼자 공부하고 정리한 내용이며, 틀린 부분은 지적해주시면 감사드리겠습니다 😀 item8에서 공부한 것과 같이 AutoCloseable을 구현한 뒤, close() 메소드를 통해 직접 닫아줘야 하는 자원이 많다. try-finally public class TryTest { private String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } @Test void tryFinallyTest()..