클래스와 메소드에 명시될 수 있음.
추상 클래스 및 추상 메서드를 정의하기위해 사용
abstract method는 직접 객체화 될 수 없고 부모 역할에 집중
자식 클래스에게 구현을 강제한다.
(예) 자식이 부모를 상속받기위해서 공부를 무조건 해야한다.)
부모 클래스의 역할에 집중
abstract class는 직접 객체 생성 불가
하지만 자식 클래스에서 super()로 생성되는것은 가능
package step3;
abstract class Parent{
int money=100;
Parent(){
System.out.println("Parent 객체 생성");
}
}
class Child extends Parent{
Child(){
// super();
System.out.println("Child 객체 생성");
}
}
public class TestAbstract1 {
public static void main(String[] args) {
// Parent p = new Parent();
Child c = new Child();
System.out.println(c.money);
}
}
abstract class Parent{ //추상 클래스
int money=100;
Parent(){
System.out.println("Parent 객체 생성");
}
}
Parent 클래스는 추상 클래스로 선언되었다. 즉 abstract class 는 직접 객체화 될 수 없고 부모 클래스의 역할에 집중한다.
class Child extends Parent{
Child(){
// super();
System.out.println("Child 객체 생성");
}
}
앞서 생성한 Parent 클래스를 상속받은 Child 클래스를 만들었다.
생성자에서는 Child 생성자 이전에 Parent 객체를 우선 생성하는 super() 코드가 자동 삽입 됨을 알 수 있다.
// Parent p = new Parent();
주석 처리된 코드를 보자
앞선 코드에서 Parent는 abstract로 추상 클래스로 만들어졌다.
추상 클래스의 특징은 직접 객체 생성이 불가하고 상속되어 super()로 생성만 가능하다.
Child c = new Child();
Parent 객체 생성은 자식을 통해 (super())로 객체 생성이 가능하다.
자기 자신은 직접 객체화 될 순 없지만 자식을 통해서 가능하다는것이다.
abstract class는 부모 역할에만 집중한다.
System.out.println(c.money);
money는 Parent 추상 클래스 내에 선언되어 있지만 Child는 Parent를 상속 받았기때문에 자식을 통해 money 변수에 접근이 가능하다.
Parent 객체 생성
Child 객체 생성
100
Child 객체만 생성했지만, 생략되어 자동삽입된 super() 코드로 인해 부모 클래스의 객체가 우선 생성됨을 알 수 있다.
package step4;
abstract class Parent{
int money=200;
public void eat() {
System.out.println("먹다");
}
public abstract void study();
}
class Child extends Parent{
@Override
public void study() {
}
}
public class TestAbstract2 {
public static void main(String[] args) {
// Parent p = new Parent();
Parent p = new Child();
System.out.println(p.money);
p.eat();
p.study();
}
}
abstract class Parent{
int money=200;
public void eat() {
System.out.println("먹다");
}
public abstract void study();
}
추상클래스로 선언된 Parent 클래스를 살펴보자.
인스턴스 멤버로는 money, eat(), study()가 있다.
주목할 추상 메소드인 study()를 살펴보자.
public abstract void study();
abstract method는 구현부가 존재하지않는것이 문법이다.
클래스 내에서 abstract method가 하나 이상 존재하면 그 클래스는 abstract로 선언되어야하기때문에 Parent 클래스는 자동적으로 abstract class임을 알 수 있다.
class Child extends Parent{
@Override
public void study() {//부모의 abstract method는 반드시 구현해야한다.
}
}
추상클래스로 선언된 Parent를 상속받은 Child 클래스 내부를 보자.
Parent 내에 선언된 study() 메소드는 추상 메소드이기때문에 추상 메소드를 가진 추상 클래스인 Parent 클래스를 상속받은 Child 클래스는 추상 메소드를 오버라이딩해서 반드시 구현해야한다.
public class TestAbstract2 {
public static void main(String[] args) {
// Parent p = new Parent(); -> abstract class는 직접 객체화 할 수 없음
Parent p = new Child();
System.out.println(p.money);
p.eat();
p.study();
}
}
200
먹다
abstract의 특징은 직접 객체화 할 수 없는것이다.
그러므로 주석처리된 Parent의 객체 생성 코드는 에러이다.
그러나 자식을 통해 객체가 생성 가능하기때문에 다형성을 이용해서 부모 객체를 생성하였다.
이에 연결되어 부모 객체의 인스턴스 멤버인 money에도 접근할 수 있게되었고, 나머지 member인 eat(), study()에도 접근이 가능하다.