본문 바로가기

이펙티브자바35

[Effective Java] 아이템58 전통적인 for문보다는 for-each 문을 사용하라 ■ for문 보다는 for-each문이 낫다 fir문에서 사용하는 반복자와 인덱스는 모두 코드를 지저분하게 한다. 진짜로 중요한건 원소들이다.for each 문이 코드도 더 깔끔하고 오류가 날 일도 없다. 하나의 관용구로 컬렉션과 배열을 모두 처리할 수 있어서 어떤 컨테이너를 다루는지는 신경쓰지 않아도 된다. ■ for-each 문을 사용할 수 없는 상황 세 가지 파괴적인 필터링 : 컬렉션을 순회하면서 선택된 원소를 제거해야 한다. 반복자의 remove 메서드를 호출해야 한다. 자바8는 Collection의 removeIf 메서드를 사용해 컬렉션을 명시적으로 순회하는 일을 피할 수 있다. 변형 : 리스트나 배열을 순회하면서 그 원소의 값 일부 혹은 전체를 교체해야 한다면 리스트의 반복자나 배열의 인덱스를.. 2021. 7. 23.
[Effective Java] 아이템57 지역변수의 범위를 최소화하라 ■ 지역변수 범위 최소화 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역 변수의 범위를 줄이는 가장 강력한 기법은 해당 변수를 가장 처음 사용할 때 선언하는 것이다. 거의 모든 지역 변수는 선언과 동시에 초기화해야한다. 변수를 실제로 사용하는 시점엔 타입과 초기값이 기억나지 않을 수 있다. ■ 반복문과 지역변수 반복문은 for, for-each 형태의 반복문안에서는 반보 변수의 범위가 반복문의 몸체, 그리고 for 키워드 몸체 사이의 괄호 범위로 제한된다. 따라서 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니면 while문보다는 for문을 사용하는게 낫다. ■ 메서드를 작게 유지하고 한가지 기능에 집중하라 메서드를 작게 유지하면 한.. 2021. 7. 23.
[Effective Java] 아이템56 공개된 API 요소에는 항상 문서화 주석을 작성하라 ■ 자바독(Javadoc)이란? API 문서화 유틸리티 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해줌 ■ 공개된 API 요소에는 항상 문서화 주석을 작성하라. 여러분의 API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에doc comment를 달아야 한다. 공개 클래스는 기본 생성자에 주석을 달 수 있는 방법이 없으니 절대 기본 생성자를 사용해서는 안된다. ■ 메서드용 문서화 주석에는 해당 메서드와 클라이언트 사이의 규약을 명료하게 기술 how가 아닌 what을 기술할 것. (상속용으로 설계된 API가 아닌 이상) 메서드를 성공적으로 호출하기 위.. 2021. 7. 12.
[Effective Java] 아이템55 옵셔널 반환은 신중히 하라 ■ 자바 8 이전 자바 8전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 두가지 선택지가 있었다. 1. Exception Throw 예외는 반드시 예외적인 상황에서만 사용해야 한다. 예외는 실행 스택을 추적 캡처하기 때문에 비용이 비싸다. 2. Null Return null을 리턴하는 경우에는 Null Pointer Exception을 항상 조심해야한다. ■ Optional 도입 자바 8에서 Optional가 도입되면서 선택지가 하나 늘었다. Optionl이란 null이 아닌 T타입 참조를 하나 담거나 아무것도 담지 않은 일종의 래퍼 클래스이다. Optional은 원소를 최대 1개 가질 수 있는 불변 Collection이다. 자바 8이전의 코드보다 null-safe한 로직을 처리할 수 있게 해준다.. 2021. 7. 12.
[Effective Java] 아이템54 null이 아닌, 빈 컬렉션이나 배열을 반환하라 ■ null이 아닌, 빈 컬렉션이나 배열을 반환하라 다음은 치즈를 얻어올 때 비어있으면 null을 반환하는 코드이다. public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 위의 코드처럼 작성하면 클라이언트는 null 상황을 처리하는 코드를 추가로 작성해야한다. Shop shop = new Shop(); List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) System.out.println("치즈 획득!"); 컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메.. 2021. 7. 12.
[Effective Java] 아이템53 가변인수는 신중히 사용하라 ■ 가변인수는 신중히 사용하라 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 인수의 개수와 길이가 같은 배열을 만들고 인수들을 배열에 저장하여 가변인수 메서드에 건네준다. 아래 코드는 최솟값을 찾는 메서드인데 인수를 0개만 받을 수 있도록 설계하는건 좋지 않다. 왜냐하면 인수가 0개일 때 컴파일 타임이아닌 런타임 때 실패하기 때문이다. static int min(int... args) { if (args.length == 0) throw new IllegalArgumentException("인수가 1개 이상 필요합니다."); int min = args[0]; for (int i = 1; i < args.length; i++) if (args[i] < min) min = args[i];.. 2021. 7. 12.