[Java] Interface, abstract, extends, implements 정리
Java Inheritance(상속)
늘 헷갈려서 이참에 다시 한번 정리를 해보려고 한다. 자주 보아도 까먹는 이유는 생각해보니 주구장창 설명만 길게 나열을 하니 비슷한 개념이니 헷갈리는 것이지 않나 생각한다.
결국엔 4가지 다 Object-Oriented Programming, OOP 관점에서 꼭 필요한 구조체(?)이니 자바 개발을 하는 사람이라면 잘 알아두어야 한다. 특히나 나도 잘 알아야 한다..
이 글의 핵심인 그림은 바로 아래의 그림이다.
아마 나도 그렇지만 다들 헷갈리는 이유는 extends가 클래스와 interface에 둘 다 쓸 수 있는데, implements라는 것도 등장해서 혼란이 생기는 것이 아닐까 생각한다.
1. Interface : "제목만 정의하는 객체"
자바에서 Interface는 객체 사용 방법을 정의하는 역할을 한다. 비교적 최근에 많이 대두되는 것이 자바 8부터 람다식이 도입이 되었는데 람다식 방식은 인터페이스의 구현을 하는 방식이기 때문이다.
아래 그림에서 보면 알겠지만, 인터페이스는 자바 코드에서 호출된 요청을 특정 객체로 다시 전달을 하는 관문 역할을 한다고 볼 수 있는데 이렇게 되면 개발자는 내부 구조는 할 필요가 없고 인터페이스의 메서드만 알아도 빠르게 구조 파악을 할 수 있다는 장점이 생긴다.
그리고 인터페이스는 클래스처럼 파일명으로 생성이 되고 아래와 같은 구조로 이뤄진다.
2. extends : "부모 객체를 그대로 가지고 온 다음 추가적인 내용을 자식 객체에 작성(선택)"
사실 상속의 대표는 "extends"이다. 부모 객체를 그대로 가지고와서 그대로 사용해도 되며 추가적으로 구현해서 사용해도 되고 오버라이드(재정의)해서 사용하여도 된다.
3. implements : "인터페이스를 상속 후 재정의(다중 상속 가능)"
자바에서는 다중 상속이 안되는데("extends Class, Class"가 안된다는 말), implements로 "extends Class implements Class, Class ..."와 같은 형태로 다중 상속을 할 수 있다. 하지만 implements는 상속을 받으면 재정의를 해야한다.
4. abstract (Class) : "Interface와 동일하지만, 일부! 구현은 해드림"
추상 클래스는 사전적 의미로 풀어본다면 추출인데 다시 말하면 실제로 존재하는 것에서 공통된 특징을 추출하여 정의한 것을 추상 클래스라고 할 수 있는데, 그럼 인터페이스랑 무슨 차이가 있지? 라는 의문이 든다.
일단 abstract Class와 Interface의 공통점은 상속을 위한 클래스이기 때문에 인스턴스를 생성할 수가 없으며, 가장 중요한 차이점은 정의된 메서드들이 "일부 구현이 되어 있느냐?" 차이이다. 설계자가 인터페이스로만 클래스를 구조를 짠다면 개발자들은 모~든 것을 재정의해서 써야한다. 그래서 아주 밀접하게 공통적으로 사용할 것은 abstract Class에서 일부 비즈니스 로직까지 구현을 하는 것이다. 단, abstract Class는 단일 상속만 가능하며 다중 상속은 implements로 Interface를 상속하면 다중 상속이 가능하다.
참고 :
- https://wooono.tistory.com/261
- https://zbomoon.tistory.com/13
- https://metapx.org/extends-vs-implements-java/
- https://devlog-wjdrbs96.tistory.com/370