Spring 공부를 하다가 extends와 implements의 차이를 모르고 있다는 것을 깨달았다. 그래서 알아봤다.
먼저 상속에 대해 알아본다.
자바하면 OOP
: Object-Oriented Programming 객체 지향 프로그래밍
가능한 모든 물리적, 논리적 요소를 객체로 만드는 것
객체 내부에 자료형 필드와 함수가 함께 존재하는 형태
객체지향 프로그래밍에 대해 아주 잘 정리되어 있는 🔗게시글이 있으니 참고하면 좋을 것 같다.
코끼리
, 고양이
, 토끼풀
, 해바라기
는 객체(Object)이다. 이들은 모두 공통적으로 생물
이라는 특징을 가지고 있다.
각 객체들을 분류하면
코끼리
, 고양이
는 동물
토끼풀
, 해바라기
는 식물
이다.
즉, 코끼리
, 고양이
의 상위 객체(부모)는 동물
이고,
식물
의 하위 객체(자식)는 토끼풀
, 해바라기
이다.
자식은 부모의 특징을 물려받는다. ➡️ "하위 객체는 상위 객체의 특징을 물려받는다."
이러한 계층을 표현하기 위한 방식이 바로 상속 이다.
상속은 상위 객체의 특징을 어떻게 새롭게 구현하는가, 그대로 사용하는가 에 따라서 형태가 갈린다.
extends
: 부모에서 선언, 정의를 모두 수행하며, 자식은 오버라이딩 없이 메소드, 변수를 그대로 사용할 수 있다.
➡️ 부모의 특징을 연장하여 사용
implements (interface 구현)
: 부모 객체에서는 오직 선언만, 정의는 반드시 자식이 오버라이딩하여 사용
➡️ 부모의 특징을 사용해 새로운 특징을 생성해 사용
abstract
: extends + interface
extends를 사용하지만 몇 개는 추상 메소드로 구현되어 있다.
extends가 상속의 대표적 형태이다.
오버라이딩 없이 부모에 구현되어 있는 것을 직접 사용한다.
이때, 접근 지정자에 대해 알아야 한다.
public
: 모두 접근 가능protected
: (다른 패키지에 존재할 때) 자식 클래스에서 부모 클래스를 호출할 수 있고, (동일 패키지에 존재할 때) 비상속시에도 접근 가능default
: 상속, 동일 패키지에서 접근 가능private
: 클래스 내부에서만 접근 가능
그리고 ⚠️ 주의해야 할 점은 Java는 "다중상속"을 지원하지 않는다는 것이다.
그 대신 implements
를 사용하여 여러 interface를 상속받을 수 있다.
부모는 선언만
자식은 정의를 오버라이딩하여 사용
extends는 할 수 없는 다중상속이 가능
정리하자면
- 일반 클래스와 abstract 클래스를 상속할 때는
extend
,- interface를 상속할 때는
implements