0. 복습
Set
- 데이터의 순서를 보장하지 않는다(인덱스 개념 x)
- 중복을 허용하지 않는다
- 구현 클래스 : HashSet
Map
- 데이터의 순서를 보장하지 않는다
- 데이터를 key와 value 한쌍으로 저장
- key로 해당 value에 접근할 수 있다
- 구현 클래스 : HashMap
1. 내부 클래스(Inner Class)
클래스의 멤버 : 필드, 메서드, 클래스(내부 클래스)
- 내부 클래스 : 클래스 내부에 선언된 클래스
- 외부 클래스 : 내부 클래스를 가진 클래스
- 내부클래스로 선언된 클래스는 외부 클래스를 상속받지 않아도 외부 클래스의 멤버들을 사용할 수 있음
- 내부클래스만으로는 객체화 불가능
- 외부 클래스를 먼저 객체화해야 내부 클래스 객체 생성 가능
** 내부 클래스는 앱개발에 사용되나 웹개발에서는 많이 쓰이지 않음
=> 익명 클래스에서 내부 클래스 개념이 나오므로 알고 있어야함
1) 내부 클래스의 종류
- 인스턴스 내부 클래스
- 스태틱 내부 클래스
- 로컬 내부 클래스
2. 익명 클래스(Anonymous Class)
- 이름이 없는 클래스이다
- 클래스를 선언과 동시에 객체를 생성한다
- 주로 인터페이스나 추상 클래스의 구현체를 즉석에서 만들기 위해 사용한다.
1) 익명 클래스의 특징
- 익명 클래스는 이름이 없다
- 변수, 메서드, 클래스에 이름이 있는 이유는 필요할 때 불러서 사용하겠다
=> 반복적으로 사용
- 이름이 없다 -> 부를 수 없다 -> 반복 사용 불가능, 일회성 사용만 가능하다
2) 익명 클래스를 사용하는 이유
- 인터페이스, 추상 클래스는 객체화가 불가능하여 부모로 사용되어야 함
- 그 말은 자식 클래스를 만들어야한다는 것인데 딱히 재사용할 목적이 없다면 익명 클래스로 만들어 사용함
- 익명 클래스는 일회성이어서 객체화 시키면 끝임
-> 쓸데없는 파일이 생기지 않음
3. 함수형 인터페이스(Functional Interface)
- jdk 8버전에 추가된 내용
- 추상 메서드가 한 개만 존재하는 인터페이스를 함수형 인터페이스라고 한다
- 함수형 인터페이스는 @FunctionalInterface 어노테이션을 붙이는게 안전
4. 람다식(Lambda Expression)
- 함수형 인터페이스와 함께 jdk8부터 도입된 기능
- 익명 메서드라고도 불린다
- 함수형 인터페이스를 익명 클래스로 구현하여 메서드를 재정의하는 대신 람다식을 사용하면 문법이 간결하다
- 함수형 인터페이스를 재정의 할 때만 사용한다 !!
1) 람다식 문법
(1) 람다식의 시그니처는 -> 이다. (-> 있으면 람다식이라는 뜻)
(2) (매개변수) -> {실행할 문장;}
- 매개변수가 1개인 경우에만 () 생략 가능(0개 또는 2개 이상인 경우 생략 불가)
- 실행 문장이 1줄인 경우 {} 생략 가능
(단, 1줄이더라도 return 은 {} 생략 불가)
(3) 최종 생략시 다음 형태까지 줄일 수 있음
매개변수 -> 실행문장;
2) 람다식을 만드는 과정
(1) 익명 클래스
FuncInter fi = new FuncInter() {
@Override
public void method() {
System.out.println("익명클래스로 재정의");
}
};
(2) 함수형 인터페이스는 익명 클래스를 활용하여 재정의하는데 매번 똑같은 틀을 쓸 필요가 없다.
- 남은 코드
@Override
public void method() {
System.out.println("익명클래스로 재정의");
}
(3) 함수형 인터페이스는 어차피 추상 메서드가 1개이므로 무슨 메서드를 재정의 하는지 알려주지 않아도 된다
- @Override 생략
- public void method 선언부 생략
- 남은 코드
() {System.out.println("익명클래스로 재정의");
(4) 람다식의 시그니처는 -> 이다
- 람다식임을 알리기 위해 매개변수()다음 위치에 -> 추가
- 남은 코드
() -> {System.out.println("익명클래스로 재정의");
(5) 람다식은 코드를 최소화 시키는 목적이 있다.
- 람다식에서 {} 영역을 람다식의 몸통(body)라고 부른다
- body에 명령어가 1줄이면 {} 생략이 가능하다(선택사항)
- 남은 코드
() -> System.out.println("익명클래스로 재정의");
(6) 람다식 최종 형태
() -> System.out.println("익명클래스로 재정의");
메서드를 재정의하는 문법을 최소화 시킨 하나의 식이 된다.
메서드 이름이 생략된다(익명 메서드라고 불리는 이유)
3) 자바에서 기본 제공하는 함수형 인터페이스
- 람다식을 사용하기 위해 매번 새로운 함수형 인터페이스를 만드는 것은 번거롭다
- 자바에서 기본적인 함수형 인터페이스를 만들어 제공한다
(1) Consumer< T > : void accept(T t)
(2) Supplier< T > : T get()
(3) Predicate< T > : boolean test(T t)
- T 타입을 전달받아 boolean 타입을 반환
(4) Function< T, R > : R apply(T t)
(5) UnaryOperator< T > : T apply(T t)