[Java] Ch12. 내부 클래스, 람다식, 스트림 / 객체 지향 프로그래밍 중급 / K-Digital Credit Java / Summary
김파고띠2022. 5. 29. 16:06
| 내부 클래스
| 내부 클래스란?
클래스 내부에 구현한 클래스 (중첩된 클래스)
클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
주로 외부 클래스 생성자에서 내부 클래스를 생성
| 내부 클래스 유형
<내부 클래스 유형 Table>
| 람다식
| 람다식이란?
자바에서 함수형 프로그래밍(Functional Programming)을 구현하는 방식
클래스를 생성하지 않고 함수의 호출만으로 기능을 수행
함수형 인터페이스를 선언함
자바 8부터 지원되는 기능
함수형 인터페이스는 메서드를 2개 이상 선언 X
| 함수형 프로그래밍이란?
순수 함수(Pure Function)를 구현하고 호출
매개 변수만을 사용하도록 만든 함수로 외부 자료에
부수적인 영향(Side Effect)가 발생하지 않도록 함
입력받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로
병렬 처리등에 가능, 안정적인 확장성 있는 프로그래밍 방식
| 람다식 문법
매개 변수 하나인 경우 괄호 생략가능 (2개인 경우는 괄호를 생략할 수 없음)
str -> {System.out.println(str);}
중괄호 안의 구현부가 한 문장인 경우 중괄호 생략
str -> System.out.println(str);
중괄호 안의 구현부가 한 문장이라도 return 문은 중괄호를 생략할 수 없음
str -> return.str.length(); //오류
중괄호 안의 구현부가 반환문 하나라면 return과 중괄호를 모두 생략할 수 있음
(x,y) -> x+y // 두 값을 더하여 반환
str -> str.length() // 문자열 길이를 반환
| 코드 예시
// MyMaxNumber.java
package lambda;
@FunctionalInterface
public interface MyMaxNumber {
int getMaxNumber(int x, int y);
}
// TestMyNumber.java
package lambda;
public class TestMyNumber{
public static void main(String[] args){
MyMaxNumber max = (x,y)->(x >= y)?x : y;
System.out.println(max);
}
}
// 출력문
// 20
| 람다식, 함수를 변수처럼 사용하는
프로그램에서 변수는...
자료형에 기반하여 선언하고 int a;
매개변수로 전달하고 int add(int x, int y);
메서드의 반환 값으로 사용 return num;
람다식은 프로그램 내에서 변수처럼 사용할 수 있음
| 스트림
| 스트림 (Stream)
자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능(자료의 추상화)
배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능
한번 생성하고 사용한 스트림은 재사용할 수 없음
스트림 연산은 기존 자료를 변경하지 않음
중간 연산과 최종 연산으로 구분됨
최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산
| 스트림 연산 - 중간 연산
중간 연산 - filter(), map()
조건에 맞는 요소를 추출 (filter())하거나 요소를 변환함(map())
[문자열의 길이가 5 이상인 요소만 출력하기]
[고객 클래스에서 고객 이름만 가져오기]
| 스트림 연산 - 최종 연산
스트림의 자료를 소모하면서 연산을 수행
최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없음
forEach() : 요소를 하나씩 꺼내옴 count() : 요소의 개수 sum() : 요소의 합
이외도 여러가지 최종 연산이 있음
| 코드 예시
package stream;
import.java.util.Arrays;
public class IntArrayTest{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
int sum = Arrays.stream(arr).sum();
int count = (int)Arrays.stream(arr).count();
System.out.println(sum);
System.out.println(count);
}
}
| reduce() 연산
정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용
최종 연산으로 스트림의 요소를 소모하며 연산 수행
배열의 모든 요소의 합을 구하는 reduce() 연산
2번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행