Today I Learned-20
자바프로그래밍 - 7
- 내부 클래스
- 람다식
- 스트림
내부 클래스 - 1. 정의와 유형
- 정의
- 말그대로 ‘클래스 내부에 선언한 클래스’
- 필요한 멤버변수/메서드 등 담긴다.
- 외부 클래스와 밀접한 관련
- 유형
- 인스턴스 내부 클래스
- 정적(static) 내부 클래스
- 지역(local) 내부 클래스
- 익명(anonymous) 내부 클래스 - 중요!!
안드로이드 위젯의 이벤트 핸들러 는 대부분 익명 내부 클래스
내부 클래스 - 2. 인스턴스 내부 클래스
- 외부 클래스 생성 후에야 사용 가능!!
- 정적(static) 변수/메서드 선언 불가능
- 내부 클래스의 private 선언
- 특정 클래스의 내부에서만 사용할 목적일 때
내부 클래스 - 3. 정적(static) 내부 클래스
-
외부 클래스 생성과 무관하게 사용 가능!
- 정적 내부 클래스의 ‘일반 메서드’
- 외부 클래스의 ‘인스턴스 변수’ 사용 불가!
- 정적 내부 클래스의 ‘정적 메서드’
- 외부/내부 클래스의 ‘인스턴스 변수’ 사용 불가!
정적 내부 클래스 메서드 | 변수 유형 | 사용 가능 여부 |
---|---|---|
일반 메서드 | 외부 클래스 - 인스턴스 변수 | X |
” | 외부 클래스 - 정적 변수 | O |
” | 정적 내부 클래스 - 인스턴스 변수 | O |
” | 정적 내부 클래스 - 정적 변수 | O |
정적 메서드 | 외부 클래스 - 인스턴스 변수 | X |
” | 외부 클래스 - 정적 변수 | O |
” | 정적 내부 클래스 - 인스턴스 변수 | X |
” | 정적 내부 클래스 - 정적 변수 | O |
내부 클래스 - 4. 지역 내부 클래스
- 메서드 내부에 정의
- 메서드 안에서만 사용
- 참고!
- ‘지역 내부 클래스’ 안에 있는 ‘지역변수’들은 모두 상수로 됨!!
내부 클래스 - 5. 익명 내부 클래스
- 생성
- 메서드를 호출할 때 생성 (1번)
- 인터페이스 타입 변수에 대입할 때 new 예약어 사용하여 생성 (2번)
- 사용한 지역변수는 상수화
-
생성 예
- 접근
람다식 - 1. 함수형 프로그래밍
- 람다식이란,
- 자바에서 제공하는 함수형 프로그래밍 방식
- ‘함수이름’ 없음! ‘반환형’ 없음!
- 함수형 프로그래밍
- 클래스 없이 함수 구현과 호출만으로 프로그램을 만드는 방식
람다식 - 2. 문법
- 기본 형식 (반환형, 함수명 생략 = a.k.a ‘익명 함수’)
- 기존:
int add(int x, int y) {return x + y};
- 람다식:
(int x, int y) -> {return x + y;}
- 기존:
- 중괄호 생략, return 생략
- 중괄호 안, 구현부분이 한 문장인 경우
- ex.
str -> System.out.println(str);
- ex.
- 중괄호 안, 구현부분이 return문 하나일 경우
- ex.
(x, y) -> x + y
- ex.
(x, y) -> x >= y ? x : y
- ex.
- 중괄호 안, 구현부분이 한 문장인 경우
- 람다식 구현
- 먼저 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메서드 선언!
이를 ‘함수형 인터페이스’ 라고
- 먼저 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메서드 선언!
람다식 - 3. 함수형 인터페이스 (중요!)
- 자바에서의 람다식 구현
- 함수형 인터페이스 생성
- 인터페이스에 람다식으로 구현할 추상 메서드 선언
- 메서드는 반드시 하나만!
람다식은 익명 함수로 구현하기 때문에, 인터페이스에 메서드가 여러개라면 어떤 메서드를 구현한 것인지 모호함
람다식 - 4. 익명 객체를 생성하는 람다식 (중요!)
- 과정
- 람다식으로 추상 메서드 구현 후 호출하면 익명 클래스 생성
a.k.a ‘일회용 클래스’
- 이를 통해 익명 객체 생성
- 람다식으로 추상 메서드 구현 후 호출하면 익명 클래스 생성
- 정리
- 클래스 이름 없이, 인터페이스 자료형 변수에 바로 메서드 구현부를 생성하여 대입 가능!
- 클래스 이름 없이, 인터페이스 자료형 변수에 바로 메서드 구현부를 생성하여 대입 가능!
- 람다식에서 사용하는 지역 변수 = 상수!
람다식 - 5. 함수를 변수처럼 사용하는 람다식 (중요!)
- 인터페이스형 변수에 람다식 대입
- 매개변수로 전달하는 람다식
- 반환 값으로 쓰이는 람다식
스트림 - 1. 스트림(stream)이란?
- 여러 자료가 모인 배열/컬렉션 등의 처리 기능을 구현해 놓은 클래스!
- ex. 정렬(sorting), 특정 값만 출력(filter) 등
- 참고
- 이후 학습할 I/O 스트림(입출력 목적)과는 아예 다름!
스트림 - 2. 스트림 연산(기본 제공)
- 중간 연산 - filter(), map()
- 함수를 수행하며, 해당 조건/함수에 맞는 결과를 추출
- ‘최종 연산’으로 중간 연산 결과 출력
- 최종 연산 - forEach(), count(), sum(), reduce()
- 스트림의 자료를 소모하면서 연산 수행
- 최종 연산 수행 후, 해당 스트림은 더 이상 사용 불가!!
- ex.
스트림생성.중간연산.최종연산
스트림 - 3. 스트림 특징
- 자료의 대상과 관계없이 동일한 연산을 수행
- 한 번 생성하고 사용한 스트림은 재사용 불가
- 스트림 연산은 기존 자료를 변경하지 않음
- 스트림 연산은 ‘중간 연산’과 ‘최종 연산’이 있음
공지
- 자바프로그래밍 수업 곧 종료
- 이후 JSP, Spring 학습 진행
과제, ~5/27(금)까지 제출 (가능한 5/16(월)까지는 마무리하도록)
범위: 책 -> p.448~485(13단원) 까지
- 복습/연습문제
- ‘1분 복습’, ‘연습 문제’의 문제&답, ‘타이핑’
- ‘나혼자 코딩’, ‘타이핑, 디버그’
제출파일: 이형록_220506_과제제출.txt
- 실습코드
- 이클립스에 타이핑 (패키지, 클래스 동일하게)
제출파일: 이형록_220506_실습코드.txt (이클립스에서 작성한 내용을 복사)
- 보충자료 확인
다음 강의 준비
- 주말 간, 과제 및 스터디 수행
nice~~~