상속 프로그램을 짜는 순서.
1. 우선은 해당 데이터 들을 몇 개의 클래스로 만들어야 할지 결정한다.
2. 상속 구조가 가능한지를 결정한다.
3. 일반 상속이 나은가? 추상 클래스를 쓰는 상속이 나은가 결정한다.
4. 부모 클래스에 있어야 할 속성과 메소드를 조절한다.
5. 데이터를 활용하는 계산은 객체가 알아서 하도록 둔다.

공통된 데이터나 동작을 모아서 직원으로 모은다.
일반적이고 공통적인 것들을 모아서 추상화시킨다.
처음부터 부모클래스를 결정하는게 아닌 공통된부분이 생기면 한곳으로 모아 부모클래스를 만든다.
일반 상속과 추상 클래스 어떻게 정해야하나 ?
오버라이드(@Override) 할 필요가 전혀 없고 새로운속성이나 메소드가 추가되는 경우에만 일반 상속을 써도된다.
하위에서 반드시 오버라이딩을 해야하는 내용이 있다면 추상 클래스의 형태로 가는것이 좋다.
그런 데이터의 특징은 나중에 새로운 데이터가 들어올 가능성이 많은 경우가 상당수이다.
프로그램을 만들 때 if~else에 대한 부분이 필요하다고 생각이 들면 오버라이드를 해야 한다는 '경고 신호'이다.
지금 예제의 경우 월급을 계산할 때 반드시 필요한 if~else가 추가되어야 하는 경우이다.
이런 경우에는 일반 상속보다 추상 클래스가 더 낫다.
* 부모클래스
package org.employee.domain;
public abstract class Employee {
protected String empno;//사번
protected String name;//이름
protected int pay;//급여
public abstract double getMonthPay();//한달급여
public Employee(String empno, String name, int pay) {
super();
this.empno = empno;
this.name = name;
this.pay = pay;
}
public String getEmpno() {
return empno;
}
public String getName() {
return name;
}
public int getPay() {
return pay;
}
@Override
public String toString() {
return "Employee [empno=" + empno + ", name=" + name + ", pay=" + pay + "]";
}
}
공통적인 속성과 동작을 부모클래스로 분리.
1. 사번
2. 이름
3. 임금.
4.getMonthPay()
각 직원의 종류에 따라서 다르게 동작할 메소드, 즉 오버라이드가 필요한 메소드
Employee 클래스의 추상 메소드 이므로 하위 클래스는 반드시 구현해야만 하는 메소드이다.
접근 제한자가 protected인 이유는 상속에서 하위클래스에서도 마음대로 접근할수있기 때문이다.
* 자식클래스 조금 더 쉽게 만드는방법.

새로운 클래스를 만들 때 Superclass의 Browse누르고
Choose a type: 란에 부모 클래스의 이름을 쓴다.
* 컴파일 에러

새로 만들면 클래스명에 컴파일 에러가 나는데, Int bonus를 선언해준뒤에 롬복으로 @AllArgsConstructor 해주면
컴파일 에러가 사라진다.
* 수정 후

* 자식 1 : 정규직
package org.employee.domain;
public class RegularEmployee extends Employee {
private int bonus;
public RegularEmployee(String empno, String name, int pay, int bonus) {
super(empno, name, pay);
this.bonus = bonus;
}
@Override
public double getMonthPay() {
return (pay/(double)12) + (bonus/(double)12);
}
@Override
public String toString() {
return "RegularEmployee [bonus=" + bonus + "]";
}
}
* 자식 2 : 계약직
package org.employee.domain;
public class TempEmployee extends Employee {
private int hireYear;
public TempEmployee(String empno, String name, int pay, int hireYear) {
super(empno, name, pay);
this.hireYear = hireYear;
}
@Override
public double getMonthPay() {
return pay/(double)12;
}
@Override
public String toString() {
return "TempEmployee [hireYear=" + hireYear + "]";
}
}
* 테스트
import org.employee.domain.Employee;
import org.employee.domain.PartTimeEmployee;
import org.employee.domain.RegularEmployee;
import org.employee.domain.TempEmployee;
public class EmployeeTest {
public static void printPay(Employee emp) {
System.out.println("-------------------");
System.out.println(emp);
System.out.println("-------------------");
System.out.println(emp.getMonthPay());
System.out.println("-------------------");
}
public static void main(String[] args) {
Employee[] emps = new Employee[4];
emps[0] =new RegularEmployee("E001", "홍길동", 3000, 500);
emps[1] =new TempEmployee("E002", "임꺽정", 4000,1);
emps[2] =new PartTimeEmployee("E003", "황진이", 5,10);
emps[3] =new PartTimeEmployee("E004","어우동", 10, 7);
for(int i = 0; i < emps.length; i++) {
printPay(emps[i]);
}
}
}
'성장기 > Java' 카테고리의 다른 글
| Java 인터페이스 공부 (0) | 2021.01.07 |
|---|---|
| Java Quiz 프로그램 클래스와 시퀀스 다이어그램 (0) | 2021.01.06 |
| Java 접근제한자와 getter,setter (0) | 2021.01.04 |