이펙티브 69

모든 객체의 공통 메서드 - 규칙 10 toString은 항상 재정의하라

toString 재정의를 하지 않은 경우 기본으로 제공되는 toString을 사용하게 될 경우 @ 기호와 16진수로 표현된 해시코드가 붙은 문자열이 반환된다. 이는 사용자가 원하는 정보가 아니므로 사용자는 해당 객체가 원하는 형태로 문자열을 반환할 수 있도록 재정의를 해놓으면 조금 더 유용하게 사용 할 수 있다. 일반적으로 toString 메서드를 재 정의하여 사용하는 경우에는 객체 내의 중요 정보를 전부 담아 반환해야 한다. 또한 toString를 재정의 하였을 경우에는 해당 내용에 대한 주석을 상세하게 기입해 놓아야 한다. 12345678910/* * 모든 객체의 멤버 변수에 대한 데이터를 반환한다. * * a는 첫번재, b는 두번 째 값이다. */ @Override public String toSt..

JAVA/Effective Java 2018.05.29

모든 객체의 공통 메서드 - 규칙 9 equals를 재정의할 때는 반드시 hashCode도 재정의하라

일반적으로 equals 메서드만 재 정의하고 hashCode를 재정의 하지 않아, Object.hashCode의 일반 규약을 어기게 되므로, HashMap, HashSet, Hashtable 같은 해시 기반 컬렉션과 함께 사용하면 오동작하게 된다. 실제 프로젝트에서 Equals와 hashCode를 재정의 하지 않아서 문제가 된 적이 있다. http://blog.naver.com/rokking1/220920301116 ※ hashCode 선언의 규약 - 응용프로그램 실행 중에 같은 객체의 hashCode를 여러 번 호출하는 경우, equals가 사용하는 정보들이 변경되지 않았다면, 언제나 동일한 정수가 반환 되어야 한다. - equals(object) 메서드가 같다고 판단한 두 객체의 hashCode 값은..

JAVA/Effective Java 2018.05.29

모든 객체의 공통 메서드 - 규칙 8 equeals 재정의할 때는 일반 규악을 따르라

Object 는 모든 객체 생성이 가능한 클래스이긴 하지만 기본적으로 계승해서 사용하도록 설계된 클래스 이다. 그런 Object에 정의된 equals, hashCode, toString, clone, finalize는 명시적인 일반 규약이 있다. 재정의 하도록 설계된 메서드들이기 때문에 상황에 따라 재정의를 하지 않을 경우 HashMap, HashSet처럼 해당 규약에 의존하는 클래스와 함께 사용하면 문제가 발생한다. ※ equals를 재 정의 하지 않아도 되는 경우 이중 equals 메서드에 대해서 이야기 해보자. Equals 재정의를 하였을 때 실패할 경우, 문제가 되기 때문에 아래와 같은 상황에서는 구태여 재정의 하지 않아도 된다. 1. 각각의 객체가 고유하다. - Thread 같은 클래스는 Obj..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 7 종료자 사용을 피하라

일반적으로 자주 사용하는 finalizer는 예측 불가능하며, 대체로 위험하고, 불필요하다. 그렇기에 꼭 필요로 하는 작업을 명시할 때에는, 사용해서는 안 된다. 문제 사항 1. final 문장에서 Exception이 발생하였을 경우에 하단에 기재한 문장이 실행되지 않아 결국 문제를 유발할 수도 있다. 123456789try { file = new FileWriter(new File("/test/tt"));} catch (IOException ex) { System.out.println("catch block");} finally { System.out.println(12/0); // 강제로 Exception을 발생시킨다. 하단에 file.close() 문장은 실행되지 않는다. file.close(); ..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 6 유효기간이 지난 객체 참조는 페기하라.

Java는 GC가 있어 C나 C++처럼 순수 메모리 관리를 해주지 않아도 돼서 메모리 관리를 대부분 하지 않는다. 그러나 더 이상 참조하지 않는 객체에 대해 reference를 제거하지 않는 경우에는 어떠한 경우에도 메모리 누수가 발생되게 된다. 이런 reference는 단순하게 null 처리를 해줌으로써 해제된 참조를 해제 할 수 있다. Null로 바꾸게 되면, GC가 해당 객체를 해제할 수 있는 객체라 생각하고 반환해버린다. 하지만 이런 객체참조를 null로 처리하는 것은 규범이라기보다는 예외적인 조치가 되어야 한다. 그렇다면 이런 만기참조를 해결하는데 좋은 방법이 어떤 것인가? 가장 좋은 방법은 해당 참조가 보관된 변수가 유효범위(scope)를 벗어나게 하는 것이다. 또한 캐시(cache)도 메모리..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 5 불필요한 객체는 만들지 말라

기능적으로 동일한 객체는 필요할 때 마다 만들지 않고 재 사용하는 것이 더욱 효율적이다. 사례 1. new String("str") 보다 "str"을 사용하라. 반복문 속에서 String 문장을 사용해야 할 때 new String("test")를 통해서 객체를 새로 생성하는 것이 아니라, "test"와 같이 그 자체가 String 객체인 문장을 사용하는 것이 좋다. 그 이유는 다음과 같다.(출처 : http://blog.vjvj.net/2017/04/effective-java-5.html) 두 가지 경우 모두 생성 시 heap 메모리에 객체가 생성된다. 하지만 "test"와 같이 String 객체를 만드는 경우에는 heap에 String Constant Pool영역에 생성된다. 그래서 사용자가 "test..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 4 객체 생성을 막을 때는 private 생성자를 사용하라.

객체 생성을 막기위해서는 Abstract Class를 이용하거나, 생성자를 private로 생성하면 막을 수 있다. 하지만 이렇게 객체 생성을 막는다는 것은 객체지향 개념에서 벗어나는 행위일 수 있다. 하지만 다음과 같은 경우에 사용을 위해서 사용되기도 한다. 1. 자바의 기본 자료형 값(primitive value) 또는 배열에 적용되는 메서드를 한 군대에 모아둘 때 유용하다. -> Util성 성질을 가지는 클래스에서 유용 Ex) java.lang.Math, java.lang.Arrays Math.abs(), Math.cos() Arrays.asList() 2. 규칙 1번에서 사용하는 정적 메서드를 모아놓을 때도 사용할 수 있다. Ex) java.util.Collections Collections.em..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 3 private 생성자나 enum 자료형은 싱글톤 패턴을 따르도록 설계하라.

1234567891011121314package practice; public class SingleTone {public static SingleTone INSTANCE; public static synchronized SingleTone getInstance() {if ( INSTANCE == null ) {INSTANCE = new SingleTone();}return INSTANCE;} private SingleTone() {}}Colored by Color Scriptercs 기존에 싱글톤 패턴을 사용할 때 다음과 같이 생성해 주었다. 하지만 이런 형태로 만들 시 private 생성자를 생성하였다 해도 java reflection 성질을 이용하여 객체를 생성 할 수있다. 그리고 INSTANCE ..

JAVA/Effective Java 2018.05.29

객체의 생성과 삭제 - 규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라

기존의 생성자로 많은 인자를 넣어 생성자를 추가하려고 하는 경우에는 다음과 같이 점층적 생성자 패턴을 자주 사용한다. 1234567891011121314151617181920점층적 생성자 패턴public class Wedul { private String teamName; private String teamReader; private int memberCnt; public Wedul(String teamName) { this(teamName, "", 0); } public Wedul(String teamName, String teamReader) { this(teamName, teamReader, 0); } public Wedul(String teamName, String teamReader, int m..

JAVA/Effective Java 2018.05.29