본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 20.추상 클래스보다는 인터페이스를 우선하라.

by 띵커베르 2023. 2. 3.
728x90
  • 자바 8부터는 인터페이스도 디폴트 메서드를 제공할 수 있다.
  • 기존 클래스에서도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.
  • 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.
    • Singer, Songwiter 의 인터페이스가 있을시 이 두가지를 받은 SingerSongwriter 를 다중 상속 받아 새로운 인터페이스를 만들 수 있다.
  • 디폴드 메서드를 제공해 프로그래머들의 일감을 덜어줄 수 있다. 이럴경우 item19 처럼 @impleSpec 자바독 태그를 붙여 문서화를 하자.
  • 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와, 추상 클래스의 장점을 모두 취하는 방법도 있다.
    • 인퍼페이스의 강제 구현 요구와 추상 클래스의 기본 구현 제공을 동시에 제공할 수 있기 때문이다.
interface Router {
    void connect();
    void disconnect();
}

public abstract class AbstrackRouter implements Router {
    @Override
    public void connect() {
        System.out.println("connect...");
    }

    @Override
    public void disconnect() {
        System.out.println("disconnect...");
    }

    public void abstractConnect() {
        System.out.println("abstractConnect");
    }

}

class WifiRouter extends AbstrackRouter {
    @Override
    public void connect() {
        super.connect();
        System.out.println("wifi connect...");
    }
}

class EthernetRouter extends AbstrackRouter {
  // EthernetRouter 특정 구현 추가...
}

약간 이런느낌아닐까..

  • 템플릿 메서드 패턴
    • 알고리즘을 정의하는 추상 클래스와 그 알고리즘을 구체적인 구현을 제공하는 하위 ㅡㄹ래스를 통해, 코드의 재사용성을 높이는 패턴이다.
    • 아래는 짧은 코드.
abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    private void start() {
        System.out.println("Common Beginnings");
    }

    public final void play() {
        start();
        initialize();
        startPlay();
        endPlay();
    }

    public static void main(String[] args) {
        /* Common Beginnings
           Football Game Initialized! Start playing.
           Football Game Started. Enjoy the game!
           Football Game Finished!*/
        Football football = new Football();
        football.play();
    }
}

class Football extends Game {
    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }

    @Override
    void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started. Enjoy the game!");
    }
}
728x90

댓글