책/이펙티브 자바
-
item 60 정확한 답이 필요하다면 float와 double은 피하라책/이펙티브 자바 2022. 4. 21. 17:52
ITEM 60 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입은 과학과 공학 계산용으로 설계되었다 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 근사치로 계산하도록 세심하게 설계 되었다 정확한 결과가 필요한 경우에는 사용하면 안되며 float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다 0.1 혹은 10의 음의 거듭 제곱수를 표현할 수 없기 때문이다 주머니에 1.03달러가 있었는데 그중 42센트를 쓰면 남은 돈은 얼마인가? 어설프게 작성한 코드 System.out.println(1.03 - 0.42); 안타깝게도 결과는 0.60......1 주머니에 1달러가 있었는데 10센트짜리 사탕 9개를 샀으면 얼마가 남았을까 System.out..
-
item 59 라이브러리를 익히고 사용하라책/이펙티브 자바 2022. 4. 21. 17:52
ITEM 59 라이브러리를 익히고 사용하라 기존에 제공하는 표준 라이브러리의 기능 대신 직접 구현하는건 추천하지 않는다 표준 라이브러리를 사용하면 아래와 같은 이점이 있다 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 개발자들의 경험을 활용할 수 있다 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다 따로 노력하지 않아도 성능이 지속해서 계선된다 업계 표준 벤치마크를 사용해 성능을 확인하기 때문에 표준 라이브러리 제작자들은 더 나은 방법을 꾸준히 모색한다 기능이 점점 많아진다 라이브러리에 부족한 부분이 있다면 개발자 커뮤니티에 이야기가 나오고 논의 한 후 다음 릴리즈에 추가되는 경우도 많다 내가 작성한 코드가 다른 사람들이 보기에도 낯..
-
item 58 전통적인 for 문보다는 for-each문을 사용하라책/이펙티브 자바 2022. 4. 21. 17:51
ITEM 58 전통적인 for 문보다는 for-each문을 사용하라 향상된 for문(enhanced for statement) 정식 명칭은 향상된 for문 이지만 for-each문 이라고 부른다 반복자와 인덱스 변수를 사용하지 않으니 코드가 깔끔하고 오류가 날 일도 없다 하나의 관용구로 컬렉션과 배열을 모두 처리 가능하여 어떤 컨테이너를 다루는지 신경쓰지 않아도 된다 for (Element e : elements) { ... // e로 무언가를 한다 } : 은 "안의(in)"라고 읽으면 되며 위 코드는 "elements 안의 각 원소 e에 대해"라고 읽는다 반복 대상이 컬렉션이든 배열이든 for-each문을 사용해도 속도는 그대로다 for-each문이 만들어내는 코드는 사람이 손으로 최적화한 것과 사실상..
-
item 57 지역변수의 범위를 최소화하라책/이펙티브 자바 2022. 4. 21. 17:51
ITEM 57 지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다 C와 같이 역사가 깊은 프로그래밍 언어 중에는 지역변수를 코드 블록의 첫머리에 선언하는 경우가 많으며 습관처럼 이렇게 작성하는 개발자도 많다 자바에서는 문장을 선언할 수 있는 곳이면 어디서든 변수를 선언할 수 있어서 이런식으로 작성하지 않아도 된다 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 가장 처음 쓰일 때 선언하기다 사용하려면 한참 남았는데 미리 선언해두면 코드가 어수선해지고 가독성만 떨어진다 변수를 실제로 사용하는 시점에 타입과 초깃값이 기억나지 않을 수도 있다 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나 다 쓴 뒤에도..
-
item 56 공개된 API 요소에는 항상 문서화 주석을 작성하라책/이펙티브 자바 2022. 4. 21. 17:50
ITEM 56 공개된 API 요소에는 항상 문서화 주석을 작성하라 API를 쓸모 있게 하려면 잘 작성된 문서도 곁들여야 한다 전통적으로 API 문서는 사람이 직접 작성하므로 코드가 변경되면 매번 함께 수정해야줘야 한다 하지만 자바에서는 자바독을 이용하면 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API문서로 만들어준다 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 프로그래머라면 응당 알아야 하는 업계 표준 API라 할 수 있다 API를 똑바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 무선화 주석을 달아야 한다 직렬화 할 수 있는 클래스면 직렬화 형태에 관해서도 적어야한다 기본 생성자에는 문서화 주석을 달 수 없으니 공개 클래스에선..
-
item 55 옵셔널 반환은 신중히 하라책/이펙티브 자바 2022. 4. 19. 13:57
ITEM 55 옵셔널 반환은 신중히 하라 자바8 이전의 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 두가지 선택지 예외를 던지는 방법 정말로 예외적인 상황에서만 사용해야 하며 예외를 생성할 때 스택 추적 전체를 캡쳐하므로 비용도 만만치 않다 반환 타입이 객체 참조라면 null을 반환하는 것 null을 반환할 수 있는 메서드를 호출 할 때는 null이 반환될 일이 절대 없다고 확신하지 않는 한 별도로 null처리 코드를 작성해야 한다 null처리를 무시하고 반환된 null값을 어딘가에 저장해두면 근본적인 원인과 상관없이 언젠가 NPE가 발생 가능 자바8 부터는 하나의 선택지가 더 생겼다 옵셔널을 반환하는 메서드는 예외를 던지는 메서드보다 유연하고 사용하기 쉬우며 null을 반환하는 메서드..
-
item 54 null이 아닌 빈 컬렉션이나 배열을 반환하라책/이펙티브 자바 2022. 4. 15. 17:47
ITEM 54 null이 아닌 빈 컬렉션이나 배열을 반환하라 나쁜예제 - 컬렉션이 비었으면 null을 반환한다 /*** * @return 매장 안의 모든 치즈 목록을 반환한다 * 단, 재고가 하나도 없다면 null을 반환한다 */ public List getCheese() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } 사실 재고가 없다고 해서 특별히 취급할 이유는 없다 하지만 위 코드처럼 null을 반환하게 되면 아래의 코드 처럼 클라이언트가 null을 처리하는 코드를 추가해야된다 List cheeses = shop.getCheese(); if (cheeses != null && cheeses.contains(Chees..
-
item 53 가변인수는 신중히 사용하라책/이펙티브 자바 2022. 4. 15. 17:21
ITEM 53 가변인수는 신중히 사용하라 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다 가변인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다 입력받은 int 인수들의 합을 계산해주는 가변인수 메서드 sub(1,2,3)은 6 , sumb()은 0 static int sum(int... args) { int sum = 0; for (int arg : args) { sum += arg; } return sum; 인수가 1개 이상이어야 할 때도 있다, 예컨대 최솟값을 찾는 메서드인데 인수를 0개만 받을 수도 있도록 설계하는건 좋지 않다 인수 개수는 런타임에(자동 생성된) 배열의 길이로 알 수 있다 잘못된 예 인수가..
-
item 52 다중정의는 신중히 사용하라책/이펙티브 자바 2022. 4. 15. 17:00
ITEM 52 다중정의는 신중히 사용하라 컬렉션을 집합, 리스트, 그 외로 구분하는 프로그램 public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List list) { return "리스트"; } public static String classify(Collection c) { return "그 외"; } public static void main(String[] srgs) { Collection[] collections = { new HashSet(). new ArrayList(), new HashMap().values() }; for (Co..
-
item 51 메서드 시그니처를 신중히 설계하라책/이펙티브 자바 2022. 4. 15. 09:52
ITEM 51 메서드 시그니처를 신중히 설계하라 이번 아이템은 API 설계 요령들이다 잘 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있을 것이다 메서드 이름은 신중히 짓자 항상 표준 명명 규칙을 따라야 한다(item 68) 이해할 수 있고 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 중요하다 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자 긴 이름은 피하고 애매하면 자바 라이브러리의 API 가이드를 참고하자 자바 라이브러리가 너무 방대해서 일관되지 않은 이름도 많지만 대부분은 납득 가능하다 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 각각 자신의 소임을 다 해야한다 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수가 어렵다..