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이라는 글자가 무엇을 의미하는지 알 수 없음. 어노테이션을 사용하면 명명패턴의 단점을 극복할 수 있음. 명명패턴은 컴파일 에러가 발생하지 않으나, 어노테이션은 잘못 사용되었을 경우 컴파일 에러가 발생되므로 단단한 코드를 작성할 수 있음. 어노테이션..
아이템 40. @Override 어노테이션을 일관되게 사용해라. 상위 클래스 / 추상 클래스 / 인터페이스 중 재정의 하는 메서드가 있다면 반드시 @Override 어노테이션을 사용하라. 재정의 (Overriding)와 다중정의 (OverLoading)은 다른것임. @Override 어노테이션은 '재정의' 한다는 의도를 나타냄. @Override 어노테이션이 붙은 메서드가 '재정의'의 요건에 맞지 않을 경우 컴파일 에러 발생시킴. 상위 클래스 equals(Object o) → 재정의 메서드 equals(String o) 이 경우 함수 시그니쳐가 달라 다중정의(오버로딩)이 되면서 @Override 어노테이션이 붙은 경우 컴파일 에러 발생함. @Override 어노테이션 @Override 어노테이션은 다음 ..