JDK8 부터 인터페이스에 Default 메서드가 추가 되었다.
추상 클래스와 인터페이스의 큰 차이점은 두가지이다.
1. 추상 클래스는 멤버 변수를 가질 수 있지만 인터페이스는 멤버 변수를 가질 수 없다.
(물론 인터페이스도 static 으로 정의된 변수를 내부적으로 선언할 수 있지만 멤버 변수를 선언할 수 없다)
2. 클래스를 구현 할 때 오직 하나의 클래스만을 상속 받을 수 있는 반면에 인터페이스는 여러개를 상속 받거나 구현 할 수있다.
대부분의 멤버 변수는 그 객체의 속성을 담아두기 위한 용도로 사용한다. 메서드 내에 선언한 변수는 메서드가 종료되면 그 상태를 잃어버리는 반면, 클래스의 멤버 변수는 객체가 살아있는 한 속성을 유지 할 수 있으며 값을 변경 할수도
있다. 이렇게 중요한 기능을 수행하는 멤버 변수가 인터페이스에 존재하지 않는 것은 인터페이스 자체를 객체화 할 수 없다는 의미이다. 그리고 속성도 없고 그 값을 유지할 수 있다. 이렇게 변수 선언에 제약을 둠으로써 인터페이스를 다른 클래스와 구별 할 수 있는 큰 차이를 유지 할수 있다.
자바는 다중 상속을 허용하지 않는다. 하지만 여러개의 인터페이스를 구현할 수 있다는 것은 하나의 클래스에 여러개의 인터페이스의 명세가 있으며 여러 개의 유형으로 활용 할수 있다는 것이다.
( 인터페이스는 명세서 역할을 한다. 일관된 접근 경로를 제공하고 클래스의 캡슐화를 돕는역할로 한정하는 것이 안정적은 소스 코드 작성에 도움이 된다. )
다중상속을 지원하지 않는 이유는 코드를 복잡하게 하여 프로그램을 취약하게 만들고, 버그를 유발하고 소프트웨어를 유지, 보수 하기 어렵게 하는 나쁜 기능이라고 생각하기 떄문이다. 그래서 인터페이스를 통해 다중 상속과 유사한 접근을 할 수 밖에 없다. 자바에서는 상위클래스 혹은 인터페이스를 상속/ 구현 하기 위해 다음 두개의 키워드를 제공한다.
+ extends : 상속, 클래스가 상위 클래스를 상속 받을때 사용하며 인터페이스가 상위 인터페이스를 상속 받을때도 사용할 수있다.
+ implement : 구현을 의미한다. 클래스가 인터페이스를 구현할때)
자바의 상속이란 인터페이스를 implemets 키워드로 구현했을 때를 의미 하지 않고 클래스가 상위 클래스를 확장 하고자 할때 extends 키워드를 이용해서 정의 하는 것을 의미한다.
'java' 카테고리의 다른 글
[자바 병렬 처리 - 포크/ 조인 프레임 워크] (0) | 2021.04.17 |
---|---|
[JAVA]스트림(Stream) 에서 기본형(Primitive type)은 왜 취약할까? (0) | 2021.04.13 |
[Effective java] Item 7 - 종료자(finalize) 사용을 피하라 (0) | 2021.01.30 |
[Effective Java] Item 6 - 유효기간이 지난 객체 참조는 폐기하라. (0) | 2021.01.30 |
[디자인패턴] 빌더(Builder) - 개념 정리,예제 (0) | 2021.01.28 |