인터페이스

    메서드 시그니처를 신중히 설계하라 - [8장. 메서드(아이템51)]

    이번 글을 통해 API 설계 요령들을 살펴보자. 이를 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있을 것이다. 📙 1. 메서드 이름을 신중히 짓자. 메서드 이름을 신중히 짓는 것에 대해서는 너무나 많이 들어봤을 것이다. 알고 있는 것을 한번 더 상기시킨다는 생각으로 보고 넘어가자. 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓자. 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 긴 이름을 피하자. 애매하면 자바 라이브러리의 API 가이드를 참조하자. 📙 2. 편의 메서드를 너무 많이 만들지 말자. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지..

    정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 - [6장. 열거 타입과 애너테이션(아이템41)]

    // 마커 인터페이스 public interface MarkerInterfaceEx { } 마커 인터페이스(Marker Interface)란 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해 주는 인터페이스를 말한다. 예시로 Serializable 인터페이스가 있다. Serializable을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸(write) 수 있다고, 즉 직렬화(Serialization)할 수 있다고 알려준다. // 마커 애너테이션 public @interface MarkerAnnotationEx { } 마커 애너테이션이 등장하면서 마커 인터페이스를 사용할 필요가 없다고 생각할 수 있다. 하지만 사실이 아니다. 이번 글을 통해 마..

    확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 - [6장. 열거 타입과 애너테이션(아이템38)]

    📙 1. 열거 타입의 확장 타입 안전 열거 패턴과 달리 열거 타입은 확장할 수 없다. (이 점을 제외하고는 거의 모든 상황에서 열거 타입이 타입 안전 열거 패턴(typesafe enum pattern) 보다 우수하다.) 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있는 반면, 열거 타입은 그렇게 할 수 없다. 설계가 잘 못 된 것은 아니다. 하지만 다음과 같은 이유로 대부분 상황에서 열거 타입을 확장하는 건 좋지 않은 생각이기 때문이다 열거 타입을 확장할 수 없도록 설계한 것이다. 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 기반 타입의 원소를 확장한 타입의 원소로 취급할 수 없는 건 이상하기 때문이다. 기반 타입과 확장된 타입들의 원소 모두를..

    추상클래스(Abstract Class) VS 인터페이스(Interface)

    지금까지 추상클래스와 인터페이스를 살펴보았다. 추상클래스와 인터페이스는 각각 고유한 몇몇 특징을 가지고 있지만, "추상 메서드를 통해 상속/구현을 통한 메서드 강제 구현 규칙을 가지는 추상화 클래스"라는 점에서 매우 비슷하다는 느낌을 받을 것이다. 또한, '그렇다면 모든 메서드를 추상 메서드로 만들어서 사용하면 추상 클래스가 인터페이스 역할 할 수 있는데 왜 굳이 인터페이스가 존재하는 걸까? '라는 의문도 생길 수 있다. 기능적인 측면을 다 제외하고, 두 개를 나누어서 사용하는 가장 큰 이유는 사용 목적과 사용 시기가 다르다는 것이다. 그러므로 '추상 클래스와 인터페이스의 사용 목적과 사용 시기의 차이'를 알아보고, '기능적인 차이점'에 대해서도 추가적으로 정리해 보도록 하자. 📙 1. 사용 목적과 사용..

    인터페이스는 타입을 정의하는 용도로만 사용하라 - [4장. 클래스와 인터페이스(아이템22)]

    1. 인터페이스의 역할 🐣 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해 주는 것이다. 인터페이스는 오직 이 용도로만 사용해야 한다. (밑에서 살펴볼 것이지만 상수 공개용 수단으로 사용하지 말아야 한다.) 2. 상수 인터페이스 안티패턴 🐥 위에서 말한 인터페이스의 역할에 맞지 않는 예로 상수 인터페이스라는 것이 있다. 상수 인터페이스란 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGAD..

    인터페이스는 구현하는 쪽을 생각해 설계하라 - [4장. 클래스와 인터페이스(아이템21)]

    1. 개념 👻 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 기존 인터페이스에 메서드를 추가하는 길이 열렸지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다. 자바 7까지의 세상에서는 모든 클래스가 "현재의 인터페이스에 새로운 메서드가 추가될 일은 영원히 없다"라고 가정하고 장성됐으니 말이다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작성 '삽입'될 뿐이다. 이번 글에서는 이런 경우 발생할 수 있는 문제 상황들을 살펴보고 그에 대한 해결책을 알아보자. 2. [문제 상황 1] 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. 🤖 자바 8의 Collcti..

    추상 클래스보다는 인터페이스를 우선하라(추상 골격 구현(Skeletal Implementation) 클래스)(2) - [4장. 클래스와 인터페이스(아이템20)]

    이전 글을 통해 인터페이스의 장점들을 알아보았다. 이번 글에서는 인터페이스와 골격 구현(skeletal implementation) 클래스를 함께 제공하여 인터페이스와 추상 클래스의 장점을 모두 취하는 방법을 알아보자. 인터페이스와 추상 클래스를 같이 사용했을 때의 장점은 '인터페이스에서 구현해 줄 수 있는 것들은 디폴트 메서드로 구현하고, 구현해 줄 수 없는 것들은 추상 골격 클래스에서 나머지 메서드를 구현한다.'는 것이다. 추상 골격 구현 클래스를 활용하였을 때 얻을 수 있는 2가지의 장점에 대해서 자세히 알아보자. (명칭과 관련하여, 추상 골격 클래스라고 부르는 이유는 일부만 구현하고 일부는 구현하지 않아도 되기 때문이다. 인터페이스가 뼈대 역할을 한다고 생각하면 쉬울 거 같다.) 장점 1. 단순히..

    마커 인터페이스 (Marker Interface)

    1. 정의 🏒 interface XXX { } 마커 인터페이스(Marker Interface)란 아무 메서드도 선언하지 않은 인터페이스다. 해당 인터페이스는 객체의 타입과 관련된 정보만을 제공해 주는 역할을 한다. 그래서 컴파일러와 JVM은 마커 인터페이스를 통해 객체에 대한 추가적인 정보를 얻을 수 있다. 조금 더 간단하게 말하자면, 마커 인터페이스는 자신을 구현하는 클래스가 특정 속성을 가진다는 것을 표현해 주는 것이다. 2. 예시를 통한 이해 🥍 마커 인터페이스를 구현하는 클래스가 특정 속성을 가진다는 것을 표시해 주는 이유는 무엇일까? 아래의 동물 예시를 통해 알아보자. 기본 설정은 아래와 같다. 상위클래스인 Animal이라는 클래스가 있다. Dog, Lion, Snake, Fish... 등 여러..