쌓고 쌓다

[JAVA] 추상 클래스 본문

프로그래밍/java

[JAVA] 추상 클래스

승민아 2021. 12. 27. 21:27

추상 메소드

추상 메소드는 선언은 되어 있으니 코드가 구현되어 있지 않는 껍데기만 있는 메소드이다.

상속에서 슈퍼 클래스로 사용되며 추상 메소드를 작성하기 위해 abstract 키워드를 사용한다.

public abstract String getName(); // 추상 메소드
public abstract setName(String str); // 추상 메소드

public abstract String fail() // 컴파일 에러 발생 ( 코드 작성이 이루어 지면 안됨 )
{
	return "추상 클래스 실패"; 
}

 

추상 클래스가 되는 방법

 

1. 추상 메소드를 포함하는 클래스

abstract class Person{ // 추상 클래스 선언
    
    abstract public void Speak(); // 추상 메소드 선언
}

추상 메소드를 가지고 있는 경우 그 클래스는 무조건 추상 클래스로 선언되어야 한다.

class Person{ // 추상 메소드가 있는데 그냥 클래스이므로 컴파일 에러

    public abstract void Speak();
}

위와 같이 추상 메소드가 존재하는 경우 그 클래스 또한 추상 클래스로 선언해야 함.

 

2. 추상 메소드가 없지만 abstract로 선언된 클래스

abstract class Person{

    public void Speak()
    {
        
    }
}

추상 메소드가 없더라고 추상 클래스로 선언이 가능하다.

 

추상 클래스는 객체 생성이 불가능

Person person; // 컴파일 문제 없음
person = new Person(); // 컴파일 에러

추상 클래스의 레퍼런스 변수를 생성하는 것은 에러가 안 나지만

추상 클래스 Person의 객체를 생성은 불가능하다.

 

추상 클래스의 상속

추상 클래스를 단순히 상속을 받는다면 그 서브 클래스는 상속 클래스가 된다.

추상 클래스의 추상 메소드를 그대로 상속받기 때문이다.

그러므로 아래 코드처럼 서브 클래스에도 abstract를 붙여 추상 클래스임을 명시해야 컴파일 에러가 안 난다.

abstract class Person{

    public abstract void Speak();
}

abstract class Student extends Person{
    
}

 

추상 클래스를 상속받아 사용하려면,

 

서브 클래스에서 추상 클래스의 상속과 동시에 그 추상 메소드를 오버라이딩하여 실행 가능한 코드를 작성해야 한다.

abstract class Person{

    public abstract void Speak();
}

class Student extends Person{
    
    @Override
    public void Speak()
    {
        System.out.println("학생입니다.");
    }

}

 

추상 클래스는 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스 역할을 하며,

추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.

또한 설계와 구현을 분리할 수 있어 구현 작업이 쉬워지고 계층적 상속 관계를 가지는 구조를 만들 때 적합하다.

추상 클래스를 받은 서브클래스는 추상 메소드를 꼭 구현해야 객체를 만들 수 있다.(강제)

 

Comments