객체지향 프로그래밍(55강 - 60강)
02 Feb 2020내부클래스
- 클래스 내부에 구현한 클래스(중첩된 클래스)
- 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
- 주로 외부 클래스 생성자에서 생성
| 종류 | 구현 위치 | 사용 가능한 외부 클래스 변수 | 생성 방법 |
|---|---|---|---|
| 인스턴스 내부 클래스 | 외부 클래스 멤버 변수와 동일 | 외부 인스턴스 변수 외부 전역 변수 |
외부 클래스 먼저 만들고 생성 |
| 정적 내부 클래스 | 외부 클래스 멤버 변수와 동일 | 외부 전역 변수 | 외부 클래스와 무관하게 생성 |
| 지역 내부 클래스 | 메서드 내부 | 외부 인스턴스 변수 외부 전역 변수 |
메서드 호출할 때 생성 |
| 익명 내부 클래스 | 메서드 내부에 구현 변수에 대입하여 직접 구현 |
외부 인스턴스 변수 외부 전역 변수 |
메서드를 호출할 때 생성되거나 인터페이스 타입 변수에 대입할 때 new 예약어 사용하여 생성 |
Lambda
- 자바에서 함수형 프로그램이을 구현하는 방식으로 Java 8부터 지원
- 클래스를 생성하지 않고 함수의 호출만으로 기능 수행
- 함수형 인터페이스 선언
- 함수를 변수처럼 사용 가능
함수형 프로그래밍
- 순수 함수를 구현하고 호출
- 매개 변수만을 사용하도록 만든 함수로, 외부 자료에 부수적인 영향이 발생하지 않도록 함
- 입력 받은 자료를 기반으로 수행하고 외부에 영향을 미치지 않으므로 병렬 처리 가능
- 안정적이고 확장성 있는 프로그래밍
문법
-
매개 변수가 하나인 경우 괄호 생략 가능
str -> {System.out.println(str);} -
중괄호 안의 구현부가 한 문장인 경우 중괄호 생략
str -> System.out.println(str); -
중괄호 안의 구현부가 한 문장이라도 return 문은 중괄호를 생략할 수 없음
str -> return str.length(); -
중괄호 안의 구현부가 반환문 하나이면 return과 중괄호 모두 생략 가능
(x, y) -> x+y str -> str.length()
####
Stream
- 자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)
- 배열, 콜렉션에 동일한 연산이 수행되어 일관성있는 처리 가능
- 한 번 생성하고 사용한 스트림은 재사용 불가
- 스트림 연산은 기존 자료를 변경하지 않음
- 중간 연산과 최종 연산으로 구분
- 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산
중간 연산
-
중간 연산:
filter(),map() -
조건에 맞는 요소를 추출하거나 변환
-
예제
// 문자열의 길이가 5 이상인 요소만 출력 sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));// 고객 클래스에서 고객 이름만 가져오기 customerList.stream().map(c -> c.getName()).forEach(s -> System.out.println(s));
최종 연산
- 스트림의 자료를 소모하며 연산 수행
- 최종 연산 후에 스트림은 더이상 다른 연산을 적용할 수 없음
forEach(): 요소 하나씩 꺼내오기count(): 요소의 개수sum(): 요소의 합
reduce() 연산
-
정의된 연산이 아닌 개발자가 직접 지정하는 연산 적용
-
최종 연산으로 스트림의 요소를 소모하며 연산 수행
-
두번째 요소로 전달되는 람다식에 따라 다양한 기능 수행
// 배열의 모든 요소의 합을 구하는 연산 Arrays.stream(arr).reduce(0, (a, b) -> a + b);