> 익명객체 Anonymous Object
인터페이스 타입으로 변수를 선언하고 구현 객체를 초기값으로 대입하는 경우, 보통 인터페이스의 구현 클래스를 선언하고 new 연산자를 이용해서 구현 객체를 생성한 후 필드나 로컬변수에 대입함
하지만 구현 클래스가 매번 달라지거나 한번만 사용되는 경우, 굳이 구현 클래스를 생성하지 않고 익명 클래스(이름없는 클래스)로 선언할 수 있음
interface Car { //인터페이스
public void run(); //추상메소드
}
public class Garage { //클래스
//인터페이스 변수 = new 인터페이스() { };
//중괄호와 같이 클래스 선언, 멤버변수에 구현클래스 저장됨
public Car cc = new Car() { //익명객체cc
public void run() {
System.out.println("부릉"); //추상메소드 반드시 오버라이딩
}
};
}
> 람다식 Lambda Expression
함수적 프로그래밍
Y = f(x); 함수로 구성된 프로그래밍 기법
함수를 매개값으로 전달하고 결과를 받음
함수적 프로그래밍이 객체 지향 프로그래밍보다 효율적인 경우: 대용량 데이터 처리 시, 이벤트 지향 프로그램 시
→ 최근 프로그래밍 기법: 객체 지향 프로그래밍 + 함수적 프로그래밍
람다식 장점: 코드가 간결해짐, 컬렉션 요소 처리가 쉬워짐
< How to use? >
람다식은 함수적 인터페이스 (추상 메소드가 하나인 인터페이스) 의 익명 구현 객체를 대신함
람다식은 코드블럭(code block)을 메소드에 넣을 때 사용하는 기술
익명 함수를 생성하기 위한 식: (매개변수, 매개변수) -> {실행문}
//인터페이스 Say01 //함수적 인터페이스 (추상메소드가 Say01 하나)
public interface Say01 {
public void talking(); //추상메소드 talking
}
//클래스 Person
public class Person {
public void greeting (Say01 say) { //메소드 greeting - 매개변수로 인터페이스Say01 전달
say.talking(); //인터페이스Say01의 메소드talking 호출
}
}
//main클래스 - 기존 익명 객체 방법
public class Main01 {
public static void main(String[] args) {
Person p = new Person(); //객체생성
p.greeting(new Say01() {
public void talking() {
System.out.println("안녕");
}
} //익명객체구현 new 인터페이스() {추상메소드 오버라이딩}
); //메소드 greeting 호출, 매개변수로 인터페이스 전달
}
}
//main 클래스 - 람다식
public class Main01 {
public static void main(String[] args) {
Person pp = new Person(); //객체생성
pp.greeting( () -> { //매개값 () -> {실행문}
System.out.println("안녕");
}
); //메소드 greeting 호출
}
}
< 반복자 스트림 >
컬렉션의 저장요소를 하나씩 참조하도록, 람다식으로 처리할 수 있도록 해주는 반복자
(파일 입출력 stream 과는 다른 개념)
- 특징
Iterator와 비슷한 역할을 함
대부분 메소드는 함수적 인터페이스 타입
속도 빠름
컬렉션에서의 stream 사용 예제)
//기존 코드
package lambda;
import java.util.*;
public class CollectEx {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("리사");
list.add("제니");
list.add("지수");
list.add("로제");
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
//stream 반복자 코드
package lambda;
import java.util.*;
import java.util.stream.Stream;
public class StreamEx {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("리사");
list.add("제니");
list.add("지수");
list.add("로제");
Stream<String> strm = list.stream();
strm.forEach( (name) -> System.out.println(name));
}
}
Stream은 중간처리와 최종처리를 함수형으로 표현가능
- 중간처리 메소드
distinct(): 중복을 제거하는 기능
filter(): 매개값으로 주어진 Predicate가 true를 리턴하는 원소만 필터링
mapXXX(): 원소를 대체하는 원소로 구성된 새로운 스트림 리턴
sorted(): 원소를 정렬
- 최종처리 메소드
forEach(): 결과를 출력할 때 사용
Collect(): 컬렉션 객체를 List, Set, Map으로 변환처리 할 때 사용
'course 2021 > JAVA' 카테고리의 다른 글
day23 - thread (0) | 2021.09.30 |
---|---|
day21 - regular expression (0) | 2021.09.27 |
day20 - API(3) stream (0) | 2021.09.26 |
day19 - API(2) generic, collection (0) | 2021.09.22 |
day18 - API(1) java.lang, java.util (0) | 2021.09.15 |