데브코스 W2D3

코끼릭·2022년 3월 23일
0

TIL

목록 보기
3/36

Interface

interface를 통해 구현을 강제하여 자바의 다형성을 극대화하고 결합성을 낮춰 코드의 수정과 유지 보수성을 높일 수 있다.

추상체에 의존
= 의존성 주입
= 외부로부터 의존성 전달
= 결합성 낮추기

+ JAVA 8 Interface

상수와 추상메소드만 가능하면서 구현의 강제성이 강했지만 구현체 메소드인 default 메소드를 가질 수 있게 되면서 기존 자바에서는 인터페이스에서 한정된 기능만 오버라이딩을 하고 싶은 경우 나머지 기능을 오버라이딩한 클래스인 Adapter 클래스를 상속받아 사용해야 되는 불편한 방식이 개선되었다.(자바에서는 상속이 클래스에 한 번만 허용되서 한 개의 Adapter만 사용 가능하기 때문이다.) 또한 static 메소드가 추가된 것이 큰 특징이다.

@FunctionalInterface

추상메소드가 하나만 존재하는 인터페이스로 default나 static 메소드가 여러 개 있어도 상관없다. 람다 표현식을 사용한 간단한 오버라이딩 표기가 허용되는 인터페이스 구조이다.

  • Function 인터페이스
    1개의 파라미터를 받아서 1개의 결과를 반환하는 메소드를 가지고 있다.

    @FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }
  • Supplier 인터페이스

    1개의 결과를 반환하는 메소드를 가지고 있다.

    @FunctionalInterface
    public interface Supplier<T> {
       T get();
    }
  • Consumer 인터페이스

    1개의 파라미터를 받아서 동작을 수행하는 메소드를 가지고 있다.

    @FunctionalInterface
    public interface Consumer<T> {
    	void accept(T t);
    }
  • Predicate 인터페이스

    인자를 받고 boolean값을 반환하는 메소드를 가지고 있다.

    @FunctionalInterface
    public interface Predicate<T> {
    	boolean test(T t);
    }

익명 클래스

인터페이스는 추상체이기 때문에 추상 메소드에 대한 오버라이딩이 있어야만 인스턴스 생성이 가능하다. 익명 클래스를 통해 인스턴스 생성 과정을 한 줄의 명령어로 작성이 가능해졌다.

//추상체의 참조변수에는
//인터페이스를 오버라이딩한 
//익명 클래스의 인스턴스 주소가 저장되었다.
Interface1 tmp = new Interface1() { 
	@override
    void func() {
    	//새롭게 동작하는 명령어
    }
};

Lambda

3에서 더 나아가 익명 메소드를 사용해서 더 간결하게 인터페이스 인스턴스 생성이 가능해졌는데 앞에서 말한 @FunctionalInterface에서만 사용이 가능하다.(두 개 이상인 경우 어떤 함수를 오버라이딩한 건지 구별이 불가능하기 때문이다.)

//추상체의 참조변수에는 
//인터페이스의 추상 메소드를 출력문으로 오버라이딩한 
//익명 클래스의 인스턴스 주소가 저장
Interface1 tmp = () -> System.out.printIn(":-)");

Method Reference

4에서 더 나아가 람다 표현식에서 입력되는 매개변수값이 변경없이 바로 사용하는 경우에는 최종으로 적용되는 메소드의 레퍼런스를 지정해주기만 하는 표기 방식으로도 메소드 오버라이딩 표기가 가능하다.

//추상체의 참조변수에는 
//인터페이스의 추상 메소드가 매개변수로 들어온
//문자열의 길이를 반환하는 함수로 오버라이딩한
//익명 클래스의 인스턴스 주소가 저장
Interface1 tmp = (str) -> str.length();
Interface1 tmp = String::length;
profile
ㅇㅅㅇ

0개의 댓글