회원가입

추상 클래스 - 1

Beany 2024-10-14

ChatGPT 요약

추상 클래스는 실제 생성되면 안 되는 클래스로 상속을 목적으로 사용되며, 추상 메서드는 반드시 오버라이딩해야 하는 메서드이다. 추상 클래스와 추상 메서드는 이름 그대로 추상적인 개념을 제공하며, 직접 생성하거나 실행할 수 없다. 자식 클래스에서 오버라이딩하여 사용해야 하며, 이를 통해 실수를 방지할 수 있다. 추상 클래스와 추상 메서드는 일반 클래스 및 메서드와 동일하게 동작한다.

추상클래스


동물(Animal) 과 같이 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스추상 클래스라 한다.

추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다. 따라서 실체인 인스턴스가 존재하지 않는다. 대신에 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.

abstract class AbastractAniaml {...}
  • 추상 클래스는 클래스를 선언할 때 앞에 추상이라는 의미의 abstract 키워드를 붙여주면 된다.
  • 추상 클래스는 기존 클래스와 완전히 같다. 다만 new AbstractAnimal() 와 같이 직접 인스턴스를 생성하지 못하는 제약이 추가된 것이다.

 

 

추상 메서드


부모 클래스상속 받는 자식 클래스반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라 한다.

추상 메서드는 이름 그대로 추상적인 개념을 제공하는 메서드이다. 따라서 실체가 존재하지 않고, 메서드 바디가 없다.

public abstract void sound();
  • 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미의 abstract 키워드를 붙여주면 된다.
  • 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다.
    • 그렇지 않으면 컴파일 오류가 발생한다.
    • 추상 메서드는 메서드 바디가 없다. 따라서 작동하지 않는 메서드를 가진 불완전한 클래스로 볼 수 있다. 따라서 직접 생성하지 못하도록 추상 클래스로 선언해야 한다.
  • 추상 메서드상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 한다.
    • 그렇지 않으면 컴파일 오류가 발생한다.
    • 추상 메서드는 자식 클래스가 반드시 오버라이딩 해야 하기 때문에 메서드 바디 부분이 없다. 바디 부분을 만들면 컴파일 오류가 발생한다.
  • 추상 메서드는 기존 메서드와 완전히 같다. 다만 메서드 바디가 없고, 자식 클래스가 해당 메서드를 반드시 오버라이딩 해야 한다는 제약이 추가된 것이다.

 

 

추상 클래스 & 추상 메서드


이제 추상 클래스와 추상 메서드를 사용해서 예제를 만들어보자.

package poly.ex3;

public abstract class AbstractAnimal {
    public abstract void sound();

    public void move() {
        System.out.println("Animal move");
    }
}
  • AbstractAnimal abstract 가 붙은 추상 클래스이다. 이 클래스는 직접 인스턴스를 생성할 수 없다.
  • sound() abstract 가 붙은 추상 메서드이다. 이 메서드는 자식이 반드시 오버라이딩 해야 한다.

이 클래스는 move() 라는 메서드를 가지고 있는데, 이 메서드는 추상 메서드가 아니다. 따라서 자식 클래스가 오버라이딩 하지 않아도 된다.

package poly.ex3;

public class Dog extends AbstractAnimal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}
package poly.ex3;

public class Cat extends AbstractAnimal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}
package poly.ex3;

public class Caw extends AbstractAnimal {
    @Override
    public void sound() {
        System.out.println("음메");
    }
}
package poly.ex3;

public class AbstractMain {
    public static void main(String[] args) {
        // AbstractAnimal animal = new AbstractAnimal(); // 추상 클래스로 객체 생성 불가
        AbstractAnimal[] animals = {new Dog(), new Cat(), new Caw()};

        for (AbstractAnimal animal : animals) {
            animal.sound();
            animal.move();
        }
    }
}
멍멍
Animal move
야옹
Animal move
음메
Animal move

지금까지 설명한 제약을 제외하고 나머지는 모두 일반적인 클래스와 동일하다. 추상 클래스는 제약이 추가된 클래스일 뿐이다. 메모리 구조, 실행 결과 모두 동일하다.

 

정리


추상 클래스 덕분에 실수로 Animal 인스턴스를 생성할 문제를 근본적으로 방지해준다.

추상 메서드 덕분에 새로운 동물의 자식 클래스를 만들때 실수로 sound() 오버라이딩 하지 않을 문제를 근본적으로 방지해준다.

0 0
JAVA
이 공간은 개인 공부를 통해 얻은 정보를 체계적으로 정리하고 공유하는 곳입니다. 학습한 내용, 발견한 지식, 그리고 문제 해결 방법 등을 기록하여 나만의 학습 자료를 구축하고, 필요할 때 쉽게 참고할 수 있는 유용한 자원으로 활용할 수 있도록 합니다.
Yesterday: 456
Today: 208