Part16 - abstract_class

uglyduck.dev·2020년 9월 27일
0

예제로 알아보기 👀

목록 보기
16/22
post-thumbnail

Ex01_abstract

package com.mywork.ex;
/*
추상 메소드 (abstract method)

	1. 본문({} - 코드 블럭)이 없는 메소드이다.
	2. 형식
		abstract public 리턴타입 메소드명(); 

추상 클래스 (abstract class)
	
	1. 추상 메소드를 하나라도 가진 클래스는 추상 클래스이다.
	2. 추상 클래스는 new를 할 수 없다. (객체(인스턴스) 생성 금지)
	3. 형식
		abstract class 클래스명 { }
	4. 추상 클래스를 상속 받는 자식클래스들은 반드시! 추상 메소드를 오버라이드 해야 한다.
*/
abstract class Animal{
	
	// Method
	abstract public void move();	// 추상 메소드
	
	public void eat(String food) {	// 일반 메소드
		System.out.println(food + " 먹는다.");
	}
	
	
}

class Dog extends Animal{
	
	// Method
	@Override
	public void move() {
		 System.out.println("개가 달린다.");
	}
	
}

public class Ex01_abstract {

	public static void main(String[] args) {
		// 추상 클래스는 new 를 할 수 없다.
		// Animal animal = new Animal();
		
		Animal animal = new Dog();
		
		animal.eat("개 밥");
		animal.move();
	}

}

Ex02_abstract

package com.mywork.ex;

abstract class Employee{
	
	// Field
	private String name;
	private String dept;
	
	// Constructor
	public Employee(String name, String dept) {
		this.name = name;
		this.dept = dept;
	}

	
	// Method
	public void setName(String name) {
		this.name = name;
	}
	
	public void setDept(String dept) {
		this.dept = dept;
	}
	
	public String getName() {
		return name;
	}
	
	public String getDept() {
		return dept;
	}
	
	public void output() {
		System.out.println("이름 : " + name);
		System.out.println("부서 : " + dept);
	}
	
	abstract public int pay();	// 추상메소드는 항상 클래스와 짝이 되어야 한다. (* 중요)
	
}

class SalaryWorker extends Employee{
	
	// Field
	private int salary;
	
	// Constructor
	public SalaryWorker(String name, String dept, int salary) {
		super(name, dept);
		this.salary = salary;
	}
	
	// Method
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public int getSalary() {
		return salary;
	}
	
	@Override
	public void output() {
		super.output();
		System.out.println("기본급 : " + salary);
	}
	
	@Override
	public int pay() {
		return salary;
	}
	
}

class SalesWorker extends SalaryWorker{
	
	// Field
	private int salesVolume;
	private double salesIncentive;
	
	// Constructor
	public SalesWorker(String name, String dept, int salary, int salesVolume, double salesIncentive) {
		super(name, dept, salary);
		this.salesVolume = salesVolume;
		this.salesIncentive = salesIncentive;
	}

	// Method
	public void setSalesVolume(int salesVolume) {
		this.salesVolume = salesVolume;
		if(salesVolume >= 100) {setSalesIncentive(0.1);}
		else if(salesVolume >= 50) {setSalesIncentive(0.05);}
		else {setSalesIncentive(0.01);}
	}
	
	public void setSalesIncentive(double salesIncentive) {
		this.salesIncentive = salesIncentive;
	}
	
	public int getSalesVolume() {
		return salesVolume;
	}

	public double getSalesIncentive() {
		return salesIncentive;
	}

	public int salesPay() {
		return (int)(salesVolume * salesIncentive);
	}
	
	@Override
	public int pay() {
		return super.pay() + salesPay();
	}
	
	@Override
	public void output() {
		super.output();
		System.out.println("판매수당" + salesPay());
		System.out.println("월급 : " + pay());
		
	}
		
	
}

public class Ex02_abstract {

	public static void main(String[] args) {
		
		// Employee 는 추상 클래스이기 때문에 new Employee가 불가능하다.
		Employee[] staffs = new Employee[2];
		
		staffs[0] = new SalaryWorker("alice", "디자인", 300);
		staffs[0].output();
		
		staffs[1] = new SalesWorker("natasha", "영업", 300, 0, 0);
		((SalesWorker)staffs[1]).setSalesVolume(1000);
		staffs[1].output();
		
		
	}

}
profile
시행착오, 문제해결 그 어디 즈음에.

0개의 댓글