JAVA 10일차

Lucy in the Sky with Diamond·2023년 6월 23일

람다식

특정 인터페이스의 추상메소드를 구현하기 위해 사용됨

First Class Object(일급객체)

함수에 인자로 넘기기,수정하기 변수에 대입하기와 같은 연산을 지원할때 일급객체라고함
다른객체들에게 일반적으로 적용 가능한 모든 연산이 적용되는 객체들.

예를 들어보면...

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로 취급이 가능하다.


소스 코드1
소스 코드2

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 인터페이스


※Shadowing

중요한것은 람다는 스코프따위가 없다!

0개의 댓글