추상화, 인터페이스, 추상클래스. 추상클래스는 익숙하지 않고, 추상화의 개념은 희미하다. 객체지향/자바 개발을 한다면 중요한 개념이고, 아마도 지금껏 개발했던 코드들을 좀 더 유연하고 효율적으로 리팩토링 할 수 있겠다는 아쉬움도 든다.
Interface & Abstract Class
- 추상화 : 여러 객체에 공통적으로 사용되거나 공통적으로 갖고 있어야 하는 메서드를 추출하는 것.
따라서 인터페이스나 추상 클래스는 하위 클래스에서 공통적으로 사용할 요소들을 정의하고 있다.
정의는 하고 있으나 구현체는 없으니 인스턴스를 생성할 수 없다.
결국 자식클래스가 구현해야 할 것이 무엇인지 정의하게 된다.
Interface vs Abstract Class
추상화 방법을 두가지로 제공하는 이유가 뭘까.
자바에서는 클래스의 다중 상속을 지원하지 않는다. 한 클래스는 하나의 클래스만 상속받아 확장할 수 있다. 여러 클래스를 상속 받는 경우 같은 메소드 정의가 존재하면 충돌이 발생할 수 있다.
추상화 계층에서 공통 요소 구성이 달라질 수 있다. 이때 인터페이스로 추출해서 공통요소를 추출할 수 있다.
인터페이스 다중 상속 시 같은 메소드가 존재한다면?
인터페이스는 구현체를 제공하지 않고 메소드 정의만 갖고 있다. 실제 실행시에는 인터페이스의 구현체가 갖고 있는 메소드가 실행된다.
- JDK8에서부터 인터페이스에 default method 구현이 가능하지만, 아직은 인터페이스는 구현이 없다고 가정하는 것이 개념 정리에 좋을 것 같다.
추상클래스는 자식 클래스들의 공통점을 추출한 것이다보니, 멤버 변수와 메서드 구현이 가능하다. 추가적으로 각 자식클래스에서 구현되어야 할 추상 메서드를 포함한다.
인터페이스는 모든 구현체 클래스가 반드시 가져야 할 메서드를 정의한다. 따라서 각 구현체가 같은 인터페이스로 동작한다는 것을 보장하는 것이 목적이 된다.