프로그램에게 유용한 정보를 제공하기 위한 주석
❗️개발자의 코드 작성을 위한 주석 comment와 다름
표준 애너테이션 | 설명 |
---|---|
@Override | 컴파일러에게 메서드를 오버라이딩 하는 것이라 알림 |
@Deprecated | 앞으로 사용하지 않을 대상을 알림 |
@FunctionalInterface | 함수형 인터페이스라는 것을 알림 |
@SuppressWarning | 컴파일러가 경고 메세지를 나타내지 않음 |
메타 애너테이션 | 설명 |
---|---|
@Target | 애너테이션을 정의할 때 적용 대상을 지정하는데 사용 |
@Documented | 애너테이션 정보를 javadoc으로 작성된 문서에 포함시킴 |
@Inherited | 애너테이션이 하위 클래스에 상속되도록 함 |
@Retention | 애너테이션이 유지되는 기간을 정하는데 사용 |
@Repeatable | 애너테이션을 반복해서 적용 |
사용자가 직접 정의해서 사용할 수 있는 애너테이션
❗️java.lang.annotation
인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없음
@interface 애너테이션명 {
타입 요소명();
}
메소드를 더 간단하고 편리하게 표현하기 위해 고안된 문법
두 파라미터의 합을 구해서 반환하는 메소드 sum
int sum (int num1, int num2) {
return num1 + num2;
}
위 메소드를 람다식으로 표현
(num1, num2) -> num1 + num2;
✔️ 함수의 이름 x -> 익명 함수
✔️ return 문 삭제
✔️ 한 줄 이내면 중괄호 생략
✔️ 매개변수 타입을 유추할 수 있는 경우 매개변수 타입 생략
위 람다식을 객체로 표현
new Object() {
int sum (int num1, int num2) {
return num1 + num2;
}
}
익명 클래스(람다식)의 경우, 하나의 객체를 생성하여 단 한번만 사용하는 일회용 클래스이다. 따라서 인스턴스에 접근할 방법이 없어서 해당 메소드를 사용할 수 없는데, 이를 보안하기 위해 고안된 것이 함수형 인터페이스이다.
작성방법
// 함수형 인터페이스 애너테이션 추가
@FunctionalInterface
interface ExampleSum {
// 추상메소드 sum 작성
public abstract int sum (int num1, int num2);
}
❗️주의사항
함수형 인터페이스는 람다식과 1대1 매칭을 이뤄야하기 때문에 단 한개의 추상메소드만 선언해야 한다.
참고
람다식으로 간단해진 익명 객체를 더욱 간단하게 사용하고자 고안된 문법 요소
람다식에서 불필요한 매개변수를 제거할 때 주로 사용
(left, right) -> Math.max(left, right);
위 람다식은 두 개의 값을 Math.max의 파라미터로 넘기는 역할을 함
➡️ 입력값 유추 가능
➡️ 메소드 레퍼런스로 변환으로 깔끔하게!
// 클래스 이름 ::메소드 이름
Math :: max;
// int 타입인 경우
IntBinaryOperator operato = Math::max;
정적메소드 참조
클래스 :: 메소드
인스턴스 메소드 참조
참조 변수 :: 메소드
생성자 참조
클래스 :: new
❗️함수형 인터페이스의 추상 메소드와 동일한 매개변수 타입과 개수를 갖는 생성자를 찾아 실행
❗️없으면 컴파일 오류 발생