자바는 순수 추상 클래스를 더 편리하게 사용할 수 있는 인터페이스라는 기능을 제공한다.
인터페이스 특징
순수 추상 클래스의 특징과 같음
인터페이스는 상속이 아니라 구현이라고 한다.
상속 vs 구현
상속은 이름 그대로 부모의 기능을 물려 받는 것이 목적이다. 하지만 인터페이스는 모든 메서드가 추상 메서드이다. 따라서 물려받을 수 있는 기능이 없고, 오히려 인터페이스에 정의한 모든 메서드를 자식이 오버라이딩 해서 기능을 구현해야 한다. 따라서 구현한다고 표현한다.
인터페이스는 이름만 있는 설계도이고, 이 설계도가 실제 어떻게 작동하는지는 하위 클래스에서 모두 구현해야 한다. 따라서 인터페이스의 경우 상속이 아니라 해당 인터페이스를 구현한다고 표현한다.
인터페이스를 사용해야 하는 이유
모든 메서드가 추상 메서드인 경우 순수 추상 클래스를 만들어도 되고, 인터페이스를 만들어도 된다. 그런데 왜 인터페이스를 사용해야 할까?
또한 인터페이스를 보면 의도를 파악할 수 있기 때문이다.
좋은 프로그램은 제약이 있는 프로그램이다!!
객체 생성과 인터페이스
객체를 생성하면 객체의 필드 데이터와 메타데이터라는 부분이 생성된다.
메타데이터 안에는 객체가 어떤 클래스의 인스턴스인지에 대한 정보를 포함한다. 이 정보를 사용해서 인스턴스는 내가 어떤 클래스의 객체이고, 또 상위 인터페이스는 어떤 것이 있는지를 인지하는 것이다.
인터페이스 자체가 메모리 상에 실제로 인스턴스화 되는 것이 아니다. 대신, 인터페이스를 구현하는 구체 클래스의 인스턴스가 생성될 때 해당 클래스의 타입으로 메모리에 할당된다.
추상메서드를 호출하는 순간 자바는 실제 오버라이딩 된 구현 메서드를 찾아서 호출하게 된다.