programming language/Java

interface vs abtract class

공대키메라 2022. 2. 6. 00:18

공부를 하는 와중에 추상클래스를 사용할 일이 있었는데 

 

인터페이스와 추상클래스의 차이점을 이야기하라고 하면 이야기를 못하겠었다. 

 

그래서 이번 기회에 두개의 차이점에 대해 다시 알아보고자 한다. 


1. 인터페이스(Interface)란?

interface 는 한 클래스를 구현하기 위해 사용되는 청사진입니다.

인터페이스는 구체적인 메소드를 포함하지 않습니다.

인터페이스는 초기화 될 수없지만 인터페이스를 상속하는 클래스들은 초기화 할 수 있다. 

인터페이스는 인스턴수 변수를 절대 포함하지 않지만, public static final 변수를 포함할 수 있다.

인터페이스의 모든 메소드는 추상 메소드다.

*추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미합니다.자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.

출처 : http://www.tcpschool.com/java/java_polymorphism_abstract

2. 추상 클래스(Abstract Class)란?

선언에서 추상 키워들르 가진 클래스를 추상 클래스라고 한다. 추상 클래스들은 적어도 하나의 추상 메소드를 가져아 한다. 즉, 바디 없는 메소드들 말이다. 

추상 클래스는 구체 클래스를 위한 설계도를 만들도록 도와준다. 하지만, 상속한 클래스는 추상 메소드를 구현해야 한다. 

3. 각자의 중요 이유

인터페이스를 사용하는 중요한 이유!

  • 추상화하려고 사용한다. 
  • run time에서 동적인 메소드 resolution을 지원하기 위해 디자인 됨
  • 느슨한 연결을 도와준다. 
  • 메소드의 정의를 상속 계층과 분리시키도록 해줌. 

추상클래스를 사용하는 중요한 이유!

  • 추상클래스는 하위 클래스에 기본 기능을 제공한다. 
  • 미래의 특정 클래스들에게 템플릿을 제공한다. 
  • 하위 클래스에서 기본 인터페이스를 정의하도록 돕는다.
  • 추상클래스는 코드를 재사용할 수 있다. 

 

둘을 비교한 차이점은 다음과 같다. 

 

추상클래스는 하위 클래스들이 구현하고나 오버라이드 할 수 있도록 기능을 만드는걸 허락합니다. 반면에 인터페이스는 오직 구현하지 않고 기능을 명시하도록 허락합니다. 클래스는 오직 하나의 추상 클래스만 연장할 수 있지만 여러개의 인터페이스들을 구현할 수 있습니다. 

 

인터페이스는 다중 상속이 가능하다! 매우 중요한 특징인 것 같다. 

 

차이점 더보기 클릭!

더보기

parameters

interface

 abstract class

Speed Slow Fast
Multiple Inheritances Implement several Interfaces Only one abstract class
Structure Abstract methods Abstract & concrete methods
When to use Future enhancement To avoid independence
Inheritance/ Implementation A Class can implement multiple interfaces The class can inherit only one Abstract Class
Default Implementation While adding new stuff to the interface, it is a nightmare to find all the implementors and implement newly defined stuff. In case of Abstract Class, you can take advantage of the default implementation.
Access Modifiers The interface does not have access modifiers. Everything defined inside the interface is assumed public modifier. Abstract Class can have an access modifier.
When to use It is better to use interface when various implementations share only method signature. Polymorphic hierarchy of value types. It should be used when various implementations of the same kind share a common behavior.
Data fields the interface cannot contain data fields. the class can have data fields.
Multiple Inheritance Default A class may implement numerous interfaces. A class inherits only one abstract class.
Implementation An interface is abstract so that it can’t provide any code. An abstract class can give complete, default code which should be overridden.
Use of Access modifiers You cannot use access modifiers for the method, properties, etc. You can use an abstract class which contains access modifiers.
Usage Interfaces help to define the peripheral abilities of a class. An abstract class defines the identity of a class.
Defined fields No fields can be defined An abstract class allows you to define both fields and constants
Inheritance An interface can inherit multiple interfaces but cannot inherit a class. An abstract class can inherit a class and multiple interfaces.
Constructor or destructors An interface cannot declare constructors or destructors. An abstract class can declare constructors and destructors.
Limit of Extensions It can extend any number of interfaces. It can extend only one class or one abstract class at a time.
Abstract keyword In an abstract interface keyword, is optional for declaring a method as an abstract. In an abstract class, the abstract keyword is compulsory for declaring a method as an abstract.
Class type An interface can have only public abstract methods. An abstract class has protected and public abstract methods.

4. 코드로 확인

간단하게 interface 로 한 번 선언을 해봤다. 

interface 안에 method의 body를 선언하려면 오류가 난다. 

Interface abstract methods cannot have body

-------- 2022.02.06 수정 --------

 

body를 작성하기 위해서는 default 혹은 static으로 구성하면 body를 작성 할 수 있단다.

 

변수도 한번 선언해보고... 해보니 변수 선언시에는 무조건 public 으로만 해야한다. 

 

 

 

body는 역시 default 혹은 static이 없이는 안된다.

코드 어시스트를 받아보면 어떻게 될까?

 

default 접근제어자가 자동으로 붙게 된다. 

 

 

그러면 abstract class는 어떨까?

 

 

abstract class안에는 메소드를 직접 선언할 수 도 있는데, interface 에서 처럼 body가 없는 메소드도 생성이 가능하다.

 

출처

https://velog.io/@new_wisdom/Java-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://www.guru99.com/interface-vs-abstract-class-java.html