추상 클래스(공통적 추출)/개별적 제외
추상 클래스 (abstract class)
몸체 없는 메소드를 포함한 클래스 (미완성 설계도)
추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
[접근제한자] abstract class 클래스명{}
추상 메소드(abstract method)
몸체 없는 메소드
추상 메소드의 선언부에 abstract 키워드 사용
상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
특징
1. 미완성 클래스(abstract 키워드 사용)
자체적으로 객체 생성 불가-> 반드시 상속하여 객체 생성
2. abstract 메소드가 포함된 클래스는 반드시 abstract클래스
abstract 메소드가 없어도 abstract 클래스 선언 가능
3. 클래스 내에 일반 변수,메소드 포함 가능
4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능
장점
상속 받은 자식에게 공통된 멤버 제공.
일부 기능이 구현을 강제화(공통적이나 자식 클래스에 따라 재정의 되어야 하는 기능)
인터페이스(Interface,접점)
자바에서의 인터페이스 : 클래스 간의 접점 -> 클래스가 공통적으로 가져야하는 필드,
메소드를 모아두고 상속
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형제
메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로
상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야함
[접근제한자] interface 인터페이스명{
//상수도 멤버로 포함할 수 있음
public static final 자료형 변수명 = 초기값;
//추상 메소드만 선언 가능
[public abstract] 반환자료형 메소드명([자료형 매개변수]);
//public abstract가 생략되기 때문에
//오버라이딩 시 반드시 public 표기해야 함
}
특징
1.모든 인터페이스의 메소드는 묵시적으로 public abstract
2.변수는 묵시적으로 public static final
3.객체 생성은 안되나 참조형 변수로는 가능(다형성)
장점
다형성을 이용하여 상위 타입 역할(자식 객체 연결)
인터페이스 구현 객체에 공통된 기능 구현 강제화 (== 구현 객체간의 일관성 제공
공동 작업을 위한 인터페이스 제공
추상클래스와 인터페이스

<정리>
*[일반 클래스]상속
*[추상 클래스]상속
-연관된 클래스의 공통점을 묶되,부모클래스는 객체로 만들 수 없는 경우
*[인터페이스]상속:장점
-연관성이 낮거나 없는 클래스에게 공통된 기능을 제공할 때 사용.
ex)키보드,마우스,스캐너,카메라,기울기 센서 (공통점: 입력장치)
우연히도 입력이라는 기능을 가지고 있음! -> 각각의 용도는 다르지만 입력이라는 공통된 기능명이 있음.
-입력이라는 접점!
(public static final) double PI = 3.141592;(묵시적)
ex) (public abstract) void input()
// input이라는 이름을 자식에게 제공할 뿐, 상세한 기능은 자식이 알아서 오버라이딩 해라!
그런데 추상메서드니까 오버라이딩 강제화
(참고)
인터페이스 활용 용도
코드
package edu.kh.poly.ex2.model.service;
//계산기 인터페이스
//-> 모든 계산기에 대한 공통 필드,기능명을 제공하는 접점(interface)의 용도
public interface Calculator {
//인터페이스 : 추상클래스의 변형체(추상클래스보다 추상도 높음)
// - 추상클래스 : 일부만 추상메서드(0개이상)
// - 인터페이스 ; 모두 추상메서드
// 필드(묵시적으로 public static final ==> 상수)
public static final double pI = 3.14;
static final int MAX_NUM = 10000;
public int MIN_NUM = -10000;
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;
public class LWJCalculator /extends Animal /implements Calculator{
// 클래스,인터페이스 동시 상속 가능
// 인터페이스는 다중 상속 가능
// extends : 확장하다, implements : 구현하다
//(부)클래스 - (자)클래스 : 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.ex1.model.Service.PolyService;
import edu.kh.poly.ex2.model.service.AbstractService;
import edu.kh.poly.ex2.model.service.LWJCalculator;
public class AbstractRun {
public static void main(String[] args) {
//AbstractService service = new AbstractService();
LWJCalculator cal = new LWJCalculator();
System.out.println("합 : " + cal.plus(20,15));;
System.out.println("c차 : " + cal.minus(20,15));;
System.out.println("곱 : " + cal.multiple(20,15));;
System.out.println("몫 : " + cal.divide(20,15));;
//인터페이스 == 미완성 설계도 ==객체생성 불가능
//-> 추상클래스처럼 참조 변수로는 사용 가능
//코드의 큰 수정없이
//객체 생성 코드만 바꾸면 새로운 클래스 모두 수행할 수 있다
//인터페이스 특징
//1) 인터페이스를 부모 참조변수로 사용하면
// 다형성 중 업캐스팅이 적용되서
// 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.
//-> 이를 이용하여 중요한 메인코드의 수정을 최소화 할 수 있다.
//ex)Run에 작성된 합,차,곱,몫을 출력하는 코드의 수정 없이
// 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.
//2)자식 클래스에 공통된 메서드 구현을 강제하기 떄문에
// 모든 자식 클래스가 동일한 형태를 띄게 된다.
// -> 이를 이용하여 공동 작업(팀 프로젝트)에 필요한
// 개발 환경을 조성할 수 있다.
}