[Java] Interface, Abstract Class

Ahnick·2021년 2월 15일
0
post-thumbnail

interface? abstract class?

먼저 인터페이스추상 클래스(abstract class)의 정의부터 알아보겠습니다!

interface란

인터페이스는, 간단하게는 클래스를 구현하기 위한 뼈대 구조입니다.
자바의 상속 제약에서 벗어나 추상 메소드들을 정의해놓고 이를 구현(implements)하는
클래스들에게 해당 메소드들의 구현을 강
제할 수 있습니다.

사실 인터페이스의 정확한 정의는 내리기 참 어려운 것 같습니다. 다만
위에서 말했듯이 구현하는 클래스들의 행동을 미리 정해주며 자바에서 클래스는
다중 상속이 불가능하다는 점을 극복하고, 여러 개의 인터페이스를
'구현'할 수 있다
는 특징을 가집니다.

abstract class란

abstract class(추상 클래스)란 '미구현된 추상 메소드'를 가지고 있는
클래스
를 말하며 class 키워드 앞에 abstract를 명시한 클래스를 통칭합니다.

추상 클래스는 0개 이상의 abstract method를 보유한 클래스입니다.
일반적인 클래스는 구현되지 않은 abstract method를 보유할 수 없지만
클래스 앞에 abstract를 명시함으로써 이 클래스를 상속받는 자식 클래스가
이 미구현 메소드를 구현할 수 있도록 할 수 있습니다.

interface의 특징

먼저 인터페이스가 존재하고, 어떠한 클래스가 해당 인터페이스를 구현하고자 한다면
인터페이스에 존재하는 모든 메소드를 반드시 구현해야 합니다.

인터페이스는 생성자를 가질 수 없습니다. 하지만 인터페이스를 구현한 클래스를 통해
생성자를 가진 것처럼 인스턴스화되어 사용될 수 있습니다.

인터페이스는 인터페이스를 상속할 수 있습니다. 인터페이스를 구현할 땐 implements를
사용하지만, 이 경우는 인터페이스가 인터페이스를 상속받는것이므로 extends를 사용합니다.
그리고 인터페이스는 다중상속이 가능합니다. 그리고 이 인터페이스를 구현하면
마치 다중상속처럼 동작시킬 수 있습니다.

인터페이스의 모든 멤버변수는 public static final이어야 합니다.
하지만 이는 반드시 따라야하는 강제사항이므로 생략할 수 있습니다.

인터페이스의 모든 메소드는 public abstract이지만 이 또한 생략할 수 있습니다.
하지만 Java8이후로 static 메소드와 default 메소드를 가질 수 있도록 변경되었습니다.

abstract class의 특징

추상클래스는 일반 클래스보다 추상화 단계가 높은 클래스를 말하는 것이므로
추상 클래스는 일반 메소드, 필드, 그리고 생성자에 대한 정의가 가능합니다.

추상 클래스가 추상 메소드를 정의하면, 추상클래스를 상속받은 클래스는 반드시
추상 메소드를 Ovrride하여 구현해줘야 합니다
.

일반 클래스가 추상 클래스를 구현하는 경우에는 반드시 추상 메소드를 모두 구현해야하지만
추상 클래스가 추상 클래스를 상속받는 경우에는 반드시 구현할 필요는 없습니다.

추상 클래스는 다중 상속받을 수 없습니다.

interface vs abstract class

인터페이스와 추상 클래스는, 언뜻 보면 비슷한 것처럼 보이고 실제로 하는 동작과
존재하는 목적도 어느정도 공통점이 있습니다. 하지만 이 두 개념에는
명확한 차이가 존재하며 이를 알아보도록 하겠습니다 !

가장 큰 차이점은, 추상 클래스는 클래스이지만 인터페이스는 클래스가 아니라는 점
입니다. 인터페이스는 클래스가 아니기 때문에 클래스 상속 조건으로부터 자유로운데,
자바는 상속에서 extends 키워드를 사용하여 하나의 클래스밖에 상속받을 수 없지만
인터페이스는 implements라는 '구현'키워드를 사용하여 여러개의 인터페이스를
구현
할 수 있습니다.

interface, abstract class 왜 사용할까?

추상 클래스의 주 목적은, 상속받은 자식 클래스가 부모인 추상 클래스의 기능을
확장하는 '확장성'에 주 목적을 두고 있습니다
. 하지만 인터페이스는
구현하는 구현 클래스들의 동일한 동작은 보장하지만, 이들 구현체가 동일한 목적을
가지고 있을 필요는 없습니다
!

이런 사실을 바탕으로 인터페이스와 추상 클래스의 목적을 구분하자면

인터페이스

  • 클래스간 관련성은 없지만, 동일한 동작을 보장하고 싶을 때
    -> 높은 응집도, 낮은 결합도를 가지게 된다!!
  • 다중 상속이 필요한 경우
  • 특정한 데이터 혹은 객체의 동작을 명시하고자 하는데 목적과 구현 위치는 상관없을때

추상 클래스

  • 관련성이 존재하는 클래스 간에 동작을 공유하고 싶을 때 (확장)
  • 메소드를 사용하여, 객체의 상태 변화가 가능하게 하고 싶을 때
  • public 이외의 접근 제어자를 사용해야 하는 경우

이렇듯 추상 클래스와 인터페이스는 모두 객체지향의 다형성을 추구하는
개념이지만, 차이점이 많이 존재하는 개념입니다. 실질적으로 인터페이스와
추상 클래스를 직접 짜야하는 경우가 많을 것 같지는 않지만
객체지향 디자인 패턴에서 굉장히 중요한 개념이니 꼭 알아둬야 할 것 같습니다 ㅎㅎ

0개의 댓글