ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 제네릭,enum, java8
    Backend/자바 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

    'Backend > 자바' 카테고리의 다른 글

    [Java] 자바 기본 개념  (0) 2020.11.27

    댓글

Designed by Tistory.