JAVA(244)
-
[Java][Effective Java] item 11. equals를 재정의하려거든 hashCode도 재정의하라
1. equals를 재정의 할 때 hashCode도 재정의해야 하는 이유 equals를 재정의하고 hashCode를 재정의하지 않으면 hashCode 일반 규약을 거기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet과 같은 컬렉션의 원소로 사용할때 문제를 일으킵니다. Object 명세 규약 equals 비교에서 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 합니다. 단, 애플리케이션이 다시 실행한다면 이 값이 달라져도 상관없습니다. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 합니다. 두 인스턴스가 물리적으로 같은 경우 ..
2022.06.10 -
[Java] 8. 예외처리(exception handling)
1. 프로그램 오류 에러의 종류 컴파일 에러(compile-time error) : 컴파일 시에 발생하는 에러 런타임 에러(runtime error) : 실행 시에 발생하는 에러 논리적 에러(logical error) : 실행은 되지만, 의도와 다르게 동작하는 것 에러와 예외의 비교 에러(error) : 프로그램 코드에 의해서 수슬될 수 없는 심각한 오류, 예를 들어 메모리 부족(OutOfMemoryError) 또는 스택오버플로우(StackOverflowError)가 존재합니다. 예외(exception) : 프로그램 코드에 의해서 수습 될 수 있는 다소 미약한 오류 2. 예외 클래스의 계층 구조 예외 클래스의 분류 Exception 클래스와 그 자손들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는..
2022.06.08 -
[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] 메서드를 종료하는 방법 : finalizer
1. Finalizer의 사용 finalize() 메서드는 finalizer에 의해 호출됩니다. Finalizer는 JVM이 특정 인스턴스를 회수해야 한다고 판달될 때 호출합니다. 이러한 finalizer는 인스턴스를 되살리는 것을 포함하여 임의의 동작을 수행할 수 있습니다. finalizer의 주목적은 인스턴스가 사용하는 자원을 메모리에서 제거하기 전에 해제하는 것입니다. finalizer는 자원 해제 작업을 위한 주요한 메커니즘을 작동하거나 다른 메서드들이 실패할 경우 안전망으로써 작동할 수 있습니다. finalizer 작업이 어떻게 수행되는지 이해하기 위해서 다음 클래스 정의를 볼 수 있습니다. public class Finalizable { private BufferedReader reader; ..
2022.06.03