❯ 애너테이션(Annotation)
애너테이션이란, 소스코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소.
@ 로 시작하며 클래스, 인터페이스, 필드, 메서드 등에 붙여서 사용함
표준 애너테이션
JDK에 내장되어 있는 일반적인 애너테이션
@Override : 메서드 앞에만 붙을 수 있으며, 선언한 메서드가 상위 클래스의 메서드를 오버라이딩 하거나 추상 메서드를 구현하는 메서드라는 것을 컴파일러에게 알려주는 역할.
@Deprecated : 기존 사용하던 것이 다른 기술로 대체되어 더이상 사용하지 않도록 유도할 때 사용.
@SuppressWaring : 컴파일 경고 메세지가 나타나지 않도록 사용. 경고가 발생할 것이 예상됨에도 묵인해야할 때 사용.
ex. @SuppressWaring("all") : 모든 경고를 억제. 이처럼 괄호 안에 억제하고자하는 경고 메세지 지정 가능
@FunctionalInterface : 함수형 인터페이스 선언할 때, 바르게 선언되었는지 확인.
메타 애너테이션
다른 애너테이션을 정의할 때 사용하는 애너테이션
애너테이션을 정의할 때는 @interface를 사용함. ex. public @interface Override{ }
@Target : 애너테이션을 적용할 대상을 지정하는데 사용. FIELD, METHOD, TYPE 등 다양하며
java.lang.annotation.ElementType에 정의되어있음. (필요시 참고)
@Documented : 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정.
@Inherited : 하위 클래스가 애너테이션을 상속받도록함. 상위 클래스에 @Inherited를 붙이면 하위 클래스에도 동일하게 적용됨
@Retention : 애너테이션의 지속 시간을 결정함. SOURCE, CLASS, RUNTIME 으로 구분됨.
@Repeatable : 애너테이션을 여러번 붙일 수 있도록 허용하는것.
같은 이름의 애너테이션이 여러번 적용 가능하므로 하나로 묶어주는 컨테이너 애너테이션 필요.
사용자 정의 애너테이션
사용자가 직접 애너테이션을 정의해서 사용할수도 있음. 애너테이션은 java.lang.annotation을 상속받으므로 다른 클래스나 인터페이스를 상속받을 수 없음.
❯ 람다(Lambda)
함수형 프로그래밍 기법을 지원하는 자바의 문법요소. 메서드를 하나의 식으로 나타낼 수 있음
기본문법
반환 타입과 이름을 생략할 수 있음 ⇒ 익명 함수(anonymous function)이라고도 함.
// (1) 일반적인 메서드
int sum(int num1, int num2){
return num1 + num2;
}
// (2) 반환타입과 메서드 이름을 생략하고 화살표를 추가해 람다식으로 변경
(int num1, int num2) -> {
return num1 + num2;
}
// (3) 메서드 바디에 실행문이 하나만 존재할 경우 중괄호와 return 문 생략 가능. 이 때 세미콜론도 생략
(int num1, int num2) -> num1 + num2
// (4) 매개변수 타입을 함수형 인터페이스를 통해 유추 가능한 경우 매개변수 타입 생략 가능
(num1, num2) -> num1 + num2
(1)~(4) 모두 같은 내용을 나타냄
함수형 인터페이스
자바에서 함수는 반드시 클래스 안에서 정의되어야 하므로, 메서드가 독립적으로 있을수 없음
람다식 또한 하나의 객체이므로 익명 클래스를 통해 호출할 수 있음 ⇒ 함수형 인터페이스로 이를 해결
익명 클래스 : 객체 선언과 생성을 동시에 하여 단 하나의 객체를 생성하고, 단 한번만 사용되는 일회용 클래스.
함수형 인터페이스는 단 하나의 추상 메서드만 선언 가능. 람다식과 인터페이스가 1:1로 매칭되어야하기 때문.
매개변수와 출력값은 있을수도, 없을수도 있음. 함수형 인터페이스의 형태에 따라 달라짐.
// <예시>
public class LambdaExample{
public static void main(String[] args) {
ExampleFunction exampleFunction = (num1, num2) -> num1 + num2
System.out.println(exampleFunction.sum(10, 15));
}
@FunctionalInterface // 함수형 인터페이스인지 컴파일러에게 확인 요청
interface ExampleFunction {
int sum(int num1, int num2);
}
}
// 출력값 : 15
메서드 레퍼런스(참조)
불필요한 매개변수를 제거할 때 주로 사용. 더욱 간단한 코드 작성을 위해 사용.
람다식은 기존 메서드를 단순 호출(매개값을 메서드에 전달)하는 경우가 많음. 이 때 입력값과 출력값을 일일이 적는것은 중요하지 않음.
이 때 사용하는 방법이 메서드 참조임.
클래스명 :: 메서드 // 정적 메서드 참조하는 경우
참조변수 :: 메서드 // 인스턴스 메서드 참조하는 경우
클래스명 :: new // 생성자 참조하는 경우
참고자료
부트캠프가 시작된지 벌써 4주가 되어가고있다.
하루하루가 어떻게 지나가는지 모를만큼 빠르게 지나간다.
특히 이번주에 공부해야하는 양이 많고 내용이 쉽게 와닿지 않아서 더 시간이 빠듯한 느낌이 드는것같다.
우선 이번주 내용을 한번 학습하고는 관련 내용 영상 강의도 찾아보고 예제 연습도 더 해야겠다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
19일차: 파일입출력(InputStream, OutputStream), 스레드(Thread) (0) | 2023.03.10 |
---|---|
18일차: 스트림(Stream) (0) | 2023.03.09 |
16일차: 컬렉션(Collection Framework) (0) | 2023.03.07 |
15일차: 컬렉션(Enum, Generic, Exception Handling) (0) | 2023.03.06 |
14일차: 미니 프로젝트(의존성 주입) (0) | 2023.03.03 |