1) 클래스는 크게 일반 클래스와 추상 클래스로 구분,
그 중 추상 클래스 : 클래스 내 '추상 메소드' 가 하나 이상 포함되거나 abstract로 정의된 경우
: 여러 메소드가 존재, 따라서 그대로 가져다 쓰거나, 오버라이드 하거나, abstract 가 붙은 메소드만 반드시 구현해주면 되는 게 추상 클래스
2) 인터페이스는 모든 메소드가 추상 메소드인 경우
: 미리 이런 메소드들을 사용할 것이라고 인터페이스에 선언해두고, 상속 시 안에 선언된 모든 메소드들을 구현하면 되는게 인터페이스
-> 결국 둘 다 상속 받은 자식이 반드시 구현을 하도록 만들 때 사용
-> 스스로 new 로 객체 생성이 불가능
한마디로 둘의 차이는 ?
추상 클래스는 클래스를 상속 받아 기능을 이용 및 확장,
-> 상속 (Inherit) 의 개념
인터페이스는 껍데기만 존재 -> 구현을 강제시켜 구현 객체의 동일 동작을 보장
-> 다형성 (Polymorphism) 의 개념
비슷해보이는 추상 클래스와 인터페이스인데 왜 구분을 했을까?
왜냐하면 자바는 다중 상속이 불가, 다중 상속의 모호성 때문에 하나만 상속 가능
한 마디로, extends A, B 불가능
class Color extends Blue, Red { @Override pulic void coloring() { super.Add(); } } |
추상 클래스와 상속 클래스의 예
public abstract class Shape() { protected Point center;
protected Shape(Point center) { this.center = center; } public Point getCenter() { return center; } public abstract void draw(); //추상 메소드 }
public class Rectangle extends Shape { private int height; private int width;
public Rectangle(Point center, int weight, int height) { super(center); this.width = width; this.height = height; } // 부모 클래스 (Super Class) 인 Shape 에서 abstract 통해 상속 받은 클래스는 반드시 구현 public void drawGraphics g) { @doSomething } } |
그러나 인터페이스 여러개 구현은 가능 즉, implements A, B 가능
class Animals implements Cat, Dog { @Override public void eating() { @doSomething } } |
따라서,
추상 클래스는 부모가 가진 기능을 물려받으면서 오버라이드할 수 있는 상속을 위한 틀
인터페이스는 다형성을 제공해주는 반드시 구현해야하는 메소드들을 포함한 틀
이라고 정리할 수 있을 것 같다.
참고
https://loustler.io/languages/oop_inheritance_and_polymorphism/
'개발 > 이론' 카테고리의 다른 글
[JAVA] Iterator와 ListIterator (0) | 2019.11.20 |
---|---|
[JAVA] List와 ArrayList / ArrayList와 Array (1) | 2019.11.20 |
[Algorithm] 복잡도 - 탐색 알고리즘(선형, 이진, 해싱) (0) | 2019.02.20 |
[Algorithm] 알고리즘과 복잡도 (0) | 2019.02.20 |
[JAVA] static (0) | 2019.02.20 |