abstract
/interface
설계의 기능을 한다는 점은 같으나, 사용(존재) 목적이 다름
상속 + 다형성 모두 활용한 것
두 개념을 잘 이해해야 추상 클래스도 능숙하게 사용 가능
추상화 : 공통점을 추출하고 불필요한 부분 제거하는 것
몸체 없는 메소드
(추상 메소드)를 포함한 클래스 (미완성 설계도)
추상 클래스일 경우 클래스 선언부에 abstract
키워드 사용
[접근제한자] abstract class 클래스명 {}
몸체 없는 메소드
추상 메소드의 선언부에 abstract
키워드 사용
상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
미완성 클래스(abstract
키워드 사용)
자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성
abstract
메소드가 포함된 클래스는 반드시 abstract
클래스
abstract
메소드가 없어도 abstract
클래스 선언 가능
클래스 내에 일반 변수, 메소드 포함 가능
객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능
상속 받은 자식에게 공통된 멤버 제공
일부 기능의 구현을 강제화(공통적이나 자식 클래스에 따라 재정의 되어야 하는 기능).
💡 자바는 다중 상속을 지원하지 않음 → 출처의 모호함 방지
따라서 필요한 경우 인터페이스 사용
추상 클래스와 매우 유사한 개념이나, 보다 추상적인 개념
→ 구현 X, 설계 O (추상화의 정도가 높다)
설계의 개념에 좀 더 근접함
추상클래스와 달리 인터페이스는 반드시 사전에 정의된 추상메서드와 상수만 가질 수 있음
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체
메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로
상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함
[접근제한자] interface 인터페이스명 {
// 상수도 멤버로 포함할 수 있음
public static final 자료형 변수명 = 초기값;
//추상 메소드만 선언 가능
[public abstract] 반환자료형 메소드명([자료형 매개변수]);
// public abstract가 생략되기 때문에
// 오버라이딩 시 반드시 public 표기해야 함
}
추상 클래스와 작성법 및 상속 받는 법이 좀 다름
- 상속
- 추상클래스 상속
- 인터페이스 상속
위 개념들을 잘 알아야 언제 어떤 것을 쓸 지 판단할 수 있음
인터페이스는 다중 상속 가능함
implements 인터페이스1, 인터페이스 2, … 인터페이스n
→ 콤마
,
로 구분
모든 인터페이스의 메소드는 묵시적으로 public abstract
변수는 묵시적으로 public static final
객체 생성은 안되나 참조형 변수로는 가능 (다형성)
→ 타입으로서의 역할은 수행한다는 뜻
다형성을 이용하여 상위 타입 역할(자식 객체 연결)
인터페이스 구현 객체에 공통된 기능 구현 강제화 (== 구현 객체간의 일관성 제공)
공동 작업을 위한 인터페이스 제공
구분 | 추상 클래스 | 인터페이스 |
---|---|---|
상속 | 단일 상속 | 다중 상속 |
구현 | extends 사용 | implements 사용 |
추상 메소드 | abstract 메소드 0개 이상 | 모든 메소드는 abstract |
abstract | 명시적 사용 | 묵시적으로 abstract |
객체 | 객체 생성 불가 | 객체 생성 불가 |
용도 | 참조 타입 | 참조 타입 |
둘의 존재 목적이 다름
자식 클래스의 공통된 부분을 추출하여(→ 추상화) 부모 클래스를 만드는 것
→ 공통된 필드, 메서드를 가진 클래스를 만들고, 작성된 코드를 자식들이 물려받아 사용.
코드 길이 감소
코드 중복 제거
재사용성 증가
자식에 대한 일관된 규칙 제공
부모 클래스도 객체로 만들 수 있어야 하는 경우
연관된 클래스의 공통점을 묶되, 부모 클래스는 객체로 만들 수 없는 경우
abstract
메소드 0개 이상 포함)eat()
breath()
→ 알 수 없음
→ 접점
연관성이 낮거나 없는 클래스에게 공통된 기능을 제공할 때 사용.
모든 필드가 묵시적(암묵적) public static final
// 동일하게 인식됨
public static final double PI = 3.141592;
(public static final) double PI = 3.141592;
모든 메서드가 묵시적(암묵적) public abstract
(추상 메서드)
⇒ 추상메서드: 같은 이름을 제공할 뿐, 상세한 기능 제공은 하지 않음
// input이라는 이름은 자식에게 제공하지만
// 기능은 제공하지 않고
// 오버라이딩 강제화
(public abstract) void input(); // 묵시적 public abstract
인터페이스 활용 용도
default
메소드 : 상속받은 클래스에 공통 기능 제공 → 자바의 함수 지향 언어 사용을 위한 메소드로 종종 사용