아이템 53. 가변인수는 신중히 사용하라 가변인수 메서드가 호출되면, 가변인수 개수와 동일한 배열이 생성되고 인수가 배열에 저장되어 넘겨짐. 가변인수가 적어도 1개 이상 필요한 메서드에서 가변인수는 안전하지 않을 수 있음. 가변인수의 사이즈를 확인하는 전제조건 검사로 보완 가능. 1개의 값을 명시적으로 받고, 나머지를 가변인수로 받아 더 깔끔하게 보완 가능. 가변인수 메서드가 호출될 때 마다 새로운 배열이 할당되므로 성능에 민감한 경우 병목구간이 될 수 있음. 케이스 분석 후, 오버로딩을 통해서 성능 최적화를 도모해 볼 수 있음. 가변인수는 안전할까? 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 배열에 저장해서 메서드에 넘겨준다. 메서드에서는 배열로 받기 때문..
Effective Java : 아이템 73. 추상화 수준에 맞는 예외를 던져라. 저수준 예외는 고수준 예외로 변경(예외번역)해서 상위 계층으로 던져야 함. 현재 계층의 저수준 예외가 상위 계층으로 던져지면, 현재 계층의 내부 구현이 상위 계층을 오염시킴. 예외 번역 시, 저수준 예외가 디버깅에 도움이 된다면 예외 연쇄를 사용. 저수준 예외는 고수준 예외로 변경 저수준 예외를 고수준으로 추상화해서 상위 계층으로 던져야 한다. 그렇지 않으면 하위 계층의 내부 구현을 상위 계층이 알게 된다. 이 말은 상위 계층이 하위 계층의 내부 구현을 알고 적절히 대응해야 하는 것을 의미한다. 클래스 간의 의존성이 높아지는 방향이기 때문에 지양해야 한다. 일반적으로 예외 번역은 이런 식으로 사용할 수 있다. // 하위 계층..
Effective Java : 아이템 49. 매개변수가 유효한지 검사하라. 메서드가 시작할 때 매개변수 유효성 검사를 해라. 만약 여기서 오류를 잡지 못하면, 메서드 내에서 알 수 없는 에러가 발생하거나 이상한 객체가 만들어져 다른 메서드에 예외를 발생시킬 수 있다. 공개 API는 매개변수 유효성 검사에 실패했을 때 발생할 수 있는 에러와 조건을 문서화 해야함. (@throws 태그) private API에는 반드시 유효한 값만 전달되도록 개발자가 직접 작성해야 함. 이것을 전제로 assert 문으로 처리할 수 있음. assert 문은 일반적으로는 런타임에서 무시됨. (성능 영향 없음) 필요한 경우 java -ea로 활성화 할 수 있음. 나중에 사용할 값을 매개변수로 받는 경우, 매개변수 유효성 검사를 ..
Effective Java : 아이템 45. 스트림은 주의해서 사용하라. 스트림과 For문을 적절히 사용하는 것이 베스트 케이스다. 극단적으로 스트림만 쓰거나, For문만 쓰는 경우는 지양하자. 스트림은 지연 평가됨. 스트림 최초 원소와 최종 연산에 참여하는 원소는 다를 수 있음. 스트림 내에서는 함수 객체(람다, 메서드 참조)를 주로 사용한다. 함수 객체는 타입이 주로 생략되므로 가독성을 위해 매개변수 이름을 잘 지어야 함. 도우미 메서드를 적절히 활용하는 것은 함수 객체(스트림쪽)에서 도움됨. 너무 어려운 코드라면 하나의 도우미 함수로 빼서 가독성을 올릴 수 있음. char 타입을 처리할 때는 Stream을 사용하지 말자. 스트림에서 처음에 사용된 원소였으나 최종 연산에서 사용할 수 없게 된 경우, ..
Effective Java : 아이템 39. 명명 패턴보다 어노테이션을 사용하라 명명 패턴은 test_a, test_b 처럼 특정한 이름을 규칙을 가진 녀석들이 특정한 작업을 하도록 정의하는 패턴임. 명명 패턴은 다음 단점이 있음. 이름을 잘못 쳐도 컴파일 에러가 나지 않음. test_a → tste_a로 친 경우 명명 패턴에 필요한 매개변수를 전달할 수 없음. test_ThrowableException이라고 쳤을 때, 컴파일러는 ThrowableExeption이라는 글자가 무엇을 의미하는지 알 수 없음. 어노테이션을 사용하면 명명패턴의 단점을 극복할 수 있음. 명명패턴은 컴파일 에러가 발생하지 않으나, 어노테이션은 잘못 사용되었을 경우 컴파일 에러가 발생되므로 단단한 코드를 작성할 수 있음. 어노테이션..