전체 글
-
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 가이드를 참고하자 자바 라이브러리가 너무 방대해서 일관되지 않은 이름도 많지만 대부분은 납득 가능하다 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 각각 자신의 소임을 다 해야한다 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수가 어렵다..
-
item 50 적시에 방어적 복사본을 만들라책/이펙티브 자바 2022. 4. 13. 16:35
ITEM 50 적시에 방어적 복사본을 만들라 자바는 안전한 언어이며 이게 자바를 쓰는 즐거움 중 하나다 네이티브 메서드를 사용하지 않아 C,C++ 같은 안전하지 않은 언어에서 보이는 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 안전하다 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨 짓을 하든 그 불변식이 지켜진다 메모리 전체를 하나의 배열로 다루는 언어에서는 누릴 수 없는 강점이다 하지만 아무리 자바라도 다른 클래스로부터의 침범을 아무런 노력 없이 다 막을 수 없다 클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다 실제로도 악의적인 의도를 가진 사람들이 시스템의 보안을 뚫으려는 시도가 늘고 있다 평범한 개발자도 순전히 실수로 ..
-
item 49 매개변수가 유효한지 검사하라책/이펙티브 자바 2022. 4. 13. 14:42
ITEM 49 매개변수가 유효한지 검사하라 메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다 한 예로 인덱스 값은 음수면 안되고 객체 참조는 null이 아닌것 이러한 제약조건은 반드시 문서화 시켜야되며 메서드 몸체가 시작되기 전에 검사해야 한다 이건 오류는 가능한 한 빨리 (발생한 곳에서) 잡아야 한다 는 일반 원칙의 한 사례이기도 하다 오류를 발생한 즉시 잡지 못하면 해당 요류를 감지하기 어려워지고 감지하더라도 오류의 발생 지점을 찾기 어려워진다 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다 매개변수 검사를 제대로 하지 못하면 몇 가지 문제가 생길 수 있다 메서드가 수행되는 중간에 모호한 예외를 던지며..
-
item 48 스트림 병렬화는 주의해서 적용하라책/이펙티브 자바 2022. 4. 13. 13:27
ITEM 48 스트림 병렬화는 주의해서 적용하라 주류 언어 중, 동시성 프로그래밍 측면에서 자바는 항상 앞서갔다 처음 릴리즈된 1996년부터 스레드, 동기화, wait/notify를 지원했다 자바 5부터는 동시성 컬렉션인 java.util.concurrent 라이브러리와 실행자(Executor) 프레임워크를 지원했다 자바 7부터는 고성능 병렬 분해(parallel decom-position)프레임워크인 포크-조인(fork-join) 패키지를 추가했다 자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다 자바로 동시성 프로그램을 작성하는게 계속 쉬워지고 있지만 이를 올바르고 빠르게 작성하는건 여전히 어렵다 동시성 프로그래밍을 할 때는 안전성(safety..