[java] abstract class VS interface

happiyoung_·2024년 8월 14일

java

목록 보기
6/9

객체 지향 언어에서 클래스는 아주 중요한 개념이다.

현재 하고 있는 게시판 프로젝트의 경우에 repository 는 인터페이스로 다른 기능은 클래스로 만드는 것으로 되어있다.

(참고) 레파지토리 코드

package com.example.firstproject.repository;

import com.example.firstproject.entity.Article;
import org.springframework.data.repository.CrudRepository;

import java.util.ArrayList;

public interface ArticleRepository extends CrudRepository<Article, Long> {
    @Override
    ArrayList<Article> findAll();
}

이렇게 인터페이스 코드를 작성하게 되는데 코드를 보다보니 abstract class 와 유사한데 싶어 그 차이점에 대해 공부해보고자 한다.

abstract?

자바에서 추상화는 무엇일까?

추상화, abstraction : 세부적인 구현은 숨기고 오직 사용자에게 기능적인 부분만 보여주는 절차

추상화를 하면서 얻을 수 있는건 객체의 how 가 아니라 what 에만 초점을 둔다는 것이다.
다시말해, 어떻게 객체가 작동하는지는 관심없고, 이 객체가 무엇인지에만 관심을 둔다는 것이다.

이러한 추상화에는 두가지 유형이 있다.
1. 추상클래스 - 추상화 정도 0~100%
2. 인터페이스 - 추상화 정도 100%

abstract class, 추상클래스

abstract 키워드로 선언된 클래스

특징

  • 추상메서드와 추상메서드가 아닌 메서드 둘다 가능
  • 인스턴스화가 될 수 없다.
  • 생성자와 static 메서드를 가질 수 있다.
  • final 메서드 (서브클래스가 함수의 바디부분을 변경할 수 없는)를 가질 수 있다.

예제

abstract class Bike{  
  abstract void run();  
}  
class Honda4 extends Bike{  
void run(){System.out.println("running safely");}  
public static void main(String args[]){  
 Bike obj = new Honda4();  
 obj.run();  
}  
} 

Bike라는 추상 클래스가 있고 안에 구현부가 없는 추상 메서드가 있다. 그리고 추상메서드의 구현은 Honda4 클래스에서 해준다.

Bike obj = new Honda4(); 부분을 주목하자. Bike로 선언된 객체변수에 Honda4 객체를 생성하고 있다.
추상클래스는 인스턴스화가 불가능하다. 이는 Bike obj = new Bike(); 가 불가능함을 의미한다.

Interface, 인터페이스

클래스의 설계도 같은 존재

특징

  • static 상수와 추상메서드를 가진다.
  • 추상 메서드만 내부에 존재한다.
  • 추상화와 다중상속을 위해 존재한다.
  • 대표적인 IS-A 관계
  • 인스턴스화 불가능
  • 클래스 의존성을 줄이는 loose coupling 가능

인터페이스 선언시에 컴파일러는 메서드 앞뒤로 public, static, abstract 키워드를 더하고, 데이타 멤버 앞뒤로 static, final 키워드를 더한다.

클래스와 인터페이스의 관계

  • class & class : extends
  • class & interface : implements
  • interface & interface : extends

다중 상속

인터페이스는 한 클래스가 여러가의 인터페이스를 상속받는 다중상속을 가능하게 해준다.

클래스에서는 불가능한 다중상속이 인터페이스에서 가능한 이유는 뭘까?

클래스에서 다중상속이 불가능했던 이유는 모호함때문이었지만, 인터페이스에서는 모호함이 없다.

예시를 보면 쉽게 이해할 수 있다.

interface Printable{  
void print();  
}  
interface Showable{  
void print();  
}  
  
class TestInterface3 implements Printable, Showable{  
public void print(){System.out.println("Hello");}  
public static void main(String args[]){  
TestInterface3 obj = new TestInterface3();  
obj.print();  
 }  
}  

두개의 인터페이스를 상속받았고, 두 인터페이스 내부에는 같은 이름의 함수 print() 가 존재한다. 두개가 충돌하진 않을까싶지만 사실 두 함수를 상속받아도 어차피 구현부는 상속받는 클래스에서 하나이기에 모호함의 개념이 없어진다. 뭘 선택하든 상관없어 진다는 것이다.

추상클래스 VS 인터페이스

-추상클래스인터페이스
추상메소드 이외 여부가능불가능
다중상속 가능 여부물가능가능
non-final가능불가능
non-static가능불가능
keywordabstractinterface
extend클래스, 인터페이스 둘다 가능자바 인터페이스만 가능
상속 키워드extendsimplements
접근지정자allpublic (default)

(참고) https://www.javatpoint.com/difference-between-abstract-class-and-interface

profile
해삐한 다영의 컴퓨터와 친해지기 프로젝트 🥰

0개의 댓글