Enum(Enumeration)
- 열거형 상수 집합
- 클래스를 상수처럼 사용 가능
- 하나의 인스턴스만 생성 하여 사용 가능 - 싱글톤 형태
- 상속 불가능
- Enum명.상수명.ordinal() : 해당 상수의 Enum에서의 인덱스 반환
- Enum명.values() = 해당 Enum의 상수값들을 배열 형태로 반환
- Enum명.valueOf(상수명) = 지정한 상수 반환 (단, 상수명은 String 타입으로 입력해야함)
- [Enum명.상수명]으로도 지정한 상수 반환 가능
- values와 valueOf은 객체(상수)를 반환하므로 상수 안에 있는 원소를 출력하려면 해당 원소의 getter 메소드를 이용해야함
ex) Color.values.getcolorCode()
- 사용 이유 = 클래스가 불필요하게 많아짐, 클래스라면 상속의 제한이 있고 인터페이스라면 타입의 다형성이 너무 많아짐
Inner class(중첩 클래스)
- 클래스 내부에 선언한 클래스
- 다른 외부 클래스에서 사용할 일이 거의 없는 경우에 내부 클래스로 사용하여 사용
ex) B가 A의 내부 클래스인 경우 B의 객체를 생성하려면
A.B 객체명 = A.new B(); 로 입력해야함 (B 객체명 = new B();로 B 객체 생성 불가)
종류
- 로컬 클래스 = 메소드 내부에 존재하는 클래스
- 익명 클래스 = 클래스명이 없는 클래스 -> 클래스 객체
- 익명 클래스의 경우에는 {} 마지막에 ;를 붙임으로써 코드종료 위치를 정해줘야함
Lambda
- 함수형 인터페이스(FunctionalInterface)를 정의할 때 사용
- 일종의 익명 메소드
- 메소드를 보다 간단하게 표현 가능
- 화살표(->)를 이용하여 입력
- (매개변수) -> {실행문;};
- 람다식은 매개변수X, 매개변수 1개, 매개변수 2개 이상의 3가지 경우로 나눌 수 있음
ex1) li1 = () -> {
System.out.println("람다식 1");
};
ex2) ① li2 = (int i) -> {
System.out.println(i+10);
};
② li2 = i -> {
System.out.println(i+10);
}; // 자료형 생략
※ ① = ② 모두 형식만 다를뿐 같은 명령
ex3) ① li3 = (int num1, int num2) -> {
return num1 + num2;
};
② li3 = (num1, num2) -> {
return num1 + num2;
}; // 자료형 생략
③ li3 = (num1, num2) -> num1 + num2; // {return} 생략 ({} 내부에 return 구문이 1개만 존재할 경우에만 가능)
※ ① = ② = ③ 모두 형식만 다를뿐 같은 명령
- @FunctionalInterface = 람다식을 선언하기 위한 인터페이스
- 익명함수와 매개변수 만으로 구현되므로 인터페이스는 "단 하나의 메서드만"을 선언해야 함
Optional
- Null 혹은 Nullable 한 값을 저장하는 Wrapper 클래스
※ Wrapper 클래스 = 기본 자료타입(char, int, boolean 등)을 객체로 다루기 위해서 사용하는 클래스
ex) Char, Int, Boolean... (기본 자료타입의 맨 앞글자를 대문자로 바꾼 형태)
- null인 상태에서 참조하여도 NPE가 발생하지 않도록 처리
- 시간적, 공간적 비용의 증가로 인해 시스템 성능이 저하될 수가 있어 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋음
- 부작용으로 NullPointerException 대신 NoSuchElementException가 발생함
Optional 생성 메소드
- empty() = 빈 Optional 객체 생성
- of(value) : null이 아닌 value를 담은 Optional 객체 생성
- ofNullable(value / null) = null일 수도 있는 value를 담은 Optional 객체 생성
Stream
- 배열이나 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있게 해주는 반복자
- 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과 필터링 가능 및 가공된 결과 획득 가능
- Lambda를 통해 코드를 간결하게 표현 가능
- 배열과 컬렉션을 통해 함수형으로 처리 가능
- 병렬처리 가능
구조 및 사용법
1) 스트림 생성 : 스트림 인스턴스 생성
2) 중개 연산 : 필터링(filtering) 및 맵핑(mapping) 등으로 원하는 결과를 만들어가는 중간 과정
3) 최종 연산 : 최종적으로 결과를 만드는 작업
※ comparing, map, forEach를 사용할 때 클래스의 메소드를 참조하려면 .이 아닌 ::을 입력해야함
- 클래스에 대한 하나의 메소드를 참조할 때만 가능하고 getName.contains()처럼 여러개의 메소드를 참조해야하는 경우에는 :: 적용 불가능 & 입력값을 요구하는 메소드도 불가능 (filter에 적용 불가)
ex) comparing(Person.getName()) (X) -> comparing(Person::getName) (O)
'빅데이터 부트캠프 > Java' 카테고리의 다른 글
빅데이터 부트캠프 68일차 (0) | 2022.10.14 |
---|---|
빅데이터 부트캠프 67일차 (0) | 2022.10.13 |
빅데이터 부트캠프 65일차 (0) | 2022.10.11 |
빅데이터 부트캠프 64일차 (0) | 2022.10.07 |
빅데이터 부트캠프 63일차 (0) | 2022.10.06 |
댓글