추상클래스(Abstract class)
1. 추상 클래스 특징
public abstract class 클래스이름 {
// 필드, 생성자, 메소드 작성
// 미완성된 추상 메소드 선언
}
- 미완성된 클래스로 반드시
abstract
키워드를 붙여준다 - 선언되어있지만 구현되지 않은, 미완성의 메소드(추상 메소드)를 포함하고 있는 클래스이다
=> 추상 메소드를 포함하고 있다면 반드시 추상 클래스가 된다
=> 하지만 추상 메소드가 없어도 abstract 클래스로 선언은 가능하다 - 클래스 내에 일반 변수, 메소드를 포함 할 수 있다
- 부모 클래스로 이용 가능하다(상속)
- 클래스로서의 자체적인 객체 생성이 불가하다
=> 반드시 상속하여 객체를 생성해야 한다 -
객체생성은 안되지만 참조형 변수 타입으로는 사용 가능하다
-
사용 이유
- 일관된 인터페이스 제공
- 꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능)
- 새 클래스 작성을 위한 템플릿으로 사용되며 상속받은 클래스들의 규칙을 정의할 수 있다
2. 추상 (abstract) 메소드
// 접근제한자 abstract 리턴타입 함수이름 ( );
public abstract void method();
- 추상 메소드는 추상 클래스와 같이 abstract 키워드를 붙여준다
- 메소드의 몸체(구현부)
{ }
를 가지지 않는다 - 상속 시 반드시 구현해야하는, 오버라이딩이 강제화 되는 메소드이다
- 추상 메소드를 제공하는 이유는 추상 클래스를 상속받아 만들어지는 후손 클래스들이 메소드를 처음 선언과 동일하게 재정의해서 사용하라는 의미이다
3. 추상 클래스 상속
public class 클래스명 extends 추상클래스명 { }
- 일반 클래스의 상속과 같이 추상클래스도
extends
를 사용하여 상속받는다 - 자식은 여러명일 수 있으나 부모는 단 하나만 가능하므로 extends로 여러개의 추상클래스를 상속받을 수는 없다
인터페이스 (interface)
1. 인터페이스란
- 추상 메소드로만 구성된 추상 클래스를 인터페이스라고 한다
- 추상 클래스보다 추상화 정도를 높여 일반 메소드, 멤버 변수를 가질 수 없다
=> 상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체이다 - 추가로 상수(public static final 필드)만 멤버로 가진다
=> 여러 클래스에서 사용되는 동일한 상수일 경우 인터페이스에 정의 한 후 해당 상수를 공유하게 할 수 있다 - 다중 상속에 제한이 없다
=> 여러 인터페이스들을 다중으로 상속받을 수 있다 - 추상 클래스이기때문에 자체적으로 객체생성은 안되지만 참조형 변수로 사용은 가능하다
- 공통 기능상의 일관성을 제공하고 공동 작업을 위한 인터페이스를 제공한다
- 상위 타입 역할로 다형성을 지원하여 연결한다
- 일반 클래스 상속을 이용해서 자식 클래스들의 관계를 맺는 것보다 간편하게 관계를 맺을 수 있다
- 상속 시 인터페이스 내에 정의된 모든 추상메소드를 구현해야 한다
2. 인터페이스 사용방법
[ 인터페이스 선언 ]
[접근제한자] interface 인터페이스명 {
// 상수도 멤버로 포함할 수 있음
public static final 자료형 변수명 = 초기값;
// 추상 메소드만 선언 가능
[public abstract] 반환자료형 메소드명([자료형 매개변수]);
// public abstract가 생략되기 때문에
// 오버라이딩 시 반드시 public 표기해야 함
}
- 인터페이스 내부에는 모든 메소드가 추상 메소드이므로
public abstract
키워드를 생략 가능하다
(하지만 혼동할 수 있으므로 굳이 생략하지 않고 명시해두는 곳도 있다) - 모든 인터페이스의 메소드는 묵시적으로 public 이다
- 변수는 묵시적으로 public static final이다 (상수만 멤버로 가질 수 있기 때문)
[ 인터페이스 상속 ]
-
인터페이스의 인터페이스 상속
public interface 인터페이스 extends 인터페이스1, 인터페이스2, … { // 상수 또는 추상 메소드 }
- 클래스의 상속은 단일 상속만 가능하지만 인터페이스는 다중 상속이 가능하다
- 추상 메소드에 대한 구현(implement) 과 재정의(Overriding)는 인터페이스를 상속받은 후손 클래스에서 구현(Implement)해야 한다
-
클래스의 인터페이스 상속
public class 클래스 implements 인터페이스1, 인터페이스2, … { // 일반 클래스 정의 // 인터페이스 추상 메소드 구현 }
- 클래스간의 상속과는 다르게
implements
를 사용하여 상속 받는다 - 다중 상속이 가능하다
- 상속받은 후손 클래스는 반드시 인터페이스의 추상 메소드를 구현해야 한다
- 클래스간의 상속과는 다르게
3. 추상클래스와 인터페이스 비교
구분 | 추상 클래스 | 인터페이스 |
---|---|---|
상속 | 단일 상속 | 다중 상속 |
구현 | extends 사용 | implements 사용 |
추상 메소드 | abstract 메소드 0개 이상 | 모든 메소드는 abstract |
abstract | 명시적 사용 | 묵시적으로 abstract |
객체 | 객체 생성 불가 | 객체 생성 불가 |
용도 | 참조 타입 | 참조 타입 |
댓글남기기