추상(abstract) 문법과 자바의 인터페이스(interface) 문법
어떤 클래스를 직접사용하지 않을 경우 추상클래스로 만든다. 이는 여러 클래스를 같은 타입으로 묶기 위함이다.
또는 sub class 에서 공통요소가 있을 경우 즉 객체를 일관성 있게 사용하는 경우에 generalization 을 통해 super class를 만들 때 사용한다.
추상 클래스에 추상 메서드가 존재한다면 이 추상 클래스를 상속받는 경우에 서브클래스에서 무조건 정의해야한다.(서브 클래스에서 구현을 강제하는 효과가 있다.) 정의하지 않으면 이 클래스는 concrete class가 될 수 없다. 그리고 일반 클래스는 추상메서드를 가지지 못한다. 그러나 추상 클래스는 일반 메서드를 가질 수 있는데 이 메서드는 추상클래스를 상속받은 클래스를 통해 호출할 수 있다.
추상클래스의 경우 new 명령어로 생성이 객체 생성이 불가능하다.
인터페이스(interface)
유사한 일을 하는 객체에 대해서 사용법을 통일하고 객체의 사용규칙을 정의하는 문법이다.
인터페이스의 modifier는 기본이 public, abstract이다.
또한 인터페이스 필드는 예를 들어 (public static final) int a = 10; 이렇게 사용할 수 있는데 앞의 modifier는 생략이 가능하다.
인터페이스는 defalut method, private method와 static method 가질 수 있는데
defalut method의 사용과 등장을 보자면 인터페이스는 하위 클래스에게 구현을 강요하는데 인터페이스에 새롭게 추가해버리면 하위 클래스에서 오류가 뜰 수 있다. 그래서 하위 클래스에게 영향을 주지않는 default method 문법이 인터페이스에 존재한다. 즉 기존에 존재하는 구현체들에게 영향을 끼치지 않으면서 새 규칙을 추가할 때 사용할 수 있다.
그러나 이와 같은 경우 인터페이스 문법의 존재의의 벗어나게 된다. 인터페이스의 기본 용도는 서브클래스에게 구현을 강제하는 것인데 이렇게 사용하게 되면 메서드 구현을 강제하지 못한다. 즉 인터페이스 문법의 활용에 어긋나는 것이다.
인터페이스 내부에서만 사용하려고 메서드는 만드는 경우 private 메서드를 구현 할 수 있다. static메서드를 또한 가질 수 있다. 그러나 위와 같은 메서드들의 사용은 인터페이스 문법에 어긋나는 사용법이다!! defalut method 만 가끔 사용하도록 하자
보통은 구현체 이름의 접미사로 Impl를 붙이는데 이는 인터페이스를 구현했다는 뜻이다.
자바의 경우 인터페이스가 아닌 클래스를 상속받을 때 다중상속을 허용하지 않는데 이는 super class 에서 구현된 메서드이기 때문이다. 그러나 인터페이스의 경우 다중상속을 허용하는데 왜냐하면 인터페이스에서는 메서드를 구현하지 않았기 때문이다. 그러나 각각의 인터페이스에서 mathod signature의 리턴타입이 다르거나 default로 메서드가 구현되어있다면 error가 뜬다.
인터페이스와 추상클래스의 collaboration
인터페이스를 상속받아 직접 구현할 경우 인터페이스에 존재하는 모든 메서드를 다 구현해야한다. 그러나 추상클래스의 도움을 받는다면 추상클래스에서 구현하고 남아있는 추상 메서드들만 구현하면 된다. 이렇게 한다면 프로그래밍이 편하고, 각각의 서브 클래스에 맞추면 되기 때문이다.