본문 바로가기
JAVA/기초

[JAVA 기초] 13 내부 클래스, 람다식, 스트림

by 푸_푸 2022. 8. 19.
728x90

*내부 클래스
- 내부 클래스 : 클래스 내부에 선언한 클래스
내부에 클래스를 선언하는 이유는 외부 클래스와 밀접한 관련이 있기 때문

*인스턴스 내부 클래스
인스턴스 변수를 선언할 때와 같은 위치에 선언
외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 사용
외부 클래스 생성 후 생성되어 생성전에는 인스턴스 내부 클래스를 사용할 수 없음

*정적 내부 클래스
static 예약어 사용. 외부 클래스 생성과 무관하게 내부 클래스 사용할 수 있음
정적 메서드에서는 인스턴스 변수를 사용할 수 없음

정적 내부 클래스에서 일반/정적 메서드 변수 사용

 

변수 유형 일반 메서드 정적 메서드
외부 클래스의 인스턴스 변수 X X
외부 클래스의 정적 변수 O O
정적 내부 클래스의 인스턴스 변수 O X
정적 내부 클래스의 정적 변수 O O


*지역 내부 클래스
지역 변수처럼 메서드 내부에 클래스를 정의하여 사용하는 것
메서드 안에서만 사용할 수 있음
지역 내부 클래스에서 사용하는 메서드의 지역 변수는 상수로 바뀜

*익명 내부 클래스
클래스 이름 없이 선언하고 바로 생성하여 사용
하나의 인터페이스 또는 추상 클래스를 바로 생성할 수 있음
인터페이스는 인스턴스로 생성할 수 없어 인터페이스 몸체가 필요
;(세미콜론)을 사용하여 익명 내부 클래스가 끝났다는 것을 알려줌
안드로이드에서 이벤트를 처리하는 핸들러를 구현할 때 사용

종류 구현 위치 사용할 수 있는
외부 클래스 변수
생성 방법
인스턴스 내부 클래스 외부 클래스 멤버 변수와 동일 외부 인스턴스 변수
외부 전역 변수
외부 클래스를 먼저 만든 후 내부 클래스 생성
정적 내부 클래스 외부 클래스 멤머 변수와 동일 외부 전역 변수 외부 클래스와 무관하게 생성
지역 내부 클래스 메서드 내부에 구현 외부 인스턴스 변수
외부 전역 변수
메서드를 호출할 때 생성
익명 내부 클래스 메서드 내부에 구현
변수에 대입하여 직접 구현
외부 인스턴스 변수
외부 전역 변수
메서드를 호출할 때 생성되거나 인터페이스 타입 변수에 대입할 때 new 예약어를 사용하여 생성

*람다식
자바는 객체 기반 프로그램으로 클래스를 먼저 만들고 메서드를 구현해 호출하여 사용함. 클래스가 없으면 메서드를 사용할 수 없음
그러나 함수의 구현과 호출만으로 프로그램을 만들 수 있는 방식이 있고, 이 방식을 함수형 프로그래밍이라고 함


- 람다식 : 자바에서 제공하는 함수형 프로그래밍 방식
람다식 문법

(매개변수) -> {실행문;}



*함수형 인터페이스
함수형 언어에서는 함수만 따로 호출할 수 있지만, 자바에서는 함수형 인터페이스를 만들고 람다식으로 구현할 메서드를 선언함
람다식은 이름이 없는 익명 함수로 구현하기 때문에 인터페이스에 메서드가 여러 개 있다면 어떤 메서드를 구현한 것인지 모호해지기 때문에, 오직 하나의 메서드만 선언한 인터페이스를 구현할 수 있음

*객체 지향 프로그래밍 방식과 람다식의 비교
- 람다식으로 구현하는 경우 기존의 객체 지향 프로그래밍 방식보다 코드가 간결해짐
- 람다식을 구현하여 호출하면 익명 클래스가 생성되고 익명 객체가 생성됨
- 람다식은 함수를 변수처럼 사용(함수의 구현부를 변수에 대입, 매개변수로 전달, 함수의 반환 값으로 사용)

 

*스트림(Stream)
- 스트림 : 자료가 모여있는 배열이나 컬렉션 또는 특정 범위 안에 있는 일련의 숫자를 처리하는 기능을 미리 구현해 놓은 클래스
배열, 컬렉션 등의 자료를 일관성 있게 처리할 수 있음
스트림을 생성하고 미리 구현되어있는 메서드를 사용

*스트림 연산
- 중간 연산
filter() : 조건을 넣고 그 조건에 맞는 참인 경우만 추출하는 경우에 사용
map() : 클래스가 가진 자료 중 이름만 출력하는 경우에 사용
- 최종 연산
forEach() : 요소를 하나씩 꺼내는 기능
count() : 배열 요소의 개수 출력
sum() : 배열 요소의 합계 출력

*스트림의 특징
1) 자료의 대상과 관계없이 동일한 연산을 수행함
2) 한 번 생성하고 사용한 스트림은 재사용할 수 없음
3) 스트림의 연산은 기존 자료를 변경하지 않음
4) 스트림의 연산은 중간 연산과 최종 연산이 있음

*reduce() 연산
내부적으로 스트림의 요소를 하나씩 소모하면서 프로그래머가 직접 지정한 기능을 수행함

reduce(초깃값, (전달되는 요소) ->요소가 수행할 기능)
728x90

댓글