본문 바로가기
빅데이터 부트캠프/Java

빅데이터 부트캠프 66일차

by Mecodata 2022. 10. 12.

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)

댓글