본문 바로가기
[Effective Java] int 상수 대신 enum 을 사용하자. [Effective Java] int 상수 대신 enum 을 사용하자. - int enum pattern 이라고 불리는 int 를 이용한 분기는 단점이 많다. - 타입 안전을 보장하지도 않고, 편리하게 사용할 수 있는 방법도 제공하지 않는다. 즉 취약하다. - int enum 상수를 출력 가능한 문자열로 쉽게 바꾸는 방법도 없다. - 하나의 int enum 그룹에 있는 모든 상수를 loop 처리하거나, 그룹 사이즈를 알 수 있는 좋은 방법도 없다. - int enum 패턴의 변이로 String enum 패턴이 있는데 더더욱 바람직하지 않다. print 하는 부분에서는 좋지만, 문자열 비교에 의존하여 성능 문제가 생길 수도 있다. 더욱 문제가 되는 것은 필드명 대신 string 상수 값을 클라이언트 코드에.. 2016. 12. 19.
[Effective Java] 제네릭 메소드를 애용하자. [Effective Java] 제네릭 메소드를 애용하자. - 클래스를 제네릭화 하듯 메소드 또한 제네릭화 하면 좋다. 특히 static 유틸리티 메소드가 제네릭화의 좋은 후보이다. 제네릭 메소드는 제네릭 타입과 유사한 방법으로 작성한다. - 타입 매개변수를 메소드 선언부에 추가한 후 그 타입 매개변수를 메소드 내부에서 사용하면 된다. 타입 매개변수를 선언하는 타입 매개변수 목록은 return 타입 앞에 둔다. - 바운드 와일드 카드 타입 ( bounded wildcard types ) 를 사용하면 그 메소드를 더 유연하게 만들 수 있다. - 제네릭 메소드는 제네릭 생성자를 호출할 때 반드시 지정해야 하는 타입 매개변수 값을 명시적으로 지정할 필요가 없다. 컴파일러가 메소드 인자의 타입을 조사하여 타입 매.. 2016. 12. 1.
[Effective Java] 전략을 표현할 때 함수 객체를 사용하자. [Effective Java] 전략을 표현할 때 함수 객체를 사용하자. - 자바는 함수 포인터를 제공하지 않는다. 대신 객체 참조를 사용해서 유사한 효과를얻을 수 있다. 호출된 객체의 메소드에서 다른 객체(메소드로 전달되는)의 메소드를 수행하도록 객체를 정의하는 것이 가능하다. 그런 메소드 하나만 달랑 외부에 제공하는 클래스의 인스턴스는 사실상 메소드 포인터의 역할을 한다. 그런 인스턴스를 함수 객체(function object)라고 한다. ex) Comparator Interface 를 상속한 Class instance. - 좋은 함수 객체는 상태가 없어 static final, singleton 으로 사용 가능한 녀석이다. Summary 함수 포인터의 주 용도는 전략(strategy) 패턴을 구현하는.. 2016. 11. 15.
[Effective Java] equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자. equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자. - equals 메소드를 오버라이드 하는 모든 클래스에서는 반드시 hashCode 메소드도 오버라이드 해야 한다. 그렇게 하지 않으면 Object.hashCode 메소드의 보편적 계약을 위반하게 되어, HashMap 과 HashSet 및 HashTable 을 포함하는 모든 hash 기반 컬렉션들에서 제대로 작동 안 할 수 있다. - HashCode 의 메소드 명세 계약 사항은 아래와 같다. 1. equals 메소드에서 비교하는 객체의 값이 변경되지 않는다면, 여러번 호출해도 일관성 있는 정수를 반환해야 한다. ( 단 어플리케이션이 재실행 될 때까지 같을 필요는 없다. ) 2. equals 메소드 호출 결과 두 .. 2016. 10. 5.
[Effective Java] private 생성자를 사용해서 인스턴스 생성을 못하게 하자. private 생성자를 사용해서 인스턴스 생성을 못하게 하자. - static 메소드와 static 필드만을 모아 놓은 클래스를 만들 경우 private 생성자를 사용해서 인스턴스 생성을 못하게 하자. - 명시적으로 지정한 생성자가 없을 때는 컴파일러가 디폴트 생성자 ( default constructor ) 를 생성한다. 이는 javadoc 프로그램으로 생성하는 API 문서에도 나타나므로 인스턴스 생성이 가능한 클래스로 오인될 수 있다. public class UnilityClass{ private UtilityClass(){ throw new AssertError(); } ... } - 이 방법은 sub class 를 가질 수 없다는 단점이 있지만, Utility 함수들은 대부분 상속을 위해 설계되지.. 2015. 4. 5.
반응형