Java/Effective Java
-
[Effective Java] Item 12. toString을 항상 재정의하라Java/Effective Java 2020. 8. 24. 00:05
Object의 기본 toString() 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없습니다. toString()의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 합니다. 또한 이 규약은 "모든 하위 클래스에서 이 메서드를 재정의하라"고 합니다. toString()을 잘 구현한 클래스는 디버깅을 용이하게 해줍니다. toString()은 오류 메시지를 로깅할 때 자동으로 호출되어 유용한 정보들을 남길 수 있게됩니다. 만약 그렇지 않다면 쓸모없는 메시지만 로그에 남을 것입니다. map 객체를 출력했을 때 {Jenny=PhoneNumber@adbbd} 보다는 {Jenny=707-867-5309} 라는 메시지가 나오는 것이 훨씬 보기에 좋다고 생각될 ..
-
[Effective Java] Item 11. equals를 재정의하려거든 hashCode도 재정의하라Java/Effective Java 2020. 8. 23. 22:53
equals()를 재정의한 클래스는 모두 hashCode()도 재정의해야 합니다. 그렇지 않으면 hashCode() 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으키게 됩니다. Object에 명세되어 있는 규약 equals() 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode() 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode()는 똑같은 값을 반환해야 한다. equals(Obejct)가 두 객체를 다르다고 판단했더라..
-
[Effective Java] Item 10. equals는 일반 규약을 지켜 재정의하라Java/Effective Java 2020. 8. 21. 23:05
equals()를 재정의 하지 않는 것이 최선인 경우 각 인스턴스가 본질적으로 고유한 경우. 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스가 여기 해당합니다. Thread가 좋은 예로, Object의 equals() 메서드는 이러한 클래스에 딱 맞게 구현되어 있습니다. 인스턴스의 논리적 동치성(logical equality)을 검사할 일이 없는 경우. 상위 클래스에서 재정의한 equals()가 하위 클래스에도 딱 들어 맞는 경우. 클래스가 private이거나 package-private이고 equals() 메서드를 호출할 일이 없는 경우. equals() 메서드가 실수로라도 호출되는 것을 막고자 한다면 아래와 같이 구현해두면 됩니다. @Override public boolean equals(O..
-
[Effective Java] Item 9. try-finally 보다는 try-with-resources를 사용하라Java/Effective Java 2020. 8. 18. 23:43
자바 라이브러리에는 close() 메서드를 호출하여 직접 닫아줘야 하는 자원이 많습니다. InputStream, OutputStream, java.sql.Connection 등이 좋은 예입니다. 이러한 자원들을 닫을 때는 흔하게 사용하는 try-finally 보다는 try-with-resource를 사용하는 것이 더 간결하고 예외 상황에서 문제점을 파악하기 좋습니다. try-finally 와 try-with-resources 예시를 함께 보며 비교해 보겠습니다. try-finally firstLineOfFile() 메서드 static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(..