추상메소드(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="전여빈";
}
}