추상클래스
추상 클래스는 클래스 내 추상메소드가 하나 이상 포함되거나 abstract으로 정의된 경우를 말합니다. 추상클래스를 비유하자면 미완성 설계도라고 표현합니다. 추상 클래스는 일반 클래스와 차이가 거의 없습니다. 단지 추상 메소드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스입니다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.
클래스안의 메소드가 단 한개라도 추상메소드가 있다면 그 클래스 앞에는 반드시 abstract 클래스명으로 표기해야 하며 abstract와 final 키워드를 동시에 표기할 수 없습니다.
public abstract class Test {}
추상 메소드는 선언부는 있는데 구현부가 없는 메소드를 의미합니다.
(안이 아직 구현되어 있지 않은 abstract으로 정의된 메소드를 말합니다.)
예시)
public class 쥐 extends 동물 {
void 울어보세요() {
System.out.println("나는 쥐!");
}
}
public class 고양이 extends 동물 {
void 울어보세요() {
System.out.println("나는 고양이!");
}
}
public class 동물 {
void 울어보세요() {
System.out.println("동물은 어떻게 울어야 하나요!");
}
}
동물 클래스의 인스턴스를 구현하기에는 뭔가 애매한 것을 느낄 수 있습니다.
이럴 경우 추상메소드를 사용하면 좋습니다.
public class 동물 {
abstract void 울어보세요();
}
공통된 클래스들에 대해서 추상화된 부분을 추상 메소드를 통해서 하위 클래스들에게 상속해서 사용하게 합니다.
전혀 다른 클래스들에게 사용하기보단 비슷한 특징을 가지고 있는 클래스들에게 사용한다는 특징도 가지고 있습니다.
특징
- 클래스 내의 추상메소드가 하나라도 있으면 추상 클래스 입니다.
- 추상 클래스는 인스턴트, 즉 객체를 만들 수 없는 클래스 입니다.
- 추상 메소드는 하위 클래스에서 추상 메소드의 구현을 강제합니다.
- 추상 메소드를 포함하는 클래스는 반드시 추상 클래스여야 합니다.
- 상속하는 집합간에는 연간관계가 있습니다.
- 다중 상속이 불가능 합니다.
- 일반적인 메소드 + 추상 메소드 + 일반변수
- 추상 클래스의 궁극적인 목적은 상속하기 위함입니다. (클래스를 상속받아 기능을 이용하고 확장시킨다.)
인터페이스
인터페이스는 비유하자면 구현된 것은 아무것도 없는 밑그림만 그려져 있는 기본 설계도라 표현할 수 있습니다.
인터페이스는 모든 메소드가 추상 메소드입니다. (자바8에서는 default 키워드를 이용해 일반 메소드도 구현이 가능합니다.) 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 것이 목적으로 클래스와 다른 점은 다중상속이 가능합니다.
인터페이스는 안이 비어있는 메소드들의 형태들만 써놓은 것이며 상속하는 클래스들에서 해당 메소드들의 내용을 구현해야 하는 메소드들의 집합이라 볼 수 있습니다.인터페이스는 final을 붙일 수 없고 인터페이스 변수들은 static 이어야만 합니다. 즉 인터페이스는 일반변수들을 가질 수 없습니다.
동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이자 개념입니다.
자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용합니다.
특징
- 모든 메소드들이 추상 메소드로 이루어져 있으면 클래스들이 구현해야하는 동작을 지정하는 용도로 쓰입니다.
- 모든 멤버 변수는 public static final 이어야 하며, 생략할 수 있습니다.
- 모든 메소드는 public abstract 이어야 하며, 이를 생략할 수 있습니다.
- Java 8 부터는 static, default method를 사용할 수 있습니다.
- 다중상속(구현)이 가능합니다.
- 상속하는 집합간에는 연관관계가 존재하지 않을 수 있습니다.
- 인터페이스는 추상 메소드로 이루어져 있습니다.
- 추상메소드를 구현을 강제해 구현 객체의 같은 동작을 보장할 수 있습니다.
추상 클래스와 인터페이스의 공통점은 추상메소드를 사용할 수 있다는 점 입니다.
추상 클래스와 인터페이스는 상속 받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제합니다.
추상 클래스와 인터페이스의 차이
추상 클래스는 extends 키워드를 사용하고 인터페이스는 implements 키워드를 사용해 상속을 구현합니다.
상속 : 재사용 + 확장
상속은 is kind of 관계 입니다.
- 펭귄 is kind of 동물 -> 펭귄은 동물의 한 분류이다.
정리하면
객체 지향의 상속은 상위 클래스의 특성을 재사용, 확장하는 것이고 is kind of의 관계를 만족해야 합니다.
추상 클래스의 상속도 마찬가지로 상위 클래스는 하위 클래스에게 특성을 상속해주는 것을 적용하므로 extends라는 키워드를 사용합니다.
인터페이스의 관계는 다음과 같습니다.
구현 클래스 is able to 인터페이스
- Serializable : 직렬화 할 수 있는
- Comparable : 비교할 수 있는
- Runnable : 실행할 수 있는
인터페이스는 클래스가 무엇을 할 수 있다 라고 하는 기능을 구현하도록 강제하는 특징을 가지고 있습니다.
인터페이스는 추상클래스와 달리 클래스가 아니므로 자식 클래스가 상속을 받을 때 extends 키워드가 아니라 implements 키워드를 사용합니다.
추상클래스
- 일반변수 + 일반메소드 + 추상메소드로 구성되어 있습니다.
- extends 키워드 사용
- 다중상속이 불가능합니다.
- 속도가 인터페이스 보다 빠릅니다.
- 상속 관계를 타고 올라갔을 때 같은 조상클래스를 상속하는데 기능까지 완벽히 똑같은 기능이 필요한 경우 사용합니다.
- 상속에 대한 계층 구조를 명확히 표현할 때 사용됩니다.
- 일반 변수들과 일반 메소드들도 쓸 수 있고 아직 구현하지 않아도 될 메소드는 그냥 내버려 둘 수 있어 상황에 따라 편리합니다.
인터페이스
- 상수 + 추상메소드로 구성되어 있습니다.
- implements 키워드 사용 (클래스가 아니므로)
- 상속 관계를 타고 올라갔을 때 조상클래스를 상속하는데 같은 기능이 필요할 경우 사용합니다.
- 다중상속이 가능합니다.
- 속도가 추상 클래스보다 느립니다. (인터페이스는 관련 메소드들을 찾기 위해 부가적인 일들을 더 처리하기 때문입니다. )
- 클래스 전체가 아닌 메소드들만 쓰고 싶을 때 사용하면 효과적입니다.
- 동시개발이 가능하므로 시간을 많이 단축시킬 수 있습니다.
- 메소드들에 대한 결과값은 미리 알 수 있으모로 누군가가 구현을 하고 있으면 다른 사람은 구현 결과를 예상해서 작업을 할 수 있기 때문에 개발속도가 빠릅니다.
- 또한 메소드가 변경되더라도 그와 관련된 클래스들을 변경할 필요 없이 메소드 내용만 변경하면 되는 처리속도가 빨라집니다.
참조
http://alecture.blogspot.com/2011/05/abstract-class-interface.html