Backend/자바

[Java] 제네릭,enum, java8

지수쓰 2021. 8. 22. 21:22
반응형

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;

참고 링크


함수형 프로그래밍

참고 링크

jogeum - 자바로 함수형 인터페이스 사용하기

tistory [박스여우 - BoxFox] - https://boxfoxs.tistory.com/430