아이템 40. @Override 어노테이션을 일관되게 사용해라. 상위 클래스 / 추상 클래스 / 인터페이스 중 재정의 하는 메서드가 있다면 반드시 @Override 어노테이션을 사용하라. 재정의 (Overriding)와 다중정의 (OverLoading)은 다른것임. @Override 어노테이션은 '재정의' 한다는 의도를 나타냄. @Override 어노테이션이 붙은 메서드가 '재정의'의 요건에 맞지 않을 경우 컴파일 에러 발생시킴. 상위 클래스 equals(Object o) → 재정의 메서드 equals(String o) 이 경우 함수 시그니쳐가 달라 다중정의(오버로딩)이 되면서 @Override 어노테이션이 붙은 경우 컴파일 에러 발생함. @Override 어노테이션 @Override 어노테이션은 다음 ..
아이템 44. 표준 함수형 인터페이스를 사용하라. 자바는 람다식 등장 이후 템플릿 메서드 패턴보다 함수형 인터페이스를 생성자 / 팩토리 메서드에 전달되는 방식이 많이 사용됨. 함수형 인터페이스는 기본 제공되는 것을 우선적으로 사용해야 함. API에 대해서 학습해야 할 부분이 적어서 잘 습득할 수 있기 때문임. 커스텀 함수형 인터페이스를 구현할 때는 다음 경우 중 하나를 만족할 때임. 필요한 동작을 함수형 인터페이스에서 구현할 수 없을 때 (값을 받아서 에러를 던지는 것 같은 작업들) 함수형 인터페이스의 이름이 클래스의 의미를 명확하게 설명할 때. 함수형 인터페이스의 이름 / 메서드 명을 통해서 규약이 정의될 때 함수형 인터페이스가 적절한 default 메서드를 제공할 때. @FunctionalInterf..
아이템 43. 람다보다는 메서드 참조를 사용하라. 람다가 메서드 참조보다 가독성이 좋은 경우를 제외하면, 메서드 참조를 사용하라. 람다가 가독성이 더 좋으면 람다를 사용하라. 람다를 메서드 참조로 바꿔서 사용하는 경우 다음 장점 존재 람다는 이름이 없으나 메서드는 이름이 가짐. → 가독성 증가 가능. 람다는 문서화 불가능 → 메서드 참조의 메서드는 문서화 가능 람다에 이름을 붙여서 메서드를 만들면 됨. 메서드 참조는 5가지 타입이 존재함. 정적 메서드 참조 한정적 메서드 참조(인스턴스) 비한정적 메서드 참조(인스턴스) 클래스 생성자 메서드 참조 배열 생성자 메서드 참조 람다보다 메서드 참조를 사용해라 익명 클래스보다 람다는 간결해서 많이 쓰인다. 람다보다 더 간결한 것은 메서드 참조다. 따라서 간결함을 ..
아이템 42. 익명 클래스보다는 람다를 사용하라 - 핵심정리 함수 객체를 표현하기 위해 추상 메서드 하나만 가진 추상 클래스를 익명 클래스로 구현해, 익명 클래스 객체를 함수 객체로 표현함 추상 메서드 하나만 가진 인터페이스는 함수형 인터페이스로 특별 대우를 받게 되었으며, 함수형 인터페이스는 람다식을 통해서도 구현할 수 있다. 익명 클래스 객체처럼 람다식은 '함수형 인터페이스'를 구현한 객체로 생성됨. 이 객체가 함수 객체로 표현됨. 람다식은 컴파일 타임에 제네릭을 이용해 타입을 추론함. 람다식에는 타입을 명시해야 코드가 명확할 때를 제외하고는 타입을 명시하지 않음. 컴파일러가 타입을 알 수 없다고 에러를 내는 경우에만 타입을 명시해야함. 익명 클래스 vs 람다식 익명 클래스의 this는 익명 클래스 ..
아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라. 핵심 요약을 하면 다음과 같다. 마커 인터페이스는 특정 기능이 추가되는 것은 아니고, 타입 정의를 목표로 함. 마커 인터페이스는 컴파일 시점에 타입 에러를 확인할 수 있음. 마커 어노테이션은 컴파일 시점에 에러 확인이 불가능함. 마커 인터페이스는 클래스, 인터페이스에만 사용 가능. 그 외에는 마커 어노테이션을 사용함. 메서드의 매개변수로 받는 타입이라면 마커 인터페이스를 사용해야함. (마커 어노테이션은 타입을 보장할 수 없음) 마커 인터페이스란? 마커 인터페이스는 다음 특징을 가지는 인터페이스를 의미한다. 인터페이스 내부에 어떠한 메서드도 담지 않는다. 즉, 인터페이스를 구현하는 클래스가 구현해야 할 것이 없다. 이 인터페이스를 구현하..