본문 바로가기
부트캠프 개발일기/Java

17일차: Java 심화(Annotation, Lambda)

by shyun00 2023. 3. 8.

❯ 애너테이션(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 // 생성자 참조하는 경우

 

참고자료

 Java.util.function 공식문서

Java 8 -  함수형 인터페이스 이해하기


부트캠프가 시작된지 벌써 4주가 되어가고있다.

하루하루가 어떻게 지나가는지 모를만큼 빠르게 지나간다.

특히 이번주에 공부해야하는 양이 많고 내용이 쉽게 와닿지 않아서 더 시간이 빠듯한 느낌이 드는것같다.

우선 이번주 내용을 한번 학습하고는 관련 내용 영상 강의도 찾아보고 예제 연습도 더 해야겠다.