(자식 클래스의) 공통된 부분을 추출하여 부모 클래스를 만드는 것
-> 공통된 필드, 메소드를 가진 클래스를 만들고 작성된 코드를 자식들이 물려받아 사용
(코드 길이 감소, 코드 중복 제거, 재사용 증가, 자식에 대한 일관된 규칙 제공)
부모 클래스도 객체로 만들 수 있어야 되는 경우
ex) (부) 갤럭시 22 (자) 갤럭시 22 울트라
연관된 클래스의 공통점을 묶어두되 부모 클래스는 객체로 만들 수 없는 경우
+ 일부 미완성 클래스 (abstract 메소드 0개 이상 포함)
- abstract 메소드가 없어도 클래스를 객체로 못 만들게 하고 싶은 경우가 있음
(1) 기본 기능을 가지고 있지만 이것만 가지고는 쓸 데가 없음
-> abstract로 만들어서 객체 생성을 막아둠
ex) 계산기(+, -, *, /)
(2) 의미적으로 객체가 되면 안 되는 경우
ex) Biology - 생물 객체는 어떤 생물인가?
ex) Animal 클래스
- 동물 객체는 어떤 동물인가? eat(), breath()는 어떻게 수행되는가?
-> 알 수 없음. 하지만 동물의 공통된 기능명은 알고 있음.
interface : 접점
연관성이 낮거나 없는 클래스들에게 공통된 기능을 제공할 때 사용
ex) 키보드, 마우스, 스캐너, 압력 센서, 기울기 센서
-> 입력 장치 (각각의 용도는 다르지만 "입력"이라는 공통된 "기능명"이 있을 뿐)
default 메소드 : 상속받은 클래스에 공통 기능 제공
-> 자바의 함수 지향 언어 사용을 위한 메소드로 사용
package edu.kh.poly.ex2.model.service;
// 계산기 인터페이스
// -> 모든 계산기에 대한 공통 필드, 기능명을 제공하는 접점(interface) 용도
public interface Calculator {
// 인터페이스 : 추상 클래스의 변형체 (추상 클래스보다 추상도 높음)
// - 추상 클래스 : 일부만 추상 메소드(0개 이상)
// - 인터페이스 : 모두 추상 메소드
// 필드(묵시적으로 public static final)
// -> 어떻게 작성하든 모두 public static final
public static final double PI = 3.14;
static final int MAX_NUM = 100000;
public int MIN_NUM = -100000;
int ZERO = 0;
// 메소드(묵시적으로 public abstract)
public abstract int plus(int num1, int num2);
public abstract int minus(int num1, int num2);
public abstract int multiple(int num1, int num2);
public abstract int divide(int num1, int num2);
}
package edu.kh.poly.ex2.model.service;
import edu.kh.poly.ex2.model.vo.Animal;
public class ASHCalculator extends Animal implements Calculator {
// 클래스, 인터페이스는 동시 상속 가능
// 인터페이스는 다중 상속 가능
// extends : 확장하다 / implement : 구현하다
// (부)클래스 - (자)클래스 상속 시에는 extends (추상 클래스도 포함)
// (부)인터페이스 - (자)클래스 상속 시에는 implements
@Override
public int plus(int num1, int num2) {
return num1 + num2;
}
@Override
public int minus(int num1, int num2) {
return num1 - num2;
}
@Override
public int multiple(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
return num1 / num2;
}
}
package edu.kh.poly.ex2.run;
import edu.kh.poly.ex2.model.service.ASHCalculator;
import edu.kh.poly.ex2.model.service.AbstractService;
import edu.kh.poly.ex2.model.service.Calculator;
public class AbstractRun {
public static void main(String[] args) {
// Calculator 임폴트
// import edu.kh.poly.ex2.model.service.Calculator;
// 각자 만든 xxxCalculator 임폴트
// import edu.kh.poly.ex2.model.service.ASHCalculator;
// ASHCalculator cal = new ASHCalculator();
Calculator cal = new ASHCalculator();
// 인터페이스 == 미완성 설계도 == 객체 생성 불가능
// -> 추상클래스처럼 참조 변수로는 사용 가능
// 코드의 큰 수정 없이
// 객체 생성 코드만 바꾸면 새로운 클래스 코드를 수행할 수 있다.
System.out.println("합 : " + cal.plus(20, 15));
System.out.println("차 : " + cal.minus(20, 15));
System.out.println("곱 : " + cal.multiple(20, 15));
System.out.println("몫 : " + cal.divide(20, 15));
}
}
구분 | 추상 클래스 | 인터페이스 |
---|---|---|
상속 | 단일 상속 | 다중 상속 |
구현 | extends 사용 | implements 사용 |
추상 메소드 | abstract 메소드 0개 이상 | 모든 메소드는 abstract |
abstract | 명시적 사용 | 묵시적으로 abstract |
객체 | 객체 생성 불가 | 객체 생성 불가 |
용도 | 참조 타입 | 참조 타입 |