아이템 55. 옵셔널 반환은 신중히 하라. 반환할 값이 없을 때는 세 가지 방법이 있음. 예외 던지기 → 예외는 진짜 예외일 때 던져야 하는데, 이게 예외인지? null 반환하기 → null 반환 시 null 대처해야하며, 그러기 위해서 사용자는 메서드의 내부 구조도 알아야함. Optional 반환하기 Optional은 체크 예외처럼 메서드 사용자에게 빈 값이 반환될 수 있음을 알리고 적절히 대체할 것을 요구하기 위한 용도로 사용됨. Optional의 기본 처리 방법은 다음과 같음. 값을 바로 얻기 없는 경우 기본값 설정하기. (비용이 클 경우, orElseGet으로 Supplier를 이용해서 비용 최적화 가능) 없는 경우 예외 던지기. Optional을 잘 사용하는 방법 isPresent()보다 orE..
Effective Java : 아이템 57. 지역변수의 범위를 최소화하라. 지역변수의 범위를 줄이면 가독성이 올라감. 지역변수의 범위를 줄이는 방법 지역변수가 가장 처음 쓰일 때 선언하기 반복문 사용하기 메서드를 작게 유지하고 한 가지 기능에 집중하기 모든 지역변수는 선언과 동시에 초기화 해야 함. 만약 그럴 수 없다면, 지역변수 선언을 미뤄야함을 의미함. Try ~ catch에서 사용될 때는 예외임. 지역변수의 범위는? 지역변수의 범위는 처음 지역 변수가 선언된 지점 ~ 코드 블럭이 끝나는 지점까지다. 아래 코드를 기준으로 살펴보면 지역변수 k, i의 범위는 다음과 같다 k : whereIs() 메서드가 끝나는 지점 i : for문 블록이 끝나는 지점. public void whereIs() { int..
Effective Java : 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라. 전통적인 for문은 다음 단점이 있음. 불필요한 반복자가 많이 생성됨 → 코드 실수 범위가 넓어짐. (잘못된 변수를 사용해도 컴파일러가 잡아주지 않음) 컬렉션 / 배열이냐에 따라 for문의 코드가 달라짐. for-each를 사용하면 위의 단점을 해결해줌. for-each의 콜론(:)은 "안의(in)"으로 읽으면 됨. for-each를 사용할 수 없는 경우 순회하며 원소를 삭제해야 하는 경우. 순회하며 원소를 교체해야하는 경우. 여러 컬렉션을 병렬로 돌아야 하는 경우 → 이 경우 여러 번의 for-each로 분리해서 가능할 수도 있음. 전통적인 for문을 단점이 존재함. While문 보다는 for문을 사용..
아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라. 빈 컬렉션 대신 null을 반환하면 내부 구현 + 사용하는 쪽에서도 null 처리를 해야하는 번거로움이 발생함. 번거로움이 발생함에도 프로그램 자체에 아무런 이득이 없으므로 빈 컬렉션 / 배열을 반환하는것이 나음. 빈 컬렉션을 계속 반환해서 '객체 생성'으로 인해 '성능 문제 발생'이 명확하다면, 불변 객체를 반환하는 방법으로 개선할 수 있음. (대부분은 필요없는 방법임) 빈 컬렉션을 Null로 특별 취급할 필요가 없다. 아래 코드에서 cheessInStock이라는 Collection이 비어있는 경우 null을 반환하는 코드를 볼 수 있다. 그런데 빈 컬렉션을 굳이 'null'로 특별 취급할 필요가 있을까? 빈 컬렉션을 특별 취급할 필요가 ..
아이템 53. 가변인수는 신중히 사용하라 가변인수 메서드가 호출되면, 가변인수 개수와 동일한 배열이 생성되고 인수가 배열에 저장되어 넘겨짐. 가변인수가 적어도 1개 이상 필요한 메서드에서 가변인수는 안전하지 않을 수 있음. 가변인수의 사이즈를 확인하는 전제조건 검사로 보완 가능. 1개의 값을 명시적으로 받고, 나머지를 가변인수로 받아 더 깔끔하게 보완 가능. 가변인수 메서드가 호출될 때 마다 새로운 배열이 할당되므로 성능에 민감한 경우 병목구간이 될 수 있음. 케이스 분석 후, 오버로딩을 통해서 성능 최적화를 도모해 볼 수 있음. 가변인수는 안전할까? 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 배열에 저장해서 메서드에 넘겨준다. 메서드에서는 배열로 받기 때문..