1. 자바에 람다가 등장하면서 생긴 변화

1) 람다와 정적 팩토리 패턴,생성자

<aside> 💡 템플릿 메서드 패턴이란? 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 작업을 바꾸는 패턴. 즉, 다른 부분은 다 같은데 일부분만 다른 메서드가 여러개 있는 경우의 코드 중복을 최소화 시킬 때 유용하다. 다른 관점에서 보면 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 하는 패턴이다. 예를 들어, 전체적인 알고리즘은 상위 클래스에서 구현하면서 다른 부분은 하위 클래스에서 구현할 수 있도록 함으로써 전체적인 알고리즘 코드를 재사용하는 데 유용한 환경을 제공해준다.

</aside>

<aside> 💡 정적 팩토리와 생성자

</aside>

public Test(String name) { this.name = name; } // 생성자
public static Test withName(String name) { return new Test(name); } // 정적 팩토리 메소드

Test test = new Test("Gyunny"); // 생성자 사용
Test test = withName("Gyunny"); // 정적 팩토리 메소드 사용

<aside> 💡 자바 클래스, 객체, 인스턴스 클래스 : 객체를 만들어 내기 위한 설계도 혹은 틀. 연관되어 있는 변수와 메서드의 집합

객체 : 클래스에 선언된 모양 그대로 생성된 실체

  1. 클래스의 인스턴스(instance) 라고 부르기도 한다.
  2. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
  3. OOP의 관점에서 클래스의 타입으로 선언되었을 때 객체 라고 부른다.

인스턴스 : OOP 관점에서 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 부른다.

  1. 객체는 클래스의 인스턴스다.
  2. 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스다.
  3. 실행 프로세스는 프로그램의 인스턴스다.
  4. 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없다.
  5. 인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미한다.

</aside>


public class CacheExample {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>() {
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 3; } // 가장 최근 데이터 3개만 유지
        };

        map.put("a", 1); map.put("b", 2);
        map.put("c", 3); map.put("d", 4); // 가장 최근 데이터 3개 : b,c,d 만 유지된다.

        System.out.println(map); // { b=2, c=3, d=4 }
    }
}

2) 람다와 함수형 인터페이스

@FunctionInterface interface EldestEntryRemovalFunction<K, V> {
    boolean remove(Map<K,V> map, Map.Entry<K, V> eldest);
}