JAVA/Effective Java(16)
-
[Java][Effective Java] item 10. equals는 일반 규약을 지켜 재정의하라 (일관성)
1. equals 메서드 재정의시 지켜야 하는 일반 규약 : 일관성(consistency) 일관성은 두 객체가 같다면(어느 하나 혹은 두 객체 모두가 수정되지 않는 한) 앞으로도 영원히 같아야 한다는 의미입니다. 가변 객체(mutable object)는 비교 시점에 따라 서로 다를수도 혹은 같을 수도 있는 반면, 불변 객체(immutable object)는 한번 다르면 끝까지 달라야 합니다. 따라서 불변 클래스로 만들기로 했다면 equals가 한번 같다고 한 객체와는 영원히 같다고 답하고, 다르다고 한 객체와는 영원히 다르다고 답하도록 만들어야 합니다. 일관성 조건을 만족시키지 않는 조건 클래스가 불변 또는 가변이든 equals의 판단에 신뢰할 수 없는 자원이 끼어드는 경우 예를 들어 java.net.U..
2022.06.07 -
[Java][Effective Java] item 10. equals는 일반 규약을 지켜 재정의하라 (대칭성, 추이성)
1. equals를 재정의하지 않아도 되는 상황 각 인스턴스가 본질적으로 고유한 경우 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없는 경우 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없는 경우 equals를 호출하는 것을 막고 싶다면 다음과 같이 재정의할 수 있습니다. @Override public boolean equals(Object o){ throw new AssertionError();// 호출금지 } 2. equals를 재정의해야 하는 상황 equals를 재정의해야 할때는 객체 식별성(object identity; 두 객체가 물리적으로 같은..
2022.06.07 -
[Java][Effective Java] item 9. try-finally 보다 try-with-resources를 사용하라
1. try-finally 방식의 용도 자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등과 같은 입출력 클래스는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많습니다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally 방식을 사용하여 인스턴스가 실행 도중 예외가 발생하거나 메서드에서 반환되는 경우를 포함하여 자원을 안정적으로 회수할 수 있도록 합니다. 다음 예제는 try-finally 방식을 사용하여 일반적으로 자원을 회수하는 방식입니다. // try-finally 구문을 활용한 일반적인 자원 회수 static String firstLineOfFile(String path) throws IOException { // ..
2022.06.03 -
[Java][Effective Java] item 7. 다 쓴 객체 참조를 해제하라
C, C++언어 같은 경우 인스턴스를 전부 사용한다음 수동으로 해제를 해주어야 합니다. 하지만 Java 언어 같은 경우는 가비지 컬렉터가 있기 때문에 해제를 명시하지 않아도 인스턴스가 영역 밖으로 나가게 되면 가비지 컬렉터는 자동으로 회수해갑니다. 하지만 이러한 가비지 컬렉터도 객체를 회수하지 못하고 메모리 누수가 발생할 수 있습니다. 1. 메모리 누수 사례 : Stack public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 10; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACIT..
2022.05.24 -
[Java][Effective Java] item 6. 불필요한 객체 생성을 피하라
1. 불변 객체의 재사용 똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 편이 날을때가 많습니다. 특히 불변 객체는 언제든지 재사용할 수 있습니다. String s1 = "hello"; // 권장하는 방법, 하나의 String 인스턴스를 사용함 String s2 = "hello"; String s3 = new String("hello") // 따라하지 말것, 쓸데없는 인스턴스를 생성함 위 코드를 그림으로 표현하면 다음과 같습니다. 위 그림을 보면 s1과 s2는 String Pool에 있는 hello 문자열 리터럴을 가리키고 s3 같은 경우는 인스턴스를 새로 생성했기 때문에 String pool 영역이 아닌 Heap 영역에 생성됩니다. 따라서 s3과 같이 인스턴스를 생성하지 말고 Stri..
2022.05.18 -
[Java][Effective Java] item 5, 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
많은 클래스가 하나 이상의 자원에 의존합니다. 예를 들어 맞춤법 검사기는 사전(dictionary)에 의존하는데, 이러한 의존성을 가지는 클래스를 다음과 같이 적절하지 못하게 정의한 사례가 있습니다. 1. 의존성을 가지고 있는 클래스를 적절치 못하게 정의한 사례 : 정적 유틸리티 클래스로 정의 public class SpellChecker { private static final Lexicon dictionary = new Lexicon(); // 객체 생성 방지 private SpellChecker() { throw new AssertionError(); } public static boolean isValid(String word) { return false; } public static List s..
2022.05.17