[Java] 제네릭,enum, java8
TCP SCHOOL 글을 참고하였다.
Enum 클래스
열거체(enumeration type)
- 실제 값 뿐 아니라 타입 체크
- 열거체의 상숫값이 재정의되더라도 다시 컴파일할 필요가 없다.
enum Rainbow {
RED(1, "hello"), ORANGE(2,""), YELLOW(3,"");
private final int value;
private final String message;
Rainbow(int value, String message ) {
this.value = value;
this.message = message;
}
public int getValue(){
return value;
}
}
열거체에 필드를 추가할 수 있고, 추가할 때는 생성자가 필요하다 (private)
제네릭 (Generic)
제네릭이란 데이터타입을 일반화한다는 것을 의미한다.
Object는 원하는 타입으로 다시 변환해야하지만, 제네릭은 컴파일 시 타입이 정해지므로 타입 검사나 변환 같은 작업을 생략할 수 있다.
제네릭 메소드
메소드 선언부에 타입 변수를 사용한 메소드를 의미한다.
타입 변수의 선언은 메소드 선언부에서 반환 타입 바로 앞에 위치한다.
public static<T> void sort(..){..}
람다 표현식 (lambda expression)
메소드를 하나의 식으로 표현한 것
자바에서 클래스의 선언과 동시에 객체를 생성하는, 그러므로 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스 라고 한다.
따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
함수형 인터페이스 (functional interface)
람다 표현식을 사용할 때 람다 표현식을 저장하기 위한 참조변수의 타입을 결정해야한다.
<참조변수 타입> <참조변수 이름> = 람다표현식
람다 표현식을 하나의 변수에 대입할 때 사용하는 참조변수의 타입을 함수형 인터페이스 라고 부른다.
함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야한다. 또한 @FunctionalInteface
를 사용하여 함수형 인터페이스임을 명시할 수 있다. 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류를 발생시킨다.
@Test
void calcTest(){
Calc minNum = (x,y) -> x<y? x: y;
System.out.println(minNum.min(3,6));
}
이렇게 람다 표현식을 만들었을 때 Calc
가 함수형 인터페이스가 된다.
이를 만들어 보면
@FunctionalInterface
public interface Calc {
public int min(int x, int y);
}
min
함수 하나만 가지는 함수형 인터페이스이다.
자바는 java.util.function 패키지를 통하여 여러 상황에서 사용할 수 있는 다양한 함수형 인터페이스를 미리 정의하여 제공했다.
- Consumer :
accept
- parameter (O)
- return (X)
- Supplier :
get
- parameter (X)
- return (O)
- Function :
apply
- parameter -> return
- Predicate :
test
- parameter - > return boolean
메소드 참조 (method reference)
람다 표현식이 단 하나의 메소드만을 호출하는 경우 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해준다.
메소드 참조를 사용하면 불필요한 매개변수를 제거하고 ::
기호를 사용하여 표현할 수 있다.
클래스이름::메소드이름
참조변수이름::메소드이름
// 예
Function<String, Boolean> func = (a) -> obj.equals(a); // 람다 표현식
Function<String, Boolean> func = obj::equals(a); // 메소드 참조
생성자 참조
생성자를 호출하는 람다 표현식도 앞서 살펴본 메소드 참조를 이용할 수 있다.
단순히 객체를 생성하고 반환하는 람다 표현식은 참조로 변환할 수 있다.
// ex1
(a) -> { return new Object(a);}
Object::new;
// ex2
a-> new double[a];
double[]::new;
참고 링크
- TCPSCHOOL 제네릭,Enum,람다,메소드참조,스트림
함수형 프로그래밍
참고 링크
jogeum - 자바로 함수형 인터페이스 사용하기
tistory [박스여우 - BoxFox] - https://boxfoxs.tistory.com/430