본문 바로가기

BE/JAVA

[JAVA] 자바 추상 클래스 기본 및 활용

목차 
1) 추상화란? 
2) 추상 클래스란?
3) 추상 클래스 상속 

 

📌 1) 추상화란?  

추상화란 말 그대로 추상적인데요.

추상화의 일반적인 의미는 "여러가지 사물/개념에서 공통되는 특성을 묶어 이름을 붙이는 것"입니다. 

자바에서 프로그래밍적으로 추상화는 공통된 행동, 필드를 묶어 하나의 클래스를 만드는 것을 의미합니다. 

예를 들어 강아지,고양이 등의 "펫"은 먹기/걷기 등의 행동을 하기 때문에 "펫"이라는 추상 클래스를 만들 수 있습니다. 


📌 2) 추상 클래스란? 

추상클래스란, 하나 이상의 추상 메소드를 포함한 클래스를 추상 클래스(abstract class)라고 합니다. 

단 하나 이상의 추상 메서드만 포함하면 되며 생성자, 일반 메서드도 포함 가능합니다.

추상클래스와 인터페이스의 다른 점은 인터페이스는 추상메서드"만" 포함하나,

추상 클래스는 하나의 추상 메서드만 포함하면 추상클래스가 됩니다. 

이 때 추상 메서드란, 함수 선언만 되어있고 구현부가 없는 아래와 같은 메서드를  추상 메서드라고 합니다. 

public abstract class 클래스명();

 

추상 클래스의 일부 다형성 보장 

추상 클래스는 "다형성"을 보장하기 위해 나타난 개념인데요. 

"자식 클래스에서 반드시 재정의가 되어야 된다"는 점에서 다형성이 보장됩니다. 

부모 클래스에서 추상 메서드를 선언하면,  자식 클래스는 부모의 추상적 메서드를 상속받아 메서드를 구현해 그 기능들을 구현 가능한데요. 이 때 부모가 가진 추상 메소드들을 자식 클래스에서 반드시 재정의(오버라이딩)해야 합니다.  즉 부모가 자식에게 명령을 내렸을 때 자식 클래스가 반드시 동작되도록 재정의한다는 점에서 다형성이 보장됩니다. 

 

추상 클래스 선언 방법 

추상 메서드 및 추상 클래스는 "abstract" 키워드로 선언하며, 다음과 같이 선언합니다. 

abstract class 클래스이름 {
    ...
    abstract 리턴타입 메서드이름();
    ...
}

또한 추상 메서드의 경우

자식 클래스에서 구현이 반드시 이뤄줘야 하기때문에 아래와 같이 private 접근제어자는 사용할 수 없습니다.

abstract private void walk(); (불가)

 

[예시] 추상클래스 Pet 예시 

abstract class Pet {
    abstract public void walk();
    abstract public void eat();
    protected void run(){
    	System.out.println("run run");
    }
}

 

📌 3) 추상클래스 상속

추상 클래스도 부모-자식간 상속이 가능한데요. 추상 클래스의 상속 관계에는 어떠한 "구현 의무"가 있습니다. 

부모클래스를 상속 받은 자식 클래스는 반드시 부모의 추상 함수(abstract class)를 구현해야 한다는 점입니다.

부모 추상클래스는 말 그대로 "추상"이므로 객체를 생성할 수 없기 때문에, 자식 클래스에서 그 함수들을 구현 및 구체화해야 합니다.

때문에 부모에서 선언한 추상메서드들을 자식클래스에서 반드시 구현해야 합니다. 

class Dog extends Pet{
    public void walk(){
        System.out.println("Dog walk");
    }
    public void eat(){
    	System.out.println("Dog eat");
    }
}
class Cat extends Pet{
    public void walk(){
        System.out.println("Cat walk");
    }
    public void eat(){
    	System.out.println("Cat eat");
    }
}

 

[적용 예시] 

추상클래스는 객체를 생성할 수 없기에 아래와 같이 자식 객체만 선언 가능합니다.

또한 자식 객체는 부모 클래스의 멤버 함수(protected) 를 호출하여 사용할 수 있습니다. 

public class main
{
    public static void main(String[] args)
    {
        Dog d = new Dog();
        d.eat(); 
        d.walk();
        d.run();

        Cat c = new Cat();
        c.eat();
        c.walk();

    }
}

 

[적용 결과] 

Dog eat
Dog walk
run run
Cat eat
Cat walk
run run