본문 바로가기
[Effective Java] 박스화 기본형보다는 기본형을 사용하자. [Effective Java] 박스화 기본형보다는 기본형을 사용하자. - 기본형과 박스화 기본형 간에는 크게 세 가지 차이점이 있다. 1. 기본형은 자신의 값만을 갖는 반면, 박스화 기본형은 식별성(identity)를 갖는다. 두 개의 박스화 기본형이 값은 같지만 == 로 비교하면 다를 수 있다는 것이다. 2. 기본형은 완전한 기능 값만을 갖는 반면, 박스화 기본형은 자신과 대응되는 기본형이 가질 수 있는 모든 기능 값에 추가하여 비 기능 값인 null 을 갖는다. 3. 기본형은 일반적으로 박스화 기본형에 비해 실행 시간과 메모리 사용 효율이 좋다. - == 비교 연산자를 박스화 기본형에 적용하면 대부분 틀린 결과가 나온다. 박스화 기본형을 비교할 떄는 두 개의 지역 변수를 추가하여 primitive 타.. 2017. 2. 2.
[Effective Java] 정확한 계산에는 float 이나 double 타입을 쓰지 말자. [Effective Java] 정확한 계산에는 float 이나 double 타입을 쓰지 말자. - float, double 은 이진 부동소수점 연산을 수행하는데, 넓은 범위의 수에 대해 정확한 근사치를 빨리 산출하기 위해 설계되었다. 그러나 정확한 결과를 제공하지 않으므로, 근사치가 아닌 정확한 결과가 필요한 곳에 사용하면 안된다. float 과 double 타입은 돈 계산에는 특히 부적당하다. - 돈 계산할 때 올바른 답을 구하려면 BigDecimal, int, long 타입 중 하나를 사용해야 한다. - BigDecimal 은 정확한 연산을 제공하지만 두 가지 단점이 있다. 1. 기본 데이터 타입을 사용할 떄보다 불편하다. 2. 실행 속도가 느려진다. - BigDecimal 을 사용하지 않으려면, i.. 2017. 1. 31.
[Effective Java] 라이브러리를 배우고 사용하자. [Effective Java] 라이브러리를 배우고 사용하자. - 표준 라이브러리를 사용하면, 그것을 작성한 전문가들의 지식과 더 앞서 사용한 사람들의 경험을 이용하는 것이다. - 라이브러리를 사용하면 해결책을 작성하는 쓸데없는 시간을 낭비할 필요가 없다. - 라이브러리를 사용하면 우리의 노력 없이도 라이브러리의 성능이 지속적으로 개선된다. 또 새로운 기능이 계속 추가된다. - 라이브러리를 사용하면 우리 코드를 주류에 둠으로써 많은 개발자들에 의해 더욱 가독성이 좋아지고, 유지보수 가능하며, 재 사용 가능하게 된다. - 라이브러리를 사용하면 많은 장점이 있지만 많은 개발자들이 그렇게 하지 않는다. 원하는 기능이 라이브러리에 있는지 모르기 때문일 것이다. - 라이브러리는 너무 커서 모든 문서를 파악하기는 어.. 2017. 1. 30.
[Effective Java] 종전의 for 루프보다는 for-each 루프를 사용하자. [Effective Java] 종전의 for 루프보다는 for-each 루프를 사용하자. - for-each 문은 Iterable 인터페이스를 구현하는 어떤 객체도 반복 처리가 가능하다. Iterable 은 다음과 같이 정의된 interface 이다. public interface Iterable{ Iterator iterator();} Iterable 인터페이스 구현은 어렵지 않다. Summary for-each 루프는 종전 for 루프에 비해 많은 장점을 제공한다. 성능 저하가 없으면서 명료하고 버그를 방지해준다. for-each 루프를 사용할 수 없는 경우는 3 가지가 있다. 1. 필터링(filtering) - 어떤 컬렉션의 요소들을 오가면서 선택된 요소들을 삭제할 필요가 있다면 명시적 iterat.. 2017. 1. 26.
[Effective Java] 지역 변수의 유효 범위를 최소화 하자. [Effective Java] 지역 변수의 유효 범위를 최소화 하자. - 지역 변수의 유효 범위를 최소화하면, 코드의 가독성과 유지 보수성을 높이고 에러의 가능성이 줄어든다. - C와 같은 종전 프로그래밍 언어들은 지역 변수를 블록의 맨 앞에 선언해야 했으며, 일부 프로그래머들은 습관 때문에 계속 그렇게 한다. 하지만 이것은 버려야 할 습관이다. 자바에서는 명령문만 적법하다면 어디에든 변수를 선언할 수 있기 때문. - 지역 변수의 유효 범위를 최소화하는 가장 강력한 방법은 그 변수가 최초 사용되는 곳에 선언하는 것. 만일 변수를 사용하기 전에 선언하면 혼란만 생긴다. - 지역 변수의 선언과 초기화에 주의하자. 만일 변수를 올바르게 초기화하는데 필요한 정보가 충분하지 않다면, 충분하게 될 때 까지 선언을 .. 2017. 1. 24.
[Effective Java] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자. [Effective Java] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자. - 사용 가능한 API 라면 반드시 문서화해야 한다. 만일 문서화 주석 규칙에 친숙하지 않다면 배워야 한다. - API 를 문서화하려면, 외부에 제공하는 모든 클래스, 인터페이스, 생성자, 메소드, 필드의 선언부 앞에 문서화 주석을 넣어야 한다. 만일 어떤 클래스가 직렬화될 수 있다면 직렬화 형태도 문서화해야 한다. - 문서화 주석이 빠진 API 를 사용하는 것은 실망스럽고 에러가 생길 가능성이 많다. 유지보수 하기 쉬운 코드를 작성하려면 외부에 공개되지 않는 대부분의 클래스, 인터페이스, 생성자, 메소드, 필드에 대해서도 문서화 주석을 작성해야 한다. - 메소드의 문서화 주석에서는 메소드와 클라이언트 사이의 계.. 2017. 1. 23.
[Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. [Effective Java] null 대신 비어있는 배열이나 컬렉션을 반환하자. - 비어있는 배열이나 컬렉션 대신 null 을 반환하는 메소드를 사용할 때는 null checking 을 하는 복잡하고 긴 형태의 코드를 작성해야 한다. 또한 클라이언트 코드를 작성하는 프로그래머가 반환 값인 null 을 처리하는 코드 작성을 잊어버리면 NullPointerException 이 발생하기 쉽다. - 비어있는 배열보다는 null 값을 반환하는 것이 좋다는 주장도 있다. 배열을 생성하는 비용이 들지 않기 때문이다. 그러나 두 가지 면에서 이는 틀렸다. 1. 해당 메소드가 정말로 성능 문제의 원인인지 성능 프로파일에 나타나지 않으면 이런 경우에는 성능 우려를 할 것이 못 된다. 2. 길이가 0인 배열은 불변 객체이.. 2017. 1. 19.
[Effective Java] 가변인자(varargs)를 분별력 있게 사용하자. [Effective Java] 가변인자(varargs)를 분별력 있게 사용하자. - 1.5 이후에 사용 가능한 가변 인자. - 가변 인자만 받는 method 는 문제가 많다. 가장 심각한 것은 클라이언트가 인자를 주지 않고 메소드를 호출하면 Runtime Exception 이 나기 쉽다. ( 파라미터 없이 call 해도 args 값은 null 은 아니다. ) 또한 validity 를 명시적으로 추가해야 하며, 그 코드가 복잡해질 수 있다. - 가변 인자만 받는 method 대신 어떤 의미를 담은 하나의 인자를 더 받아서 처리하는 것이 좋다. - 성능이 중요한 상황에서 가변 인자를 사용하는 것을 주의하자. 가변 인자 메소드는 호출할 때마다 배열 생성과 초기화가 일어난다. 가변 인자의 유연함이 필요하다면 아.. 2017. 1. 17.
[Effective Java] 오버로딩(overloading)을 분별력 있게 사용하자. [Effective Java] 오버로딩(overloading)을 분별력 있게 사용하자. public class CollectionClassifier{public static String classify(Set s){return "Set";} public static String classify(List lst){return "List";} public static String classify(Collection c){return "Unknown Collection";} public static void main(String[] args){Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() };for( Col.. 2017. 1. 16.
반응형