다연이네

[days16] 클래스 간의 형변환 ( 사원, 정사원, 영업사원, 임시직사원) 본문

Java

[days16] 클래스 간의 형변환 ( 사원, 정사원, 영업사원, 임시직사원)

 다연  2020. 10. 17. 21:46
반응형

 

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