인터페이스

    [Effective Java] raw 타입은 사용하지 말자

    제네릭 클래스/인터페이스 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 제네릭 타입은 일련의 매개변수화 타입을 정의한다. => List, Map, Integer etc raw 타입 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말하며 List에서 List가 raw 타입이다. 다음과 같이 raw타입으로 변수를 선언할 수 있다. private final Collection stamps = ...; 하지만 이 코드를 사용하면 stamp대신 coin을 넣어도 아무 오류 없이 컴파일되고 실행된다. 이 에러가 발견되는 시점은 다음과 같이 이 동전을 꺼낼 때이다. Stamp stamp = (Stamp) stamps.get(0); 하지만 제네릭을 활용하면 이..

    [Effective Java] 인터페이스는 타입을 정의하는 용도로만 사용하라

    인터페이스의 역할 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 달리 말하면, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기해주는 것이다. 상수 인터페이스 상수 인터페이스는 인터페이스를 잘못 사용한 예다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당한다. 따라서 상수 인터페이스를 구현하는 것은 이 내부 구현을 클래스의 API로 노출하는 행위다. 상수를 공개할 목적이라면 다음 선택지 중 하나를 택하는 것이 좋다. 클래스나 인터페이스 자체에 추가한다. - 특정 클래스나 인터페이스에 강하게 연관된 상수인 경우 적합하다 열거 타입 인스턴스화할 수 없는 유틸리티 클래스에 담아 공개한다. pu..

    [Effective Java] 추상 클래스보다 인터페이스를 우선하라

    인터페이스의 장점 상속이 여러개 가능하기 때문에 믹스인이 가능하다. 계층구조가 불분명한 클래스들을 설계하기 유리하다. 래퍼 클래스와 함께 사용하면 인터페이스 기능을 향상 시키는 안전하고 강력한 수단이 된다. 구현이 명백한 것은 인터페이스의 디폴트 메서드를 사용해 프로그래머의 일감을 줄일 수 있다. default 메서드 인터페이스를 상속하면 인터페이스에 정의된 모든 메서드들을 구현해야 한다. 하지만 많은 외부 클래스가 이미 이 인터페이스를 사용하고 있다면 중간에 메서드를 삽입하는 것이 쉽지 않다. 이때, default 메서드를 이용할 수 있다. 구현이 명백한 것, 공통된 것은 인터페이스의 디폴트 메서드를 사용해 정의함으로써 인터페이스를 상속하여 사용할 프로그래머의 일감을 줄일 수 있다. 추상 클래스 자바8..