아이템 52. 다중정의는 신중히 사용하라. 다중정의(Overloading)된 메서드는 컴파일 시점에 어느 메서드가 호출될지 결정된다. 재정의된(Overriding)된 메서드는 런타임 시점에 객체 타입으로 어느 메서드가 호출될지 결정된다. 다중정의는 사용하지 않는 것이 좋다. 사용하는 쪽에서 어떤 메서드가 사용될지 추론하기 어렵기 때문이다. 매개변수 수가 같은 다중정의는 가급적이면 사용하면 안됨. 대안 다중정의 대신 이름을 다르게 지어주면 됨. 생성자라면서 팩토리 메서드를 사용하면 됨. 다중정의 어쩔 수 없는 경우 매개변수 수가 같은 다중정의라도, 각 매개변수가 근본적으로 다른 경우라면 어떤 메서드가 호출될지 정확히 추론할 수 있음. 근본적으로 다른 경우는 서로 형변환 할 수 없는 경우를 의미함. 허나 오..
아이템 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'로 특별 취급할 필요가 있을까? 빈 컬렉션을 특별 취급할 필요가 ..