특정 인터페이스의 추상메소드를 구현하기 위해 사용됨
함수에 인자로 넘기기,수정하기 변수에 대입하기와 같은 연산을 지원할때 일급객체라고함
다른객체들에게 일반적으로 적용 가능한 모든 연산이 적용되는 객체들.
예를 들어보면...
public static void printPersons(
List<Person> roster, CheckPerson tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
여기서 List< Person > roster 이 부분이 객체화가 되면서 변수로 넘겨지니까 First Class Object로 취급이 가능하다.
public class Person {
public enum Sex {
MALE, FEMALE
}
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
public int getAge() {
// ...
}
public void printPerson() {
// ...
}
※ Collection : A collection is an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.
(콜렉션은 여러개의 데이터들을 단일 유닛으로 그룹화 시킨 객체로써, 저장과 불러오기,값을 바꾸거나 결집된 데이터끼리 커뮤니케이션을 한다.)
※ Collections VS Collection
Collection 프레임워크를 사용할때 도움을 주는게 Collections라고 생각할것
public static void printPersonsOlderThan(List<Person> roster, int age) {
for (Person p : roster) {
if (p.getAge() >= age) {
p.printPerson();
}
}
}
For each문 : Person이라는 변수 혹은 클래스 속성인데 p라는 변수 혹은 객체가 있으며 roster라는 배열이 존재한다.
(Person p : roster)
익명클래스를 쓰는 이유는 메소드의 일부만 쓰고 치워버리려는 일회용의 용도가 강하다.
근데 이녀석을 람다식으로 써보자가 주요 의의임
printPersons( roster, new CheckPerson() { public boolean test(Person p) { return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25; } } );printPersons( roster, (Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25 );
위의 두가지 코드를 비교해보자!
위가 정석적으로 쓰여진 코드이며 아래가 람다표현식으로 만들어진 First Class Object이다.
(Person p) -> 이부분이 다를텐데.....
( ) 은 파라미터 전달을 하는역할을 하고!
->는 { } 즉 몸통 역할을 한다고 생각하면 된다!
람다표현식이 어려운 이유는 다른게 아니라 파라미터 즉 인터페이스가 익숙하지 않을뿐이다.
람다 파라미터 유추
interface A
-X 추상 메소드
-Y 추상 메소드
lambda(이름이 없음) -> 무언가 구현 in A 인터페이스
무언가가 X인지 Y인지 모르겠어!!
그러므로 X나 Y 하나만 추상메소드를 구현해둔다.
interface A
-X 추상 메소드(parameter)
lambda(parameter) -> X in A 인터페이스
중요한것은 람다는 스코프따위가 없다!