다형성 복습
일부 미완성 클래스(abstract 메소드 0개 이상 포함)
*abstract 메소드가 없어도 클래스를 객체로 못만들게 하고 싶은 경우가 있음
ex) 계산기(+, -, , /) -> 기본 기능을 가지고 있지만 이것만으로는 사용 범위가 좁음
--> abstract로 만들어서 객체 생성 막아둠
*의미적으로 객체가 되면 안 되는 경우
ex) Biology - 생물 객체는 어떤 생물인가?
ex) Animal 클래스
동물 객체는 어떤 동물인가? eat(), breath() 는 어떻게 수행되는가?
--> 알 수 없음 but 동물의 공통된 기능명은 알고 있음
[인터페이스] 상속
interface: 점점
-★연관성이 낮거나 없는★ 클래스들에게 공통된 기능을 제공할 때 사용
ex) 키보드, 마우스, 스캐너, 카메라, 압력센서, 기울기 센서
--> 입력 장치(각각의 용도는 다르지만 "입력"이라는 공통된 "기능명"이 있을 뿐)
모든 필드(변수)가 묵시적(암묵적) public static final
ex) public staic final double PI = 3.141592;
public static final
int MAX_NUM = 10000;
(public static final을 적지 않아도 자동으로 적혀져있다고 암묵적으로 정의)
모든 메소드가 묵시적으로 public abstract (추상 메소드)
ex) public abstract
void input();
"input"이라는 이름을 자식에게 제공할 뿐 생략 가능, 상세한 기능은 자식이 알아서 오버라이딩 해라
->그런데 추상 메소드이기 때문에 오버라이딩 강제화
(참고) 인터페이스 활용 용도
-default 메소드: 상속 받은 클래스에 공통 기능을 제공
--> 자바의 함수 지향 언어 사용을 위한 메소드로 사용
+람다, 스트림에 사용
+Spring AOP Proxy 사용
인터페이스
추상 클래스의 변형체(추상 클래스보다 추상도가 높다)
- 추상 클래스: 일부만 추상 메소드(0개 이상)
- 인터페이스: 모두 추상 메소드
상속 시 implements 사용
인터페이스 특징
1) 인터페이스를 부모 참조 변수로 사용하면 다형성의 업 캐스팅이 적용되어서 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.
-> 이를 이용하여 중요한 메인 코드의 수정을 최소화할 수 있다.
ex) Run에 작성된 합, 차, 곱, 몫을 출력하는 코드의 수정 없이 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.
2) 자식 클래스에 공통된 메소드 구현을 강제하기 때문에 모든 자식 클래스가 동일한 형태를 띄게 된다.
-> 이를 이용하여 공동 작업에 필요한 개발 환경을 조성할 수 있다
package edu.kh.poly.ex2.model.service;
//class를 만든 게 아니라 interface로 들어가서 만들었음
//계산기 인터페이스
//-> 모든 계산기에 대한 공통 필드, 기능명을 제공하는 접점(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 double divide(int num1, int num2);
}
package edu.kh.poly.ex2.model.service;
import edu.kh.poly.ex2.model.vo.Animal;
public class KHJCalculator 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 double divide(int num1, int num2) {
return num1 / num2;
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void breath() {
// TODO Auto-generated method stub
}
}
package edu.kh.poly.ex2.model.service;
public class JHSCalculator implements Calculator{
@Override
public int plus(int num1, int num2) {
return num1 + num2 + MAX_NUM;
}
@Override
public int minus(int num1, int num2) {
return num1 - num2 + MAX_NUM;
}
@Override
public int multiple(int num1, int num2) {
return num1 * num2 + MAX_NUM;
}
@Override
public double divide(int num1, int num2) {
return (double)num1 / num2 + MAX_NUM;
}
}
package edu.kh.poly.ex2.run;
import edu.kh.poly.ex2.model.service.AbstractService;
import edu.kh.poly.ex2.model.service.Calculator;
import edu.kh.poly.ex2.model.service.JHSCalculator;
public class AbstractRun {
public static void main(String[] args) {
AbstractService service = new AbstractService();
// service.ex1();
//=======================================================
// Calculator 임폴트
// import edu.kh.poly.ex2.model.service.Calculator;
// 각자 만든 xxxCalculator 임폴트
// import edu.kh.poly.ex2.model.service.JHSCalculator;
// Calculator cal = new Calculator();
//인터페이스 == 미완성 설계도 == 객체 생성 불가능
//-> 추상 클래스처럼 참조변수로는 사용 가능
//코드의 큰 수정 없이
//객체 생성 코드만 바꾸면 새로운 클래스 코드를 수행할 수 있다.
// Calculator cal = new KHJCalculator();
Calculator cal = new JHSCalculator();
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));
//인터페이스의 특징
//1) 인터페이스를 부모 참조 변수로 사용하면
// 다형성의 업 캐스팅이 적용되어서
// 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.
//-> 이를 이용하여 중요한 메인 코드의 수정을 최소화할 수 있다.
// ex) Run에 작성된 합, 차, 곱, 몫을 출력하는 코드의 수정 없이
// 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.
//2) 자식 클래스에 공통된 메소드 구현을 강제하기 때문에
// 모든 자식 클래스가 동일한 형태를 띄게 된다.
// -> 이를 이용하여 공동 작업에 필요한 개발 환경을 조성할 수 있다.
}
}