자바 기초

람다식과 어노테이션

YJH3968 2021. 4. 18. 23:10
728x90

1. 람다식

  • 람다식은 잦은 로직 변경을 처리하는 방법인 익명 중첩 클래스를 더 쉽고 간단하게 표현할 수 있는 방법이다.
// 람다식의 형식
(자료형 매개변수, ...) -> { 구현내용부; }
  • 익명 중첩 클래스와는 다르게 클래스 이름도 없고 오버라이딩하는 method 이름도 없다. 단순히 method의 매개 변수 영역만 코드로 되어 있다. 또한 ->을 통해 구현 내용부를 정의하고 있다.
  • 람다식은 다음과 같은 규칙을 따른다.
    1. 구현하는 method가 하나일 때 람다식을 사용할 수 있다.
    2. 구현하는 인터페이스의 이름과 구현해야 하는 method의 이름은 생략하고, 매개 변수와 구현 내용부 사이에 -> 기호를 사용한다.
    3. 구현하는 method의 매개 변수 개수만큼 선언한다. 매개 변수의 이름은 임의로 정할 수 있다.
    4. 구현하는 method의 매개 변수 자료형은 생략할 수 있다.
    5. 매개 변수가 하나이고, 자료형을 나타내는 코드가 없으면 괄호를 생략할 수 있다.
    6. 구현 내용부가 단일 식이면 블록( {} )과 반환(return), 세미콜론(;)을 생략한다.
    7. 구현 내용부가 여러 구문이면 블록 ( {} )과 반환(return), 세미콜론(;)을 사용하는 일반 method의 내용부와 동일하게 구성할 수 있다.
    8. 람다식은 선언 자체가 객체 생성에 해당한다.
// #1
interface MyInterface {
    void myMethod(int x, double y, char z);
}

// #3
(int x, double y, char z) -> { ... }

// #4
(x, y, z) -> { ... }

// #5
x -> { ... }

// #6
(x, y, z) -> System.out.println("test")

// #7
(x, y, z) -> {
    System.out.println("x = " + x);
    System.out.println("y = " + y);
    System.out.println("z = " + z);
    return;
}

// #8
MyInterface myObj = (x, y, z) -> { ... };
// 람다식을 사용해 익명 중첩 클래스를 만드는 예제
interface MyInterface {
    void myMethod(int x);
}
public class LambdaTest {
    public static void main(String[] ar) {
        // 익명 중첩 클래스를 람다식을 이용해 만든다.
        MyInterface obj = x -> System.out.println(x);
    }
}
  • 위 예제에서 인터페이스는 대표적인 함수적 인터페이스로 하나의 기능을 구현할 목적으로 만들어진 인터페이스다.
  • Java SE 8 version부터 JVM은 매개 변수의 자리에 람다식으로 코드를 작성하면 대입되어야 할 객체의 구현체라고 인식하게 되어 있어 특정 method의 매개 변수에 대해 타입을 걱정하지 않아도 된다.
  • 아래 예시와 같이 람다식의 역할이 단순히 매개 변수를 그대로 method에 전달만 하는 것이라면 범위 지정 연산자(::)를 이용해 단순히 호출하려는 method만 선언하는 것도 가능하다. 단, 전달받은 매개 변수의 순서를 바꾸거나 가공하는 경우에는 이러한 변경이 불가능하다.
// Arrays.sort의 경우 두 번째 매개 변수로 Comparator를 구현한 객체를
// 받아 그 안의 compare() method에 따라 첫 번째 array를 정렬한다. 
// 이 때 여기에 람다식을 적으면 자바는 이를 Comparator의 구현체로 인식한다.
Arrays.sort(numbers, (n1, n2) -> NumberManager.compareTo(n1, n2));

// 범위 지정 연산자를 활용해 더 간단히 나타낼 수 있다.
Arrays.sort(numbers, NumberManager::compareTo);
  • 범위 지정 연산자를 사용해 method를 참조하는 형식들은 다음과 같다.
클래스이름::staticMethod
객체이름::멤버method
클래스형이름::method
클래스이름::new // 생성자 method를 호출해 객체 생성
  • 컬렉션 프레임워크의 API에서 데이터를 추출할 때 사용하는 stream() method는 데이터가 적으면 빠른 속도로 처리하지만 데이터가 많으면 따로 스레드 처리를 해야 한다. 이 때 parallelStream() method는 병렬로 데이터를 처리하도록 지원한다.

 

2. 어노테이션

  • 어노테이션(Annotation) : 일종의 메타데이터로 데이터에 대한 부가 정보로 해당 데이터를 설명해준다.
  • 프로그램을 실행하는 데는 직접적인 영향을 주지는 않지만 컴파일러나 인터프리터가 코드에서 어노테이션을 읽어서 필요한 작업을 수행할 수 있도록 해 준다. 
  • 어노테이션은 컴파일러에게 정보 제공할 때, 컴파일러를 통해 미리 수행할 작업을 처리할 때, 프로그램 실행 중 지정된 정보를 활용해 특정 작업을 수행할 때 사용한다.
  • 어노테이션은 무언가를 선언하는 위치에서 사용한다.
// 객체 선언 시
new @어노테이션이름 생성자이름();

// 클래스 선언 시
@어노테이션 
public class 클래스이름... { ... }

// 어노테이션 사용
@어노테이션이름(요소이름 = "값", ... )
  • 어노테이션을 사용할 때 규칙은 다음과 같다.
    • 요소 이름과 값이 없는 형태의 어노테이션도 있다.
    • 요소가 하나일 때는 값만 적을 수도 있다.
    • Java SE 8 version부터는 동일한 어노테이션을 여러 번 적을 수 있다.
  • 어노테이션을 직접 만드는 방법은 다음과 같다.
@Interface 어노테이션이름 { 요소 정의 }
  • 어노테이션을 선언할 때 따르는 규칙은 다음과 같다.
    • 인터페이스를 선언하는 것과 유사하게 선언한다.
    • 각 요소는 method의 형태로 선언한다.
    • 각 요소는 기본값을 default 예약어로 지정할 수 있다.
    • 메타어노테이션(어노테이션을 정의할 때 사용하는 어노테이션)을 사용할 수 있다.

 

출처 : 헬로 자바 프로그래밍(2016)

728x90

'자바 기초' 카테고리의 다른 글

열거형과 컬렉션 프레임워크  (0) 2021.04.18
제네릭  (0) 2021.04.18
자바 멀티 스레드  (0) 2021.04.17
예외 처리와 어설션  (0) 2021.04.16
추상 클래스와 인터페이스  (0) 2021.04.16