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