추상메소드(abstract method)란 자식 클래스에서
오버라이딩해야만 사용할 수 있는 메소드 자바에서
추상 메소드를 사용하는 목적은 추상메소드가 포함된
클래스를 상속받는 자식 클래스를 상속받는 자식 클래스가
반드시 추상메소드를 구현하도록 하기 위함이다.
이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.
즉, 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.
추상메소드 구현 예시
//추상 클래스 : 추상 메소드를 포함하는 클래스
public abstract ckass AbstractNethod {
	//구현부 즉, 대괄호{}가 없으며 구체적이지 않다고 해서 추상 메소드라 한다.
    //추상 메소드를 생성하려면 추상 클래스가 있어야 한다.
    //추상 메소드는 abstract라는 것을 붙여줘야 한다.
    
    abstract int getAge();
    
    abstract void setAge(int num);
    
    //추상 클래스는 class앞에 abstract라는 것을 붙여줘야 하고
    //추상 메소드는 타입앞에 abstract를 붙여줘야 한다.
    //추상 메소드를 하나라도 가지면 추상 클래스가 된다.
}
추상 클래스는 객체 생성이 불가 하다. 출력 에시
//추상 클래스 구현
public abstract class Appliance {
	abstract void powerOn();
    abstract void powerOff();
}
//추상 클래스를 상속받은 자식 클래스
public class Fridge extends Appliance {
	@Override
    void powerOn(){
    	System.out,println("냉장고의 전원을 켜다.")
    }
    @Override
    void powerOff() {
    	System.out.println("냉장고의 전원을 끄다.")
    }
}
//메인 클래스
public class Main {
	public statice void main(String[] atgs) {
    	//추상 클래스는 객체 생성 불가
        //상속 받은 자식 클래스는 객체 생성을 할 수 있다.
        new Fridge().powerOn();
        new Fridge().powerOff();
    }
}
Interface 출력 에시
//Interface 구현
public interface Appliance {
	void PowerOn();
    void PowerOff();
    }
//class 구현
public class Fridge implements Appliance {
	//Interfac인 Appliace를 Implements를 하면 메소드 구현을 강제 한다.
    @Override
    public void PowerOn() {
    	System.out.println("냉장고를 켜다.");
    }	
    @Override
    public void PowerOff() {
    	System.out.println("냉장고를 끄다");
    }
//Main메소드 구현
	public class Main {
    	public static void main(String[] args) {
        	//new Appliance(); interface이기 때문에 객체를 생성할 수 없다.
            new Fridge().PowerOn();
            new Fridge().PowerOff();
        }
    }
}
Extends와 Implements 동시 사용 예시
public interface A{
}
public interface B{
}
public class C{
}
public class D extends C implements A,B{ 
//extends와 implements는 다중 구현이 가능
}
Final 상속 예시
public class ConstantField {
	static final double MOON_RADIUS=1700;
	static final double MOON_AREA=MOON_RADIUS*MOON_RADIUS*Math.PI;
}
Final은 생성자에서 값을 할당해줄수 있다.
public class Worker{
	//필드_멤버변수 
	final String COMPANY="Google";
	final String regNumber;
	String name;
	//생성자(constructor)
	public Worker(String regNumber, String name) {
		this.regNumber=regNumber;
		this.name=name;
	}	
}
public class Main {
	public static void main(String[] args) {
		Worker w1=new Worker("900000-1000000", "박남현");
		System.out.println(w1.COMPANY);
		System.out.println(w1.regNumber);
		System.out.println(w1.name);
		//w1.regNumber="900000-1000000"는 생성자에서 초기화가 된 상태기 때문에 값을 재할당 할 수 없다.
		//무조건 필드에서만 final을 할당해야하는게 아닌 생성자에서도 할당 할 수 있다.
		w1.name="전여빈";
	}
}