전체 카테고리361 [Effective Java] 아이템11 equals를 재정의하려거든 hashCode도 재정의하라 ■ Object 명세 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. equals(Object)가 두 객체를 같다고 판단했으면, 두 객체의 hashCode는 똑같은 값을 반환해야한다. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시 테이블의 성능이 좋아진다. hashCode 재정의를 하지 않았을 경우 문제가 되는 조합은 두번째 조항이다. 즉, 논리적으로 같은 객체는 같은 해시 코드를 반환해야한다. 아래와 같이 PhoneNumber 클래스가 있.. 2021. 1. 24. [Effective Java] 아이템9 try-finally 보다는 try-with-resources를 사용하라 ■ 자원 닫기 자바 라이브러리에서는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 좋은 예이다. 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이루어지기도 한다. 이런 자원 중 상당수가 안전망으로 finallizer를 활용하지만 그리 믿을만하지 못하다. ■ try-finally를 이용한 자원 닫기 아래 코드는 닫을 자원이 1개일 때 try-finally를 사용해서 닫는 예시 코드 이다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader.. 2021. 1. 24. [Effective Java] 아이템10 equals는 일반 규약을 지켜 재정의하라 ■ equals를 재정의 하지 않는게 좋은 상황 각 인스턴스가 본질적으로 고유할 때 값 클래스가 아닌 동작하는 개체를 표현하는 클래스 (Bean 해당) 인스턴스의 논리적 동치성을 검사할 일이 없을 때 자바 Pattern은 equals를 재정의 하여도 Pattern의 정규 표현식을 비교 상위 클래스에 재정의한 equals가 하위 클래스에 맞을 때 Set은 AbstractSet이 구현한 equals를 상속. List는 AbstractList, Map은 AbstractMap의 equals를 상속한다. 클래스가 private나 package-private이고 equals를 호출할 일이 없을 때 ■ equals를 재정의 해야 하는 경우 두 객체의 주소가 같은지 비교해야하는게 아니라 '논리적 동치성'을 확인해야하는.. 2021. 1. 22. [Effective Java] 아이템8 finalizer와 cleaner 사용을 피하라 ■ 객체 소멸자 자바에서는 두 가지 객체 소멸자를 제공한다. 오브젝트 클래스에 포함된 finalize 메서드와 Java 9에서 추가된 java.lang.ref 패키지에포함된 Cleanner 클래스가 있다. 두 가지 모두 JVM에서 Garbage Collector가 수행될 때 실행되는 구문이다. 그런데 finalize 메서드는 Java 9에서 Deprecated 되었다. 또한 새로 추가된 Cleaner의 경우도 사용을 권장하지 않는다. ■ 사용 지양 이유 사용 했을 때 실행 시점을 보장할 수 없다. 실행 조차 안될 수 있다. 즉시 실행이 안되는 것을 감안하더라도 프로그램이 비정상 종료된다는 등의 이유로 실행조차 안될 수도 있다. 특정 시점 또는 반드시 실행되어야 한다는 것을 기대하고 사용해서는 안된다. 역.. 2021. 1. 21. [알고리즘] 가장 먼 노드(그래프) 1. 문제 2. 나의 풀이 그래프를 bfs 알고리즘을 이용해서 풀었다. 처음에는 노드의 번호와 1번으로부터 해당 노드까지의 edge 길이를 저장하는 Node 클래스를 선언해서 사용했는데 8,9번쪽에서 메모리 초과 오류가 나서 Integer를 사용하였고 edge 길이의 경우 dist 배열을 하나 선언하여 1번부터 해당 노드까지 이동하는데 드는 비용을 저장했다. 이렇게 변경 후에도 메모리 오류가 나서 graph의 경우는 방문했다 안했다만 저장하면 되므로 int[][] graph에서 boolean[][] graph로 변경하였다. import java.util.*; class Solution { private static int max = -1; private static int maxCount = 0; pub.. 2021. 1. 20. [알고리즘] [2020 카카오 블라인드] 괄호 변환 1. 문제 문제를 딱 보면 엄청나게 많은 조건들이 있다. 사람은 한번에 여러가지를 기억하지 못하기 때문에 조건을 이해하는데 시간이 오래 걸렸다. 2. 나의 풀이 문제를 봤을 때 재귀를 이용하는 문제라는 것을 알았다. 우선 문제의 조건대로 주어진 문자열의 길이가 0일 경우 빈 문자열을 반환하게 하고, 현재 문자열이 올바른 괄호 문자열일 경우 해당 문자열을 그대로 반환했다. 또한 문자열 u는 균형잡힌 괄호 문자열이므로 문자열 w를 u와 v로 나누어주는 getBalanceIndex() 메서드를 만들어 주었다. 여기서 return할 때 1을 더해주어 문자열 u와 v를 구분하는 인덱스를 구한다. 그리고 u가 올바른 괄호 문자열일 경우는 문자열 u에 v를 다시 나누는 재귀함수를 호출해서 더해준다. u가 올바른 괄호.. 2021. 1. 18. 이전 1 ··· 18 19 20 21 22 23 24 ··· 61 다음