java week14, 제네릭
in Java on Java, Week14
목차
람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)
를 지칭하는 용어이다.
익명함수?
함수에 이름이 없는 함수이다. 익명함수들은 공통으로 일급객체(First Class citizen)
라는 특징을 가지고 있다.
이 일급 객체
란 일반적으로 다를 객체들에 적용 가능한 연산을 모두 지원하는 개체를 가르킵니다. 함수를 값으로 사용 할 수도 있으며 파라메터로 전달 및 변수에 대입 하기와 같은 연산들이 가능하다.
람다의 장단점
장점
- 코드의 간결성
- 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다.
- 코드의 간결성
- 지연연산 수행
- 람다는 지연연상을 수행 함으로써 불필요한 연산을 최소화 할 수 있다.
- 지연연산 수행
- 병렬처리 가능
- 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있다.
- 병렬처리 가능
단점
- 람다식의 호출이 까다롭다.
- 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어진다.
- 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있다.
람다식 사용법
기본
int max(int a, int b){
return a > b ? a: b;
}
- 반환 타입과 메서드 이름을 지운다.
- 매개변수 선언부와 몸통 사이를 활살표 (->)로 연결한다.
람다식 1
(int a,int b) - > {return a>b?a:b; }
- return문 대신 식으로 대신할 수 있다. 문장이 아닌 식이므로 끝에 세미콜론이 붙지 않는다.
- 선언된 매개변수의 타입이 추론 가능한 경우 타입을 생략할 수 있다.
람다식 2
(a, b) -> a > b ? a : b
단 매개변수의 타입을 생략 시 모든 매개변수의 타입을 생략해야한다.
(int a, b) -> .... //컴파일 에러
- 만약 매개변수가 하나라면 괄호()를 생략할 수 있다. (단. 매개변수의 타입을 생략하지 않았다면 괄호()생략이 불가능 하다.)
람다식 3
a -> a * a
- 바디부의 문장이 하나일 때는 괄호를 생략할 수 있다. 주의할 점은 이 때 문장의 끝에 세미콜론을 붙이지 않아야 한다.
기본
(String name, int i) -> { System.out.println(name + "=" + i); }
람다식 4
(name, i) -> System.out.println(name + "=" + i)
함수형 인터페이스
함수형 인터페이스(Functional interface)는 1개의 추상 메소드를 갖고 있는 인터페이스를 말한다.
사용하는 이유?
함수형 인터페이스를 사용하는 이유는 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문이다.
public interface FunctionalInterface {
public abstract void doSomething(String text);
}
기본 사용 (익명 클래스의 활용)
FunctionalInterface func = new FunctionalInterface() {
@Override
public void doSomething(String text) {
System.out.println(text);
}
};
func.doSomething("do something");
람다식 활용
함수형 인터페이스와 람다식으로 익명 클래식을 간단하게 표현
FunctionalInterface func = text -> System.out.println(text);
func.doSomething("do something");
람다식의 타입과 형변환
람다식은 익명 객체다. 익명 객체는 타입이 없다.(컴파일러가 임의로 타입을 지정하긴한다.) 함수형 인터페이스로 람다식을 참조할 수 있는 것을 뿐, 람다식의 타입이 함수형 인터페이스의 타입과 일치하는 것은 아니다. 그래서 대입연산자의 양변의 타입을 일치시키려면 아래와 같이 형변환을 해주어야한다.