[Java] 인터페이스와 추상클래스

개발자·2022년 5월 23일
0

Java

목록 보기
7/8
post-thumbnail
post-custom-banner

인터페이스란?

인터페이스(interface)란 클래스를 작성할 때 기본이 되는 설계도로서, 개발 코드와 구현 객체 사이의 중간 매개 역할을 담당하는 일종의 추상 클래스를 의미한다. 인터페이스 사용시 일관되고 정형화된 개발을 가능하게 하며 다형성을 높여준다. 인터페이스는 동일한 목적하에 동일한 기능을 보장하게 하기 위해 사용한다. 또한, 자바의 다형성을 이용하여 개발코드 수정을 줄이고 유지보수성을 높이기위해 사용한다.

  • 멤버 변수 : 정해진 값을 참조만 가능하다. public static final 이어야 하며 생략 가능하다.
  • 추상 메소드 : 추상메소드를 오버라이팅해서 재구현해야한다. public abstract 이어야 하며 생략 가능하다.
  • 디폴트 메소드 : 인터페이스에서 기본 구현부를 제공해주지만, 맘에 안들면 오버라이딩해서 재구현할 수 있도록 한다.(Java 8에서 추가)
  • 정적 메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용(Java 8에서 추가)

추상클래스란?

추상클래스는 실체 클래스의 공통적인 부분(속성, 메서드)을 추출해 어느정도 규격을 잡아놓은 추상적인 클래스이다. 하지만 추상클래스는 아직 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다.
추상메서드를 하나라도 포함하고 있으면 추상클래스로 선언해야 한다. 추상메서드는 선언만 있고 본체는 없으며 선언부에 ‘abstract’ 라는 키워드를 붙여야한다. 또한, 추상클래스를 상속받은 실체클래스들은 반드시 추상메서드를 재정의(오버라이딩)해야 한다.
정리해보면 추상클래스는 상위클래스로서, 상속관계에서 전체적으로 필요하지만 개별적인 작성이 필요한 메서드를 추상메서드로 만들어 구현부를 하위클래스에서 작성하도록 하는 것이다.


공통점

추상 클래스와 인터페이스 둘 다 가지고 있는 추상 메서드를 구현하도록 강제한다.또 인스턴스화가 불가능하다.

차이점

클래스를 설계도에 비유한다면 추상 클래스는 미완성 설계도에 비유할 수 있다(추상메서드를 포함하기 때문). 인터페이스는 일종의 추상 클래스로, 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아 일반 메서드, 멤버 변수를 구성원으로 가질 수 없다. 추상 클래스를 미완성 설계도라 하면, 인터페이스는 구현된 것은 아무 것도 없는 밑그림만 그려진 기본 설계도라고 할 수 있다.

인터페이스는 implements라는 키워드처럼 인터페이스에 정의된 메소드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌이다(클래스간 관련 없어도 각 클래스에 맞게 기능 구현). 추상 클래스는 extends키워드를 사용해서 자신의 기능들을 하위 클래스로 확장시키는 느낌이다(부모가 자식한테 능력 물려주는 느낌).

추상 클래스는 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.(IS-A, 부모 기능을 물려받는 느낌)
인터페이스는 상속 관계를 타고 올라갔을 때 다른 조상 클래스를 상속하더라도, 같은 기능이 필요할 경우 사용한다. 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.(HAS-A, IS-ABLE-TO)

예시

  • 추상클래스는 위의 동물 상속 관계에서 하위 클래스들인 고양이강아지 등등의 cry() 메소드를 자신 특징에 맞게 확장해서 사용하는 느낌
  • JDBC는 각 DBMS 들이 자신의 기능에 맞게 인터페이스의 정의된 메소드를 구현하는 것

모든 클래스를 인터페이스만 사용해서 구현한다면, 모든 클래스에서 공통으로 필요한 기능들을 각각 오버라이딩 하게 되니 코드의 중복이 발생한다. 그렇기 때문에 공통으로 필요한 기능들을 부모 클래스에서 일반 메서드로 구현하고, 나머지 기능은 추상클래스를 상속 받아 자식 클래스에서 사용할 수 있도록 하면 인터페이스가 필요하지 않을 것 같다. 또한, 추상 클래스 안을 전부 추상 메서드로 만들어 추상 클래스가 인터페이스 역할을 하도록 하면 인터페이스가 굳이 필요하지 않을 것이다.
그렇다면 인터페이스는 왜 필요한걸까? 🤔 인터페이스는 추상 클래스와 다르게 다중 상속이 가능하기 때문이다. 다중 상속 여부에 따라 추상 클래스와 인터페이스의 사용 의도가 달라진다.


Ref.

https://limkydev.tistory.com/188
https://limkydev.tistory.com/197
https://interconnection.tistory.com/129

profile
log.info("공부 기록 블로9")
post-custom-banner

0개의 댓글