2021. 10. 12. 10:53ㆍJava
추상 클래스
추상 메소드 하나라도 가진 미완성 클래스
클래스 이름 앞에 abstract가 붙는다
추상 메소드가 아닌 메소드가 존재할 수도 있다
추상을 강제하기 위한 것
부모 클래스에는 메소드의 시그니처만 정의해놓고
그 메소드의 실제 동작 방법은 자식 클래스에게 위임
인스턴스(객체) 생성 불가 == 구체적인 메소드 내용이 없기 때문
상속을 통해 추상 메소드를 구현 후 해당 자손 객체 생성은 가능
추상 메소드
선언부만 존재하고 구현부{}가 없는 메소드
자손마다 구현부를 다르게 구현할 때 정의
완성해도 되고 abstract를 유지해서 추상 메소드의 완성을 미룰 수 있다
final
추상은 상속을 강제
final은 상속/변경을 금지하는 규제
final로 지정된 변수는 한번 값이 할당되면 변경 불가
상속도 당연히 불가
interface
추상메소드의 집합
완성된 것이 전혀 없는 껍데기(모든 멤버가 public)
└ 인터페이스 안의 추상메소드는 접근제한자 예약어 등 생략 가능
└ 무조건 public에 abstract이기 때문
다중 상속이 가능
└ 충돌 : 메소드끼리 선언부가 다르면 충돌X, 선언부가 같고 구현부{}가 다르면 충돌(=자식이 누구에게 상속받을지 결정 불가)
└ 추상메소드는 구현부{}가 애초에 없기 때문에 충돌 문제 X
└ 자바는 단일상속만 가능하지만 interface는 예외
대신 인터페이스의 부모는 인터페이스만 가능
인터페이스의 구현
상속을 통해서 추상 메소드를 완성하는 것
구현할 때는 implements 붙인다
일부만 구현할 경우에는 인터페이스(추상클래스의 집합은)에서 벗어난
추상 클래스가 됐기 때문에 앞에 abstract를 붙인다
interface A {
void a(); // void 앞에 public abstract 생략
void a_a();
}
// 상속을 통해 구현이 완성될 경우
class B implements A { // implements를 붙인다
public void a() {/* 구현부 */}
public void a_a() {/* 구현부 */}
}
// 일부만 구현한 경우
abstract class B implements A { // abstract를 붙인다
public void a() {/* 구현부 */}
}
추상클래스(abstract) | 인터페이스(interface) | |
객체 생성 | 불가 | 불가 |
상속 | 단일 상속 | 다중 상속 |
키워드 | abstract 기술 | abstract 생략가능 |
추상메소드 | 추상메소드 1개 이상 | 추상메소드의 집합 |
일반메소드/필드 | 일반 메소드, 필드 가능 | 상수필드만 가질 수 있음 |
'Java' 카테고리의 다른 글
API, Wrapper Class (0) | 2021.10.13 |
---|---|
캡슐화, setter과 getter메소드 (0) | 2021.09.28 |
오버라이딩, 오버로딩 (0) | 2021.09.23 |
상속, super과 super() (0) | 2021.09.17 |
클래스, 인스턴스와 객체 (0) | 2021.09.15 |