1. 지정자(modifier)
static | 객체와 상관없이 클래스로 접근 | 필드, 메소드, 클래스 |
final | ~을 할수없게 하는 | 필드, 메소드, 클래스 |
abstract |
~을 반드시 해야만 하는 | 메소드 : 오버라이드를 목적으로 만든 메소드 숨겨질 메소드이기 때문에 명령자체가 존재하지 않음 abstract메소드를 하나라도 가지고 있다면 클래스도 abstract로 선언해주어야 한다. |
클래스 : 상속만을 목적으로 만든 클래스 |
2. 추상클래스와 추상메소드의 사용
Employee | ||
public abstract intcomputePay(); 로 추상메소드를 선언 -> 자식클래스에 오버라이드 메소드를 만들도록 강제성을 부여한다. -> 묵시적 객체형변환을 할 수 있게되므로, 접근성이 더욱 좋아진다. |
||
EmployeeRegular | EmployeeTime | EmployeeContract |
|
3. final 지정자와 final메소드의 사용
상수필드(Constant field) | final 메소드 |
public static final double INCENTIVE_RATE = 1.5; | |
1. 값대신 사용하기 위한 필드이다. 2. 값 대신 의미있는 단어를 이용하여 표현하기 위해 사용한다. 3. 이거 하나만 바꾸면 되므로 유지보수가 좋아진다 3. 대문자, 언더바를 사용한다. |
1. 자식클래스에서 오버라이드 선언할 경우 반환되는 해당 메소드가 변경가능해진다. 2. 자식클래스에서 오버라이드 선언하지 못하도록 final메소드로 작성한다. 3. 오버라이드가 불가능해 진다. |
4. package와 import
1. 패키지
- 파일을 구분하여 저장하기 위해 사용
- 같은 기능의 참조형을 그룹화 하기 위해 패키지를 사용한다.
2. import
- 참조형을 사용하기 위해서는 패키지명을 포함한 참조형으로 표현
- import를 정리하는 단축키 : Ctrl+Shift+O >> 필요한 참조형을 import 처리하거나 불필요한 참조형의 import 처리 제거
**어노테이션
1. @overide
2. @SuppressWarings
더보기
[전체 코드]
1. 실행 클래스
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
|
package inheritance;
//사원 급여 관리 프로그램 작성
public class EmployeeApp {
public static void main(String[] args) {
// 추상클래스는 인스턴스를 생성할 수 없다.
// Employee em = new Employee();
// 추상클래스(부모클래스)로 참조변수에 자식클래스의 생성자로 인스턴스 생성하여 저장
// =>자식 인스턴스 생성 전에 부모 인스턴스 생성 - 부모인스턴스
// Employee employee1 = new EmployeeRegular();
// Employee employee2 = new EmployeeContract();
// Employee employee2 = new EmployeeTime();
Employee[] eArray = new Employee[5];
eArray[0] = new EmployeeRegular(1000, "홍길동", 9600000);
eArray[1] = new EmployeeTime(1001, "전우치", 50000, 150);
eArray[2] = new EmployeeContract(1002, "김철수", 7000000);
eArray[3] = new EmployeeRegular(1003, "김영희", 6600000);
eArray[4] = new EmployeeTime(1004, "홍경례", 60000, 160);
for (Employee emp : eArray) {
System.out.println("사원번호 = " + emp.getEmpNo());
System.out.println("사원 이름 = " + emp.getEmpName());
// 사원급여를 출력하기 위해서 명시적 객체 형변환을 이용하여 자식메소드를 호출할 수 있다.
// 자식을 구분해야함
/*if (emp instanceof EmployeeRegular) {
System.out.println("사원급여 = " + ((EmployeeRegular) emp).computeSalary());
} else if (emp instanceof EmployeeTime) {
System.out.println("사원급여 = " + ((EmployeeTime) emp).calcPay());
} else if (emp instanceof EmployeeContract) {
System.out.println("사원급여 = " + ((EmployeeContract) emp).getContractPay());
}*/
//묵시적 객체 형변환을 이용하여 자식 인스턴스의 메소드 호출
//=>부모클래스의 메소드를 자식클래스에서 오버라이드 선언
System.out.println("사원 급여 = " + emp.computePay());
System.out.println("=========================================");
}
}
}
|
cs |
2. employee
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
|
package inheritance;
//사원정보(사원번호, 사원이름)를 저장하기 위한 클래스
//=> 인스턴스 생성이 목적이 아닌 상속을 목적으로 작성된 클래스
//=> 상속을 목적으로 작성된 클래스는 추상클래스(Abstract Class)로 선언하는 것을 권장
//=> 인스턴스가 생성이 되지 않는다.
public abstract class Employee {
private int empNo;
private String empName;
//상수필드Constant field : 값 대신 사용하기 위한 필드
//값대신 의미있는 단어를 이용하여 표현하기 위해 사용 ->유지보수에 좋다
//대문자로만 표현하여 단어의 구분에는 언더바를 사용
public static final double INCENTIVE_RATE = 1.5;
public Employee() {
// TODO Auto-generated constructor stub
}
public Employee(int empNo, String empName) {
super();
this.empNo = empNo;
this.empName = empName;
}
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
//자식클래스에서 반드시 오버라이드 선언하도록 추상메소드로 설정해준다.
//=> 강제성 부여
public abstract int computePay();
//인센티브를 계산하여 반환하는 메소드
//=>모든 사원에게 급여의 150%를 인센티브를 계산하여 지급
//=>자식클래스에서 오버라이드 선언할 경우 반환되는 인센티브가 변경가능하다
//=>자식클래스에서 오버라이드 선언하지 못하도록 final메소드로 작성한다.
//=>오버라이드가 불가능해 진다.
public final int computeincentive() {
//=>추상메소드를 호출한 경우 묵시적 객체 형변환에 의해 자식인스턴스...
//부모클래스의메소드에서 자식클래스의 메소드를 호출
int incentive = (int)(computePay() * INCENTIVE_RATE);
//리터럴 대신 상수필드를 이용하여 작성하는 것을 권장
return incentive;
}
}
|
cs |
3. employeeRegular
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
|
package inheritance;
//정규직 사원정보(사원번호, 사원이름, 연봉)을 저장하는 클래스
//=> employee클래스를 상속받아 작성
public class EmployeeRegular extends Employee {
private int annualSalary;
public EmployeeRegular() {
// TODO Auto-generated constructor stub
}
public EmployeeRegular(int empNo, String empName, int annualSalary) {
super(empNo, empName);
this.annualSalary = annualSalary;
}
public int getAnnualSalary() {
return annualSalary;
}
public void setAnnualSalary(int annualSalary) {
this.annualSalary = annualSalary;
}
//급여를 반환하는 메소드
/*
public int computeSalary() {
return annualSalary/12;
}*/
@Override
public int computePay() {
return annualSalary/12;
}
}
|
cs |
4. employeeTime
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
|
package inheritance;
//시간제 사원정보(사원번호, 사원이름, 시급, 근무시간)를 저장하기 위한 클래스
//=> employee클래스를 상속받아 작성
public class EmployeeTime extends Employee {
private int moneyperHour;
private int workedHour;
public EmployeeTime() {
// TODO Auto-generated constructor stub
}
public EmployeeTime(int empNo, String empName, int moneyperHour, int workedHour) {
super(empNo, empName);
this.moneyperHour = moneyperHour;
this.workedHour = workedHour;
}
public int getMoneyperHour() {
return moneyperHour;
}
public void setMoneyperHour(int moneyperHour) {
this.moneyperHour = moneyperHour;
}
public int getWorkedHour() {
return workedHour;
}
public void setWorkedHour(int workedHour) {
this.workedHour = workedHour;
}
//급여를 반환하는 메소드
/*
public int calcPay() {
return moneyperHour * workedHour;
}*/
@Override
public int computePay() {
return moneyperHour * workedHour;
}
}
|
cs |
5. employeeContract
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
|
package inheritance;
//계약직 사원정보를(사원번호, 사원이름, 계약급여)저장하기 위한 클래스
//=> employee클래스를 상속받아 작성
public class EmployeeContract extends Employee{
private int contractPay;
public EmployeeContract() {
// TODO Auto-generated constructor stub
}
public EmployeeContract(int empNo, String empName, int contractPay) {
super(empNo, empName);
this.contractPay = contractPay;
}
public int getContractPay() {
return contractPay;
}
public void setContractPay(int contractPay) {
this.contractPay = contractPay;
}
@Override
public int computePay() {
return contractPay;
}
//final메소드를 오버라이드 선언할 경우 에러가 발생
/*@Override
public int computeincentive() {
return 1000000000;
}*/
}
|
cs |
'💻 수업정리 (2020) > 자바' 카테고리의 다른 글
[5/28] java.lang패키지 (0) | 2020.05.28 |
---|---|
[5/27] ★★★ 예외전달, 다중스레드 (0) | 2020.05.27 |
[5/26] 접근지정자 , 자료형(클래스, 인터페이스, enum) (0) | 2020.05.26 |
[5/22] 오버라이드와 객체 형변환 (0) | 2020.05.22 |
[5/21] 클래스와 상속, 인터페이스 (0) | 2020.05.21 |