22일차(2) 배운 내용(호호,,, 얼른 빨리 이 부분은 지나갔으면 좋겠다,, 이 어려운 내용들 누가 내 머리에 넣어줬으면,,)
2. 람다식
1) 람다식 정의
2) 람다식 기본 문법
3) 타겟 타입과 함수적 인터페이스(@FunctionalInterface)
- 함수적 인터페이스
- 매개변수와 리턴값 없는 람다식
- 매개 변수가 있는 람다식
- 리턴값이 있는 람다식
[ 람다식 ] (그냥 이해하는 정도까지만..! 하자 ^^ )
[ 1 ] 람다식 정의
- 람다식은 익명 함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수지향 언어에 가깝다.
- 간단하게 말하자면, 람다식 익명 구현 객체를 간단하게 적은 식을 의미한다.
- 람다식의 장점 : 자바 코드가 매우 간결해짐,
컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.
Runnable runnable = new Runnable() { // 익명구현객체
public void run(int num) {
System.out.println(num);
}
};
runnable.run(3);
// 람다식 (형태)
Runnable runnable = (num) -> { // (int num)으로 적지 않고 (num)으로 적는다. <- 매개변수의 타입을 안적는다는 것!
System.out.println(num);
};
runnable.run(3);
// 람다식으로 표현할 익명 구현 객체는 메서드가 하나만 있어야 한다.
// 메서드가 여러개 재정의되어 있으면 어떤 매개변수를 사용해서 어떤 메서드를
// 사용해야 하는지 헷갈리고 모르게 되기 때문에 메서드는 하나만 구현되어 있어야 한다!
@FunctionalInterface
public interface MyFunctionalInterface {
// 상수
// abstract method() : 추상 메서드
public void method(); // abstract 생략 가능
// default method() : 디폴트 메서드
// static method() : 정적 메서드
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
// 인터페이스이름 + 지역변수;
MyFunctionalInterface fi;
// 인터페이스 = 익명 구현 객체
// fi 변수에는 익명 구현 객체가 할당되어 있다.
fi = new MyFunctionalInterface() {
@Override
public void method() {
String str = "method call1";
System.out.println(str);
}
};
fi.method(); // "method call1" 출력
// 인터페이스 = 람다식
// 람다식은 익명 구현 객체를 간단하게 적은 식을 의미한다.
fi = () -> {
String str = "method call1";
System.out.println(str);
};
fi.method();
// 람다식 더 간결하게
fi = () -> {
System.out.println("method call1");
};
fi.method();
// 더더더 간결하게
fi = () -> System.out.println("method call1");
fi.method();
}
}
[ 2 ] 람다식 기본 문법
1) 함수적 스타일의 람다식 작성법
- 기본형 : (타입 매개변수, ...) -> { 실행문, ...... }
- 매개 변수를 이용해서 중괄호{ }를 실행한다는 뜻으로 해석하면 된다.
2) 타입은 런타임시에 대입값에 따라 자동으로 인식된다. -> 매개변수의 타입은 생략 가능하다
3) 하나의 매개변수만 있는 경우, 매개변수 감싸고 있는 ( ) 괄호 생략 가능하다.
4) 하나의 실행문만 있는 경우 또는 return문만 있는 경우, 실행문 감싸고 있는 { } 중괄호 생략 가능하다.
5) 매개변수가 없는 경우, 괄호 ( ) 생략 불가능
6) 메서드의 리턴값이 있는 경우, return 문 사용한다.
EX)
(a) -> { System.out.println(a); }
// 위와같은 경우 매개변수가 a 하나이므로 ( ) 괄호 생략해서 적을 수 있고
// { } 중괄호 안에 실행문도 하나만 있으므로 { } 중괄호를 생략해서 다음과 같이 적을 수 있다.
a -> System.out.println(a)
( ) -> System.out.println()
// 이러한 경우엔 ( ) 안에 매개변수가 없으므로 ( ) 괄호를 생략해서 적을 수 없다.
(x,y) -> { return x+y; }
// 이러한 경우에는 { } 중괄호 안에 return문만 있으므로 { } 중괄호를 생략해서 다음과 같이 적을 수 있다.
(x,y) -> x+y
@FunctionalInterface
public interface MyFunctionalInterface {
public void method(int x, int y); // 매개변수가 있는 추상 메서드
}
public class MyMethodReferencesExample {
public static void main(String[] args) {
// 인터페이스이름 + 지역변수;
MyFunctionalInterface fi;
// 인터페이스 = 익명구현 객체
fi = new MyFunctionalInterface() {
@Override
public void method(int x, int y) {
int result = x * y;
System.out.println(result);
}
};
fi.method(5, 5); // 25 = 5*5 출력
// 람다식
fi = (x, y) -> {
int result = x * y;
System.out.println(result);
};
fi.method(5, 5);
/* 매개변수가 x 하나일때
fi = x -> {
int result = x * 5;
System.out.println(result);
};
fi.method(5);
*/
}
}
[ 3 ] 타겟 타입과 함수적 인터페이스(@FunctionalInterface)
1) 함수적 인터페이스
- 타켓 타입 이란
: 람다식은 인터페이스의 익명 구현 객체를 생성할 때 사용된다. 생성될 때 람다식이 대입될 인터페이스를
람다식의 타겟 타입 (target type) 이라고 한다.
--> 인터페이스 변수 = 람다식;
- 함수적 인터페이스(@FunctionalInterface) 이란
: 람다식의 타겟 타입 즉, 람다식이 대입되는 인터페이스는 하나의 추상 메서드만 선언되어야 한다.
이때 그러한 인터페이스를 함수적 인터페이스라고 한다.
이런 함수적 인터페이스에는 @FunctionallInterface 어노테이션을 붙여준다. 그 이유는 컴파일러에게
"이 인터페이스는 추상메서드가 하나만 있는 인터페이스야~" 라고 알려주는 역할을 해줌으로써
추상 메서드가 두개 이상 선언되는 실수를 방지해줄 수 있기 때문이다.
( 물론 안붙여줘도 되지만,, 우린 사람이니까,, 추상메서드 두개를 선언하는 실수를 범하게 될수도,,
그러면 컴파일러는 뭐가 잘못되었는지 인식 못해,, 오류 발생할 가능성이 있다..! 오류 다 없애버려어ㅓㅓ)
@FunctionalInterface
public interface MyFunctionalInterface {
// 리턴값의 타입 : int형
public int method(int x, int y);
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
MyFunctionalInterface fi;
fi = (x, y) -> {
int result = x + y;
return result;
};
System.out.println(fi.method(2, 5)); // 7 출력
fi = new MyFunctionalInterface() {
@Override
public int method(int x, int y) {
return sum(x, y);
}
};
// 이렇게 긴 식을 아래처럼 한줄로 아아주 간결하게 적을 수 있다.
fi = (x, y) -> sum(x, y);
// 위의 식 간결하게 적은 코드
System.out.println(fi.method(3, 5)); // 8 출력
}
public static int sum(int x, int y) {
return (x + y);
}
}
2) 매개변수와 리턴값 없는 람다식
@FunctionalInterface
// 매개변수와 리턴값이 없는 추상메서드를 가진 함수적 인터페이스
public interface MyFunctionalInterface {
// 상수
// abstract method() : 추상 메서드
public void method(); // abstract 생략 가능 // 리턴값 없는 메서드
// default method() : 디폴트 메서드
// static method() : 정적 메서드
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
// 인터페이스이름 + 지역변수;
MyFunctionalInterface fi;
// 인터페이스 = 익명 구현 객체
// fi 변수에는 익명 구현 객체가 할당되어 있다.
fi = new MyFunctionalInterface() {
@Override
public void method() {
String str = "method call1";
System.out.println(str);
}
};
fi.method(); // "method call1" 출력
// 인터페이스 = 람다식
// 람다식은 익명 구현 객체를 간단하게 적은 식을 의미한다.
fi = () -> {
String str = "method call1";
System.out.println(str);
};
fi.method();
// 람다식 더 간결하게
fi = () -> { // 매개변수 없고 리턴값 없는 경우
System.out.println("method call1");
};
fi.method();
// 더더더 간결하게
fi = () -> System.out.println("method call1");
fi.method();
}
}
3) 매개변수가 있는 람다식
@FunctionalInterface
// 매개변수가 있고 리턴값이 없는 추상 메서드를 가진 함수적 인터페이스
public interface MyFunctionalInterface {
public void method(int x, int y); // 매개변수가 있는 추상 메서드
}
public class MyMethodReferencesExample {
public static void main(String[] args) {
// 인터페이스이름 + 지역변수;
MyFunctionalInterface fi;
// 인터페이스 = 익명구현 객체
fi = new MyFunctionalInterface() {
@Override
public void method(int x, int y) {
int result = x * y;
System.out.println(result);
}
};
fi.method(5, 5); // 25 = 5*5 출력
// 람다식
fi = (x, y) -> {
int result = x * y;
System.out.println(result);
};
fi.method(5, 5);
/* 매개변수가 x 하나일때
fi = x -> {
int result = x * 5;
System.out.println(result);
};
fi.method(5);
*/
}
}
4) 리턴값이 있는 람다식
@FunctionalInterface
// 매개변수 있고 리턴값이 있는 추상 메서드를 가진 함수적 인터페이스
public interface MyFunctionalInterface {
// 리턴값의 타입 : int형
public int method(int x, int y);
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
MyFunctionalInterface fi;
fi = (x, y) -> {
int result = x + y;
return result;
};
System.out.println(fi.method(2, 5)); // 7 출력
fi = new MyFunctionalInterface() {
@Override
public int method(int x, int y) {
return sum(x, y);
}
};
// 이렇게 긴 식을 아래처럼 한줄로 아아주 간결하게 적을 수 있다.
fi = (x, y) -> sum(x, y);
// 위의 식 간결하게 적은 코드
System.out.println(fi.method(3, 5)); // 8 출력
}
public static int sum(int x, int y) {
return (x + y);
}
}
'kh-정보교육원' 카테고리의 다른 글
25, 26, 27, 28일차_배운 내용(나는야 코생아 응애,,) (2) | 2022.12.09 |
---|---|
23,24일차_배운 내용(여전히 코생아) (2) | 2022.12.06 |
22일차(1)_배운 내용(어김없이 코생아) (1) | 2022.12.01 |
21일_배운 내용(오늘도 코생아) (0) | 2022.12.01 |