추상 클래스
Abstract Method
추상 클래스는 자식 클래스에서 반드시 Override 해야만 사용할 수 있는 메소드이다.
추상 메소드는 body{ } 가 없는 메소드를 말한다.
추상 메소드가 포함된 클래스를 상속받은 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위해 사용한다.
[형식]
public abstract class 클래스명{
public abstract void 메소드명();
}
추상 메소드가 있는 클래스는 반드시 추상 클래스이어야 한다.
추상 메소드는 추상 클래스 안에 반드시 있어야 하지만,
public abstract class Test{
public abstract void setTest();
}
추상 클래스 안에는 반드시 추상 메소드가 있지 않아도 된다.
public abstract class Test{ // 의미상의 추상클래스
public void setTest(){ };
}
이처럼 추상 메소드가 없는 추상 클래스를 의미상의 추상클래스 라고 한다.
의미상의 추상클래스의 메소드는 모두 빈body{ } 로 되어 있다.
추상 클래스는 자신의 클래스로 메모리를 생성할 수 없고 생성하려면 Sub Class를 이용히거나 메소드를 이용해야한다.
Sub Class를 이용할 경우 Sub Class가 추상 메소드를 반드시 Override 해야한다.
만약 Sub Class가 추상 메소드를 Override 하지 않으면 Sub Class 마저도 abstract가 되어야 한다.
public class AbstractMain extends AbstractTest {
@Override
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
AbstractTest at = new AbstractMain();
at.setName("홍길동");
System.out.println("이름 = " + at.getName());
}
}
AbstracMain(Sub Class)가 AbstractTeat(Super Class)를 상속한다.
SetName(String name) 메소드는 두 상하위 클래스의 Override 메소드이다.
AbstractTest at = new AbstractTest();는 AbstractTest가 추상클래스이기 때문에 Error가 발생한다.
따라서,
AbstractTest at = new AbstractMain();로 Sub Class를 이용해서 AbstractTest 클래스를 불러온다.
public abstract class AbstractTest { //ROJO 형식 (Plain Old Java Object)
String name; //private 안됨
public AbstractTest() {}
public AbstractTest(String name) {
super();
this.name = name;
}
public String getName() { // 구현
return name;
}
public abstract void setName(String name); // 추상 메소드
// 추상 메소드가 있다면 클래스도 추상 클래스로 잡아야한다.
}
setName을 추상 메소드로 만들었을 때,
AbstractTest 클래스를 추상 클래스로 변경한다.
=> public abstract class AbstractTest { }
private String name은 자신의 클래스 안에서만 불러올 수 있는 private 접근 제어자 때문에
하위 메소드에 불려나가야 되는(Override되는) setName에 사용될 수 없다.
따라서, 하위 클래스가 불러서 사용할 수 있도록 defualt나 protected로 선언해야한다.
=> String name;
=> protected String name;
'Java' 카테고리의 다른 글
Java, 추상 클래스 NumberFormat 이용하기 / DecimalFormat / getCurrencyInstance( 나라별로 숫자(돈) 표현 ) (0) | 2024.07.17 |
---|---|
Java, 생성자 메소드/ this와 this()의 차이 / varargs (0) | 2024.07.17 |
Java, Override의 정의 / Overload와 차이 / Annotation / 다형성이란 (0) | 2024.07.16 |
Java, 상속(inheritance) / error 고치기 (0) | 2024.07.15 |
Java, indexOf("문자열", 시작위치) / replace(현재문자, 바꿀문자) (0) | 2024.07.15 |