[Day 5| Java] 추상 클래스

y♡ding·2024년 10월 18일
0

데브코스 TIL

목록 보기
24/163

📌 추상 클래스 및 추상 메서드

💡 개념

  • 추상 클래스불완전한 클래스로, 일부 메서드가 구현되지 않고 이름만 선언된 상태로 존재한다. 이 클래스는 상속을 통해 자식 클래스에서 구현을 강제한다.
  • 추상 메서드구체적인 구현이 없는 메서드로, 메서드의 선언부만 있고 실행 코드가 없다. 자식 클래스에서 이 추상 메서드를 반드시 오버라이딩해야 한다.
abstract class Parent2 {
    void viewData1() {
        System.out.println("Parent2 viewData1() 호출");  // 일반 메서드
    }

    abstract void viewData2();  // 추상 메서드
}
  • 추상 클래스는 직접적으로 객체를 생성할 수 없다. 반드시 자식 클래스가 이를 상속받아 추상 메서드를 구현해야만 객체를 생성할 수 있다.
  • 추상 메서드가 없는 추상 클래스도 존재할 수 있다. 이 경우 추상 클래스는 자식 클래스에서 추상 메서드를 강제하지 않지만, 객체 생성은 불가능하며, 상속을 통한 코드 구조 통일을 목적으로 사용한다.

🤞🏻 특징

  • 추상 메서드를 하나 이상 가질 수 있다. (단, 모든 메서드가 추상적일 필요는 없다.)
  • 객체를 직접 생성할 수 없다.
  • 상속을 통해서만 사용된다.
  • 추상 클래스는 다른 일반 메서드나 필드도 포함할 수 있다.

🤷🏻‍♀️ 왜 추상 클래스를 사용하는가?

  1. 공통된 필드와 메서드 통일
    • 추상 클래스에서 미리 정의된 필드와 메서드는 자식 클래스에서 동일한 방식으로 사용해야 하므로, 유지보수와 코드의 일관성을 높일 수 있다.
  2. 구현 시간 절약
    • 추상 클래스를 상속받으면, 이미 정의된 공통 필드와 메서드를 자동으로 상속받아 자식 클래스에서 필요한 부분만 추가 구현하면 된다. 코드 재사용성을 높이고 구현 시간을 절약할 수 있다.
  3. 규격에 맞는 구현 강제
    • 추상 클래스를 상속받은 자식 클래스는 추상 메서드를 반드시 구현해야 한다. 구현을 강제함으로써 코드 수정시, 영향도를 적게 가져가면서 유지보수성을 높일 수 있다.

👯 추상 클래스와 실체 클래스의 관계

  • 실체 클래스: 객체를 직접 생성할 수 있는 구체적인 클래스이다. 추상 클래스에서 상속받은 추상 메서드를 모두 오버라이딩하여 실체화된다.
  • 추상 클래스: 실체 클래스들의 공통적인 특성을 추출해 만든 불완전한 클래스이다. 객체를 직접 생성할 수 없으며, 상속을 통해 실체 클래스가 구현한다.

👨‍👩‍👧 추상 클래스의 상속

  • 추상 클래스는 상속을 전제로 한 클래스이다. 상속 없이 단독으로는 의미가 없으며, 상속 관계를 통해서만 사용된다.
  • 추상 클래스에서 상속받은 자식 클래스가 추상 메서드를 구현하지 않으면 그 자식 클래스도 추상 클래스가 된다.
abstract class Parent {
    abstract void method1();
}

abstract class Child extends Parent {
    // 추상 메서드를 구현하지 않으면 이 클래스도 추상 클래스가 됨
}

class GrandChild extends Child {
    // 오버라이딩하여 추상 메서드를 구현
    void method1() {
        System.out.println("GrandChild method1 호출");
    }
}

즉, 추상 클래스는 구체적인 구현이 자식 클래스에서 완성되므로, 객체화하려면 자식 클래스에서 추상 메서드를 반드시 구현해야 한다.


예시 코드

abstract class Parent2 {
    Parent2() {
        System.out.println("Parent2 생성자 호출");
    }

    void viewData1() {
        System.out.println("Parent2 viewData1() 호출");  // 일반 메서드
    }

    abstract void viewData2();  // 추상 메서드
}

class Child2 extends Parent2 {
    Child2() {
        System.out.println("Child2 생성자 호출");
    }

    @Override
    void viewData2() {
        System.out.println("Child2 viewData2() 호출");
    }
}

public class AbstractMainEx01 {
    public static void main(String[] args) {
        // Parent2 p2 = new Parent2();  // 추상 클래스는 객체화 불가
        Child2 c2 = new Child2();  // 자식 클래스는 객체 생성 가능
        c2.viewData1();  // 상속받은 일반 메서드 호출
        c2.viewData2();  // 자식 클래스에서 오버라이딩된 추상 메서드 호출
    }
}
  • 추상 클래스객체를 직접 생성할 수 없고, 자식 클래스가 추상 메서드를 구현해야만 객체를 생성할 수 있다.
  • 추상 클래스 내의 일반 메서드자식 클래스에서 그대로 사용할 수 있다.

  1. 추상 메서드구체적인 구현이 없는 메서드로, 자식 클래스에서 구현을 강제한다.

  2. 추상 클래스는 불완전한 클래스로, 구현되지 않은 추상 메서드를 포함할 수 있으며, 객체 생성이 불가능하다.

  3. 추상 클래스를 상속받은 자식 클래스추상 메서드를 반드시 구현해야 하며, 그렇지 않으면 그 자식 클래스도 추상 클래스가 된다.

  4. 추상 클래스는 공통된 필드와 메서드를 정의하고, 자식 클래스에서 구현해야 할 부분만 추상 메서드로 선언하여 상속을 통한 코드 재사용성유지보수성을 높인다.

0개의 댓글

관련 채용 정보