인터페이스와 추상클래스
포스트
취소

인터페이스와 추상클래스

인터페이스와 추상 클래스의 가장 큰 차이는 결합의 정도이다. 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 제약이 있다. 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.

추상 클래스보다 인터페이스를 우선시 해야 하는 이유 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. (다중 구현) 믹스인(mix-in)에 안성맞춤이다. (추상 클래스는 정의할 수 없음) 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 주된 타입 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. 계층 구조가 없는 타입 프레임워크를 만들 수 있다. 래퍼 클래스 관용구(아이템 18)와 함께 사용하면 기능을 향상시키는 안전하고 강력한 수단이 된다.

/

추상 클래스의 주 목적은, 상속받은 자식 클래스가 부모인 추상 클래스의 기능을 확장하는 ‘확장성’에 주 목적을 두고 있다. 하지만 인터페이스는 구현하는 구현 클래스들의 동일한 동작을 보장하지만, 이들 구현체가 동일한 목적을 가지고 있을 필요는 없다.

인터페이스 클래스간 관련성은 없지만, 동일한 동작을 보장하고 싶을 때 (높은 응집도, 낮은 결합도) 다중 상속이 필요한 경우 특정한 데이터 혹은 객체의 동작을 명시하고자 하는데 목적과 구현 위치는 상관 없을 때

추상 클래스 관련성이 존재하는 클래스 간에 동작을 공유하고 싶을 때(확장) 메소드를 사용하여, 객체의 상태 변화가 가능하게 하고 싶을 때

//

일련의 하위 클래스에서 사용할 틀을 정의하고 싶다면, 그리고 모든 하위클래스에서 사용할 구현 코드가 조금이라도 있다면 추상클래스를 사용합니다. 그리고 그유형의 객체를 절대 만들 수 없게 하고 싶다면 그 클래스를 추상 클래스도 만듭니다.

상속트리에서의 위치에 상관없이 어떤 클래스의 역할을 정의하고 싶다면 인터페이스를 사용하면 됩니다.

///

하지만 모든 Class가 Interface를 이용한다면, 공통적으로 필요한 기능도 implements하는 모든 Class에서 Overriding해 재정의해야 하는 번거로움이 존재한다.

‘is a kind of(~의 한 종류) 추상 클래스’와 ‘be able to(~할 수 있는) 인터페이스’

////

또 다른 관점에서는 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜놓은 것으로 상속 관계를 타고 올라갔을 때, 같은 부모 클래스를 상속하며, 부모 클래스가 가진 기능들을 구현해야 하는 경우에 사용합니다.

반면 인터페이스는 상속 관계를 타고 올라갔을 때, 다른 부모 클래스를 상속하더라도 같은 기능이 필요한 경우에 사용됩니다.

/////

상속은 같은 종류의 하위 클래스를 만드는 기술 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술

-

인터페이스에서 추상메소드는 기본적으로 public과 abstract가 적용되어있다.

추상클래스는 다양한 클래스들로부터 일반화된 항목을 추려 공통된 규약을 맺는 것 인터페이스는 자신보다는 구체화된 상태인 클래스들에게 특정 행위를 구현하도록 약속

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.