Abstract Class Vs Interface
Abstract Class(추상클래스) 와 Interface(인터페이스)는 어떤 차이가 있을까요?
기능적인 차이점 부터 알아보겠습니다.
추상클래스
- 타입에 제한없는 변수
- 메서드 제한 없음
- extend KeyWord로 상속
- 다중 상속 불가능
인터페이스
- static final 상수 변수
- abstract method , default method
- implements KeyWord로 상속
- 다중 상속 가능
보다 다양한 차이점이 있지만 크게 4가지만 간추렸습니다.
여기서 중요한것은 단순히 기능적인 차이점이 아니라 어쨰서? 입니다
왜 이런 기능적인 차이가 있는걸까요?
지금부터 왜? 에 대해서 알아보겠습니다.
(이 글은 클래스의 Implementation과 Abstraction 개념을 알고있다는전제하에 작성된 글입니다.
따라서 관련된 내용이 궁금하신 분들은 다음을 참고해 주세요)
Abstraction(추상화) 기본 개념 - 1편
Abstraction(추상화)란? 자바에서는 추상클래스 , 추상메서드 , 추상화 등 "추상"이라는 말이 자주 쓰입니다. 또한 Abstract으로 선언된 클래스 , 메서드 등을 보고 추상화시켰다 합니다. 그렇다면 추상
masiljangajji-coding.tistory.com
클래스 설계와 Abstraction Barrier
클래스란 클래스란 특정한 타입을 지정하는것을 의미합니다. 우리는 이미 자바에서 제공하는 Primitive Type을 사용하고있습니다. (byte,short,int,long,folat,double,boolean,char) 이 Type은 각각 특정한 목적을
masiljangajji-coding.tistory.com
추상클래스 Vs 클래스
추상클래스는 기본적으로 클래스이기 떄문에 Implementation을 갖습니다.
또한 일반적인 클래스와 같이 특정한 타입을 정의하기 위해서 사용됩니다.
그럼 일반 클래스와 어떤 점이 다를까요?
일반 클래스와 차이점은 단 하나입니다. 이 타입이 필요한 연산을 구현하지는 않고 명시만 하여 간추린 것이죠
자바에서는 이를 Abstract method 라고 지칭합니다.
좀더 포괄적으로 이해하면 다음과 같습니다.
- 일반클래스 : 이 타입은 Implementation을 갖고 이런 연산을 수행해 !
- 추상클래스 : 이 타입은 Implementation을 갖고 이런 연산을 할수는 있어야 해 !
추상클래스는 미완성 설계도 , 미완성된 클래스 라고 이해하면 됩니다.
구현하지 않고 명시만 해놓은 연산을 extends받는 클래스에서 구현하여 추상클래스의 설계도를 완성시키는 것이죠
이점 외에는 클래스와 동일하기 때문에 당연히 변수와 메서드에 제한이 없습니다.
하지만 이것만으로 해결이 안되는 부분이 존재합니다 . 바로 다중상속이 불가능한 것입니다.
왜 클래스는 다중상속이 불가능 할까요??
이를 알아보겠습니다.
class Sparrow {
int wing;
int beak;
int feather;
}
class Pigeon {
int wing;
int beak;
int feather;
}
참새와 비둘기 타입을 정의했습니다.
참새와 비둘기 타입 모두 날개,부리,깃털을 가집니다.
또한 이것들은 각각의 타입에 대한 Implementation에 속합니다.
참새,비둘기 모두 Implementation을 갖기 떄문에 이 둘을 상속받는다면
두 클래스의 Implementation을 지켜줘야 합니다.
그렇다면 상속받은 클래스에서 사용되는 날개는 어떤 클래스의 날개일까요?
마찬가지로 상속받은 클래스에서 사용되는 깃털은 어떤 클래스의 깃털인가요??
또 부리를 이용해 불을 내뿜는 Dragon타입을 추가적으로 상속받는다면 어떤 클래스의 부리를 이용해 불을 내뿜을 건가요??
이런식으로 Implementation끼리의 충돌이 발생할 수 있습니다.
따라서 클래스는 원천적으로 다중상속이 불가능합니다.
그렇기 떄문에 상속할때도 extends(확장)라는 KeyWord를 사용합니다.
기존 클래스의 Implementation은 지키면서 추가적으로 살을 덧붙여 확장시켜 사용하라는 의미입니다.
동일한 논리로 미완성이기 댸문에 new를 통한 객체생성도 불가능 합니다.
인터페이스 Vs 추상클래스
앞서 말했듯 추상클래스는 Implementation과 연산에 대한 명시가 돼있는 클래스를 의미합니다.
그런데 이런 경우에는 어떨까요?
추상클래스의 추상화 정도가 점점 높아져 어떠한 필드변수도 갖지않고 연산에대한 명시만 돼있는 것입니다.
abstract class Dragon {
abstract void fly(int wing);
abstract void breath(int beak);
}
이 Dragon 추상클래스는 날수있는 기능과 불을뿜는 기능을 명시해놓은 명세서입니다.
별도의 Implementation을 갖지않는 클래스기 떄문에 다중상속이 되어도 문제가 발생하지 않습니다.
하지만 여전히 클래스의 범주에 속하기 떄문에 다중상속이 불가능합니다.
그래서 나온것이 바로 Interface입니다.
추상클래스의 추상화정도가 계속해서 증가하여 필드변수를 갖지않고 기능에대한 명시만 있을때는
다중상속의 문제점이 사라지기 떄문에 Interface라 지칭하고 다중상속이 가능하게끔 만든 것 입니다.
따라서 인터페이스는 Implementation을 갖지 않고 다중상속이 되어도 문제가없는 상수값과 기능에대한 명시만 가집니다.
같은 논리로 상속의 KeyWord도 extends가 아닌 implements(구현)을 사용합니다. 그럼 default method는 무엇인가요??
이것또한 인터페이스의 등장과 동일합니다.
인터페이스를 사용하다보니 어라?? 이런 연산은 다중상속되도 문제가 없을 것 같은데?? 라고 하는것을
default method로 만들어 놓은 것입니다.
이렇게 되면 해당 인터페이스를 구현한 클래스들이 그 메서드를 구현하지 않아도 되는 장점이 있습니다.
자바는 언어가 설계될떄 모든 연산을 클래스를 통해 해결이 가능하다 믿었습니다.
하지만 프로그래밍이 고도화 됨에 따라 요구사항이 증가했고 기존에 사용하던 클래스만으로는 극복불가능한 문제점들이 생기게 됐습니다.
따라서 클래스라는 타입이 갖는 태생적인 한계를 극복하기 위해 여러가지 기능을 덧붙여서 만들었다고 보면 될 것 같습니다.
도움이 되셨다면 좋겠습니다.
'프로그래밍 기초 > 전산학 기초' 카테고리의 다른 글
Specification 기본 개념 (3) | 2023.10.23 |
---|---|
Collection FrameWork 자료구조의 이해 (3) | 2023.10.23 |
클래스 설계와 Abstraction Barrier (0) | 2023.10.22 |
Abstraction(추상화) 기본 개념 - 1편 (0) | 2023.10.20 |
[Static Vs Dynamic] Series (3) | 2023.10.19 |