반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- String char[] 형변환
- 리눅스셋팅
- 상관서브쿼리
- 아이디중복
- 메모리스트림
- 스레드그룸
- interrupted()
- sleep()메소드
- include 지시자
- ObjectInputStream
- 리눅스세팅
- ThreadGroup()
- isinterrupted()
- InputDialog
- StringReader
- 동기화
- MemoryStream
- Linux셋팅
- interrupt()
- Linux세팅
- char[] String 형변환
- Daemon()
- include지시자
- first-child
- 상관 서브 쿼리
- StringWriter
- 표현 언어
- ID중복
- include액션태그
- first-of-child
Archives
- Today
- Total
다연이네
[days16] 클래스 간의 형변환 ( 사원, 정사원, 영업사원, 임시직사원) 본문
반응형
public class Ex02{ //extends Object 생략되어있는것
public static void main(String[] args) {
/* //사원 객체 생성해서 사원 정보 출력하는 코딩
Employee emp1 = new Employee("배다연", "서울 서대문구", "010-1234-5678", "2010.08.12");
emp1.dispEmpInfo();
//문제점) 부모 필드는 초기화할 수 있는 방법이 없네요
// Regular emp = new Regular(); // 임플로이 디폴트부터 호출됨 (*부모 객체 먼저 호출 후 자식 객체 호출)
//부모의 name, addr, tel, hiredate dispEmpInfo()
// pay
Regular emp2 = new Regular("김동준","일산 서구","010-3322-5566", "2017.10.30", 3000000);
//문제점) 부모한테 물려받은 dispEmpInfo() 메소드이기 때문에
// 출력 결과에 pay가 없더라
//출력값 : > 사원명:김재익, 주소:서울 양천구, 연락처:010-3322-5566, 입사일자:2017.10.30
//해결방법 1) 오버로딩 - Regular클래스에 pay 사원정보도 출력하는 메소드 선언
// 2) 오버라이딩 - 부모한테 물려받은 메소드(dispEmpInfo) pay필드까지 사원정보 출력하라고 재정의
// [ 오버라이딩 규칙 ]
1) 접근지정자는 부모 접근지정자보다 범위가 같거나 넓어야한다
그 외는 부모 메소드 형식과 똑같아야 한다.
2) @Override 라는 에노테이션을 붙여서 표시한다(생략 가능)
//emp2.dispEmpInfo(); //부모한테 물려받은 dispEmpInfo 접근가능 이유 ? public이라서
Employee emp3 = new Regular("김유미","일산 동구","010-5675-3216", "2010.60.15", 3000000);
emp3.dispEmpInfo(); //앞에 Employee해도 오류나지 않아요, 기본급도 출력돼요
//부모클래스 emp3 = new 자식클래스()
//1. 왜? 답변 - 다형성 설명할 수 있다.
//2. 자식 객체 생성 후 부모클래스에 참조할 수 있다. : Upcasting(업캐스팅)
//Employee, Regular : 상속관계는 있을지언정 서로 다른 클래스예요
//자동 형변환 : Re -> Em [클래스간의 자동 형변환]
//emp3.disp 메소드 호출했는데 Em클래스의 disp 기능 아니고
//실제 참조되는 Re의 오버라이딩한 disp메소드가 호출되더라
//(기억) 클래스간의 형변환 하려면 조건이 상속관계가 있어야 한다
//[질문] 덮어쓰기의 개념인가요? 아뇨 계속 설명할거에요
//상속 관계를 is-a관계 ~은~이다
//정규직은 사원이다
//Regular은 Employee이다.(가능)
//에러 : Type mismatch: cannot convert from Employee to Regular
//Regular emp4 = new Employee();
//사원은 정규직이다(불가능)
//부모 객체 생성 후 자식 클래스에 참조하는 것 불가
Employee emp4 = new Regular("유바비","서울 은평구","010-3111-2226", "2012.11.15", 1000000);
Regular emp5 = (Regular)emp4;
emp5.dispEmpInfo();
*/
Employee emp7 = new SalesMan("신순록","서울 마포구","010-1111-2225", "2018.09.10", 500000, 20, 10000);
//Employee 대신에 Regular 줘도 됨
emp7.dispEmpInfo(); //실질적으로 SalesMan객체의 disp 함수 호출됨
Employee [] emps = {
new Regular("김재익","서울 양천구","010-3322-5566", "2017.10.30", 3000000),
new SalesMan("김재익","서울 양천구","010-3622-5756", "2018.10.30", 500000, 20, 10000),
new Temp("김명준","서울 서대구","010-1372-5346", "2016.10.30", 20, 70)
};
for (int i = 0; i < emps.length; i++) {
사원정보출력(emps[i]);
}
}
System.out.println("=END=");
}//main
public static void dispPay(Employee emp) {
if(emp instanceof SalesMan) {
SalesMan e = (SalesMan)emp;
System.out.println("> SalesMan 객체였네요");
}
else if(emp instanceof Regular) {
Regular e = (Regular)emp;
System.out.println("> Regular 객체였네요");
}
else if(emp instanceof Temp) {
Temp e = (Temp)emp;
System.out.println("Temp 객체였네요");
}
System.out.println(emp.getPay());
}
}//class
// [사원 클래스]
// 사원이라면 공통적으로 가지고 있어야 할 필드, 메소드를 선언한 클래스
public abstract class Employee extends Object{ //추상클래스가 되었다
//필드
private String name; //사원명
private String addr; // 사원 주소
private String tel; // 사원 연락처
private String hiredate; // 입사일자
//생성자
public Employee() {
super();
System.out.println("> Employee 디폴트 생성자 호출됨.");
}
public Employee(String name, String addr, String tel, String hiredate) {
super();
this.name = name;
this.addr = addr;
this.tel = tel;
this.hiredate = hiredate;
System.out.println("> Employee 4 생성자 호출됨.");
}
//메소드
//사원 정보 출력하는 메소드
public void dispEmpInfo() {
System.out.printf("> 사원명:%s, 주소:%s, 연락처:%s, 입사일자:%s\n"
, this.name, this.addr, this.tel, this.hiredate);
}
//사원이 할수 있는 일 중 가장 중요한 일 - 급여받는 일
// 임금(급여)을 계산해서 반환하는 메소드 추가
//가상메소드x 인스턴스 메소드를 자식클래스에서 재정의할 수 있기 때문
/*public int getPay() { //가상메소드 : virtual 키워드 필요한데 자바는 굳이 필요 없음
return 0; //0줘서 형식 맞추기
} */
public abstract int getPay(); // 몸체X
}
// [정규직 사원 클래스]
// 사원 클래스를 상속받아 선언
public class Regular extends Employee {
//필드
//Employee 클래스로부터 물려받은 n, a, t, h 존재 + 메소드 존재
private int pay; //기본급
//생성자 (필드 초기화하는 역할/ 객체 생성과 동시에 자동호출
public Regular() {
//super(); //부모의 디폴트 생성자 호출하겠다는 의미
//이 코딩이 없어도 부모의 생성자 호출
System.out.println("> Regular 디폴트 생성자 호출됨.");
}
public Regular(String name, String addr, String tel, String hiredate, int pay) {
super(name, addr, tel, hiredate);
//자식의 생성자에서 부모의 또 다른 생성자를 호출
this.pay = pay;
System.out.println("> Regular 5 생성자 호출됨.");
}
@Override
public void dispEmpInfo() {
super.dispEmpInfo();
System.out.printf("> 기본급:%d\n",this.pay);
}
@Override
public int getPay() {
return this.pay;
}
/*
//오버라이딩
@Override
public void dispEmpInfo() {
// System.out.printf("> 사원명:%s, 주소:%s, 연락처:%s, 입사일자:%s, 기본급:%d\n"
// , this.name, this.addr, this.tel, this.hiredate, this.pay);
//this.name, this.addr, this.tel, this.hiredate
super.dispEmpInfo(); //super 용도1 : 부모의 필드와 메소드에 접근할 수 있음
System.out.printf("> 기본급:%d\n",this.pay);
}
//오버로딩
//pay 사원정보도 출력하는 메소드 선언
public void dispEmpInfo(int pay) {
//메소드명은 같고 매개변수가 다르다 : 중복함수, [오버로딩]
}
*/
}
// [영업직 사원 클래스]
// Object -> Employee -> Regular -> SalesMan
public final class SalesMan extends Regular{
//필드 Object, Employee( n,a,t,h ), Regular (pay)
private int sales; //판매수량
private int comm; //커미션
//생성자
public SalesMan() {
super();
System.out.println("SalesMan 디폴트 생성자 호출됨.");
}
public SalesMan(String name, String addr, String tel, String hiredate, int pay
,int sales, int comm) {
//super()코딩은 반드시 제일 위에 코딩
super(name, addr, tel, hiredate, pay);
this.sales = sales;
this.comm = comm;
System.out.println(">SalesMan 6 생성자 호출됨.");
}
@Override
public void dispEmpInfo() {
super.dispEmpInfo();
System.out.printf("> 판매수량:%d, 커미션:%d\n",this.sales, this.comm);
}
@Override
public int getPay() {
return super.getPay() + this.sales*this.comm; //영업직의 급여 계산 (기본급+판매량*커미션)
}
//메소드 dispEmpInfo()
}
// [임시직 사원 클래스]
public class Temp extends Employee {
//E - n,a,t,h dispEmpInfo()
//필드
private int days; //근무일수
private int payOfDay; //하루 일당
//생성자
public Temp() {
super();
}
public Temp(String name, String addr, String tel, String hiredate,
int days, int payOfDay) {
super(name, addr, tel, hiredate);
this.days = days;
this.payOfDay = payOfDay;
System.out.println("> Temp 6 생성자 호출됨.");
}
@Override
public int getPay() {
return this.days*this.payOfDay; //임시직의 급여계산 : 기본급없고 근무일수*일당
}
}
반응형
'Java' 카테고리의 다른 글
[days16] 다형성 (0) | 2020.10.17 |
---|---|
[days16] final (0) | 2020.10.17 |
this, 생성자, static, 상속 (0) | 2020.10.17 |
days08 ~ days11 (0) | 2020.10.09 |
days02 ~ days07 정리 (0) | 2020.10.09 |
Comments