본문 바로가기
Programming/Java * Spring

[Java] 09. 추상클래스(abstract)

by 고막고막 2019. 3. 27.


(설계 관점에서) 클래스의 종류

1. 구현 클래스

모든 매서드가 이미 구현되어져 상속된다. 일반적인 클래스.

2. 추상 클래스

단 1개라도 구현되지 않은 매서드가 존재하는 것. 매서드 명은 있으나 기능을 구현하지 않은 것 → 판단의 여지를 남겨두는 상황. 구현 안 된 매서드가 있으므로 객체 생성이 안 됨(실체화 불가), 무조건 상속을 전제로 만들어진 클래스.

3. 인터페이스 클래스

모든 매서드가 구현되어 있지 않음. Spec, 상세서, 명세서를 작성할때 사용. 클래스와 클래스 간의 통신하는 방식을 의미.


추상 클래스 예시

>>> 정규직, 계약직, 파트타임 세 가지 유형의 직원을 가진 회사의 급여산정 프로그램을 만든다고 해보자. 고용유형 별 급여 산정 기준이 다르기 때문에 부모클래스인 직원클래스에서 매서드를 구현하지 않고 추상클래스로 생성한다. 그리고 정규직, 계약직, 파트타임 각각의 클래스에서 상속받은 급여산정 매서드를 클래스의 특성에 맞게 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public abstract class Employee {
    protected String empno;
    protected String name;
    protected int pay;    
    public Employee(String empno, String name, int pay) {
        this.empno = empno;
        this.name = name;
        this.pay = pay;
    }
    
    public abstract double getMoneyPay();
    
    public String toString() {
        return empno+" : "+name+" : "+pay;
    }
}
 
public class RgularEmployee extends Employee {
    private int bonus;    
    public RgularEmployee(String empno, String name, int pay, int bonus) {
        super(empno, name, pay);
        this.bonus = bonus;
    }
 
    @Override
    public double getMoneyPay() {
        double mPay = (pay/(double)12)+(bonus/(double)12);
        return mPay;
    }
}
 
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 getMoneyPay() {
        double mPay = pay/(double)12;
        return mPay;
    }
}
 
public class PartTimeEmployee extends Employee {
    private int workDay;    
    public PartTimeEmployee(String empno, String name, int pay, int workDay) {
        super(empno, name, pay);
        this.workDay = workDay;
    }
 
    @Override
    public double getMoneyPay() {
        double mPay = pay*workDay;
        return mPay;
    }
}
 
public class EmployeeMain {    
    public static void viewPay(Employee[] emps) {
        for(Employee emp : emps) {
            System.out.println(emp+" : "+emp.getMoneyPay());
            System.out.println("-----------------------");
        }
    }
    
    public static void main(String[] args) {
        Employee[] emps = new Employee[4];
        emps[0= new RgularEmployee("E001""홍길동"300500);
        emps[1= new TempEmployee("E002""임꺽정"40003);
        emps[2= new PartTimeEmployee("E003""황진이"715);
        emps[3= new PartTimeEmployee("E004""어우동",  510);
        
        viewPay(emps);
    }
}
cs