[Java] 내부 클래스, 람다식, 스트림

2020. 7. 1. 15:13Language/Java

1. 내부 클래스

클래스 내부에 구현한 클래스이다(중첩된 클래스). 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스이다. 주로 외부 클래스 생성자에서 내부 클래스를 생성한다.

내부 클래스 종류, 컴파일 시 파일 생성

1) 인스턴스 내부 클래스

InnerTest

※ 일반적으로 외부 생성자에서 내부 클래스 인스턴스 생성한다.

2) 정적 내부 클래스

staticTest

3) 지역 내부 클래스

4) 익명 내부 클래스

AnonymousTest

 

 

 

2. 람다식

Java에서 함수형 프로그래밍을 구현하는 방식이다. 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행한다. 함수형 인터페이스를 선언하고 Java 8 부터 지원된다.

MyMaxNumber, MyMaxNumberTest

※ FunctionalInterface Annotation을 사용할 경우 정의된 인터페이스 내에는 두 개 이상의 메서드가 들어갈 수 없으며, 익명으로 호출되기에 메서드는 한개여야한다.


StringConcat, Concat, StringConcatTest


LamdaTest

3. 함수형 프로그래밍

매개 변수만을 사용하도록 만든 함수로 외부 자료에 부수적인 영향이 발생하지 않는다. 입력 받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리가 가능하다. 안정적이며 확장성 있는 프로그래밍이다.

1) 매개 변수가 하나인 경우 (괄호 생략)

str -> {System.out.println(str);}

2) 중괄호 안의 구현부가 한 문장인 경우 (중괄호 생략)

str -> System.out.println(str);

3) 중괄호 안의 구현부가 한 문장이더라도, return문은 중괄호 생략 불가

str -> return str.length();

4) 중괄호 안의 구현부가 반환문 하나라면, return과 중괄호 모두 생략 가능

(x, y) -> x+y;
str -> str.length();

 

 

 

4. 스트림

자료의 대상과 관계없이 동일한 연산을 수행할 수 있는 기능이다(자료의 추상화). 배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리가 가능하며 한번 생성하고 사용한 스트림은 재사용 불가하다. 스트림 연산은 기존 자료를 변경하지 않는다. 중간 연산(조건식)과 최종 연산(결과)으로 구분하며, 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산이다.

1) 중간 연산

filter(), map()을 이용하여 조건에 맞는 요소를 추출하거나 변환한다.

문자열이 5 이상인 요소 출력
고객 클래스에서 고객 이름 출력
IntArrayStreamTest

2) 최종 연산

forEach(), count(), sum(), 등을 이용하여 스트림의 자료를 소모하면서 연산을 수행한다. 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없다.

ArrayListStreamTest

※ 스트림 생성 후 람다식이 사용되며 한번 생성된 스트림은 다시 재사용이 불가하다.

3) reduce() 연산

정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용한다. 최종 연산으로 스트림의 요소를 소모하여 연산 수행하고, 두 번째 요소로 전달되는 람다식에 따라 다양한 기능을 수행한다.

배열의 모든 요소의 합을 구하는 reduce() 연산
ReduceStreamTest

 

 

 

5. 스트림 응용

TravelCustomer, TravelTest


[참고] github.com/ozofweird/Java_Practice

728x90