객체 지향 언어에서 클래스는 아주 중요한 개념이다.
현재 하고 있는 게시판 프로젝트의 경우에 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 와 유사한데 싶어 그 차이점에 대해 공부해보고자 한다.
자바에서 추상화는 무엇일까?
추상화, abstraction : 세부적인 구현은 숨기고 오직 사용자에게 기능적인 부분만 보여주는 절차
추상화를 하면서 얻을 수 있는건 객체의 how 가 아니라 what 에만 초점을 둔다는 것이다.
다시말해, 어떻게 객체가 작동하는지는 관심없고, 이 객체가 무엇인지에만 관심을 둔다는 것이다.
이러한 추상화에는 두가지 유형이 있다.
1. 추상클래스 - 추상화 정도 0~100%
2. 인터페이스 - 추상화 정도 100%
abstract키워드로 선언된 클래스
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(); 가 불가능함을 의미한다.
클래스의 설계도 같은 존재
loose coupling 가능인터페이스 선언시에 컴파일러는 메서드 앞뒤로 public, static, abstract 키워드를 더하고, 데이타 멤버 앞뒤로 static, final 키워드를 더한다.
extendsimplementsextends인터페이스는 한 클래스가 여러가의 인터페이스를 상속받는 다중상속을 가능하게 해준다.
클래스에서는 불가능한 다중상속이 인터페이스에서 가능한 이유는 뭘까?
클래스에서 다중상속이 불가능했던 이유는 모호함때문이었지만, 인터페이스에서는 모호함이 없다.
예시를 보면 쉽게 이해할 수 있다.
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() 가 존재한다. 두개가 충돌하진 않을까싶지만 사실 두 함수를 상속받아도 어차피 구현부는 상속받는 클래스에서 하나이기에 모호함의 개념이 없어진다. 뭘 선택하든 상관없어 진다는 것이다.
| - | 추상클래스 | 인터페이스 |
|---|---|---|
| 추상메소드 이외 여부 | 가능 | 불가능 |
| 다중상속 가능 여부 | 물가능 | 가능 |
| non-final | 가능 | 불가능 |
| non-static | 가능 | 불가능 |
| keyword | abstract | interface |
| extend | 클래스, 인터페이스 둘다 가능 | 자바 인터페이스만 가능 |
| 상속 키워드 | extends | implements |
| 접근지정자 | all | public (default) |
(참고) https://www.javatpoint.com/difference-between-abstract-class-and-interface