*내부 클래스
- 내부 클래스 : 클래스 내부에 선언한 클래스
내부에 클래스를 선언하는 이유는 외부 클래스와 밀접한 관련이 있기 때문
*인스턴스 내부 클래스
인스턴스 변수를 선언할 때와 같은 위치에 선언
외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 사용
외부 클래스 생성 후 생성되어 생성전에는 인스턴스 내부 클래스를 사용할 수 없음
*정적 내부 클래스
static 예약어 사용. 외부 클래스 생성과 무관하게 내부 클래스 사용할 수 있음
정적 메서드에서는 인스턴스 변수를 사용할 수 없음
정적 내부 클래스에서 일반/정적 메서드 변수 사용
변수 유형 | 일반 메서드 | 정적 메서드 |
외부 클래스의 인스턴스 변수 | X | X |
외부 클래스의 정적 변수 | O | O |
정적 내부 클래스의 인스턴스 변수 | O | X |
정적 내부 클래스의 정적 변수 | O | O |
*지역 내부 클래스
지역 변수처럼 메서드 내부에 클래스를 정의하여 사용하는 것
메서드 안에서만 사용할 수 있음
지역 내부 클래스에서 사용하는 메서드의 지역 변수는 상수로 바뀜
*익명 내부 클래스
클래스 이름 없이 선언하고 바로 생성하여 사용
하나의 인터페이스 또는 추상 클래스를 바로 생성할 수 있음
인터페이스는 인스턴스로 생성할 수 없어 인터페이스 몸체가 필요
;(세미콜론)을 사용하여 익명 내부 클래스가 끝났다는 것을 알려줌
안드로이드에서 이벤트를 처리하는 핸들러를 구현할 때 사용
종류 | 구현 위치 | 사용할 수 있는 외부 클래스 변수 |
생성 방법 |
인스턴스 내부 클래스 | 외부 클래스 멤버 변수와 동일 | 외부 인스턴스 변수 외부 전역 변수 |
외부 클래스를 먼저 만든 후 내부 클래스 생성 |
정적 내부 클래스 | 외부 클래스 멤머 변수와 동일 | 외부 전역 변수 | 외부 클래스와 무관하게 생성 |
지역 내부 클래스 | 메서드 내부에 구현 | 외부 인스턴스 변수 외부 전역 변수 |
메서드를 호출할 때 생성 |
익명 내부 클래스 | 메서드 내부에 구현 변수에 대입하여 직접 구현 |
외부 인스턴스 변수 외부 전역 변수 |
메서드를 호출할 때 생성되거나 인터페이스 타입 변수에 대입할 때 new 예약어를 사용하여 생성 |
*람다식
자바는 객체 기반 프로그램으로 클래스를 먼저 만들고 메서드를 구현해 호출하여 사용함. 클래스가 없으면 메서드를 사용할 수 없음
그러나 함수의 구현과 호출만으로 프로그램을 만들 수 있는 방식이 있고, 이 방식을 함수형 프로그래밍이라고 함
- 람다식 : 자바에서 제공하는 함수형 프로그래밍 방식
람다식 문법
(매개변수) -> {실행문;}
*함수형 인터페이스
함수형 언어에서는 함수만 따로 호출할 수 있지만, 자바에서는 함수형 인터페이스를 만들고 람다식으로 구현할 메서드를 선언함
람다식은 이름이 없는 익명 함수로 구현하기 때문에 인터페이스에 메서드가 여러 개 있다면 어떤 메서드를 구현한 것인지 모호해지기 때문에, 오직 하나의 메서드만 선언한 인터페이스를 구현할 수 있음
*객체 지향 프로그래밍 방식과 람다식의 비교
- 람다식으로 구현하는 경우 기존의 객체 지향 프로그래밍 방식보다 코드가 간결해짐
- 람다식을 구현하여 호출하면 익명 클래스가 생성되고 익명 객체가 생성됨
- 람다식은 함수를 변수처럼 사용(함수의 구현부를 변수에 대입, 매개변수로 전달, 함수의 반환 값으로 사용)
*스트림(Stream)
- 스트림 : 자료가 모여있는 배열이나 컬렉션 또는 특정 범위 안에 있는 일련의 숫자를 처리하는 기능을 미리 구현해 놓은 클래스
배열, 컬렉션 등의 자료를 일관성 있게 처리할 수 있음
스트림을 생성하고 미리 구현되어있는 메서드를 사용
*스트림 연산
- 중간 연산
filter() : 조건을 넣고 그 조건에 맞는 참인 경우만 추출하는 경우에 사용
map() : 클래스가 가진 자료 중 이름만 출력하는 경우에 사용
- 최종 연산
forEach() : 요소를 하나씩 꺼내는 기능
count() : 배열 요소의 개수 출력
sum() : 배열 요소의 합계 출력
*스트림의 특징
1) 자료의 대상과 관계없이 동일한 연산을 수행함
2) 한 번 생성하고 사용한 스트림은 재사용할 수 없음
3) 스트림의 연산은 기존 자료를 변경하지 않음
4) 스트림의 연산은 중간 연산과 최종 연산이 있음
*reduce() 연산
내부적으로 스트림의 요소를 하나씩 소모하면서 프로그래머가 직접 지정한 기능을 수행함
reduce(초깃값, (전달되는 요소) ->요소가 수행할 기능)
'JAVA > 기초' 카테고리의 다른 글
[JAVA 기초] 15 자바 입출력 (1) (0) | 2022.08.22 |
---|---|
[JAVA 기초] 14 예외 처리 (0) | 2022.08.21 |
[JAVA 기초] 12 컬렉션 프레임워크 (2) (0) | 2022.08.19 |
[JAVA 기초] 12 컬렉션 프레임워크 (1) (0) | 2022.08.18 |
[JAVA 기초] 11 기본 클래스 (0) | 2022.08.16 |
댓글