Java

Java) 추상 클래스와 추상 메서드의 이해 및 활용 예제

pogun 2025. 1. 9. 17:07

abstract class : 추상 클래스

: 추상 메서드를 하나 이상 포함하고 있는 클래스

 

abstract method : 추상 함수

: 함수의 내용은 없고 proto type 만 선언되어 있는 함수

// 일반함수
public void method(){
    처리
}

// 추상함수
public abstract void method(int n, double d);

: 추상함수는 무조건 상속한다. 상속한 클래스에서 추상 메서드를 정의해 준 후에 사용이 가능하다.

: 추상함수 형태를 proto type(사양) 이라고 한다.

proto type이 뭐냐?라고 묻는다면 : 리턴값은 int와 double이고 리턴값은 void이다.


추상 클래스와 메서드 사용법

public class MainClass {
    public static void main(String[] args) {
    	// AbstractClass ac = new AbstractClass(); 이렇게 생성은 불가능
    	
        MyClass mycls = new MyClass();
        mycls.abstractMethod();
    }
}

// 추상 클래스
abstract class AbstractClass{

    private String name;  // 멤버변수는 포함할 수 있다.

    public void method(){
        System.out.println("AbstractClass method()");
    }

    // 추상 메서드
    public abstract void abstractMethod();
}
class MyClass extends AbstractClass{

    @Override
    public void abstractMethod() {
        System.out.println("MyClass abstractMethod()");
    }
}

: 추상 클래스와 메서드에 abstract를 붙이면 추상 클래스를 의미한다.

: 추상 클래스를 객체로는 생성이 불가능하다.

: 자식 클래스를 생성 후 자식 클래스를 호출해야한다.

결과값 : "MyClass abstractMethod()"

다른 문법

public class MainClass {
    public static void main(String[] args) {
    	AbstractClass ac = new MyClass();
        ac.method();
        ac.abstractMethod();
    }
}

: 부모와 자식 관계이기 때문에 자식 클래스가 부모를 참조하도록 객체를 생성할 수 있다.

결과값 : "AbstractClass method()", "MyClass abstractMethod()"

다른 문법

public class MainClass {
    public static void main(String[] args) {
    	AbstractClass ac1 = new AbstractClass() {
            @Override
            public void abstractMethod() {
                System.out.println("ac1 abstractMethod()");
            }
        };    // 이렇게 정의를 내려주면 위 코드에 맞는 코드는 ac1 한개
        ac1.method();
        ac1.abstractMethod();
    }
}

: 오버라이드를 하게 되면 "AbstractClass method()" 해당 결과값은 나오게 된다.

: "MyClass abstractMethod()" 해당 값에서 "ac1 abstractMethod()" 오버라이드 된 값으로 변경되어 나온다.

결과값 : "AbstractClass method()", "ac1 abstractMethod()"

Shape 클래스 상속과 다형성 구현 실습

public class MainClass {
    public static void main(String[] args) {
    	
        Rect rect = new Rect(3, 5);
        System.out.println("x * y : " + rect.process());
		
        // 해당 방법으로도 호출 가능
        Shape sh = new Rect(3, 5);
        sh.process();
    }
}

abstract class Shape{
    protected int x, y;

    public Shape(int x, int y){
        this.x = x;
        this.y = y;
    }
    abstract int process();
}

class Rect extends Shape{
    public Rect(int x, int y){
        super(x, y);
    }

    @Override
    public int process() {
        return(x * y);
    }

}

: 마찬가지로 부모 클래스 타입을 사용해서도 호출 가능( Shape sh = new Rect(3, 5) )

결과값 : x * y : 15