Programming/Java

[Java 자바] 7. 상속 ③ 추상클래스 (Abstract Class)

erinh 2022. 8. 8. 21:45
반응형

7-8. 추상 클래스

7-8-1. 추상 클래스의 개념

자식클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드로 선언부만 존재하며, 구현부는 작성되어 있지 않음
- 이 구현부를 자식클래스에서 오버라이딩해서 사용
- 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위해 사용
- 상속 전용 클래스

7-8-2. 추상 클래스의 용도

1) 실체 클래스들의 공통된 필드와 메소드의 이름 통일 목적

- 실체 클래스를 설계하는 사람이 여럿일 경우, 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있음
(ex. 소유자의 이름을 저장하는 필드를 Telephone에서는 owner, Smartphone에서는 user 라고 할 수 있음)

2) 실체 클래스를 작성할 때 시간을 절약

- 공통적인 필드와 메소드를 추상클래스에 선언해두고, 실체 클래스마다 다른점만 선언하여 사용함으로써 시간 절약 가능
- 클래스를 어떤 구조로 작성해야 하는지 알려줌으로써 구체적인 클래스를 만들 수 있음

7-8-3. 추상 클래스 선언

클래스 선언에 abstract 키워드를 붙여 선언 가능하며, 이 경우 new 연산자를 통한 객체 생성은 불가능
- 단, 자식클래스에서 객체 생성을 할 때 super(...)를 호출하여 추상 클래스 객체를 생성하므로, 추상 클래스도 생성자가 있어야 함

public abstract class Animal {
  // 필드
  public int age;
  
  // 생성자
  // 자식 객체가 생성될 때 super(..)를 호출해서 추상 클래스 객체를 생성하므로 생성자가 반드시 있어야 함
  public Animal(String name) {
    this.name = name;
  }
  
  // 메소드
  public void eat() {
    System.out.println("음식을 먹는다.");
  }
}

7-8-4. 추상 메소드와 오버라이딩

//Animal.java
public abstract class Animal {
  public abstract void sound();
}

// Dog.java
public class Dog extends Animal {
  @Override
  public void sound() {
    System.out.println("멍멍");
  }
}

// Cat.java
public class Cat extends Animal {
  @Override
  public void sound() {
    System.out.println("야옹");
  }
}

// AnimalTest.java
public class AnimalTest {

  public static void main(String[] args) {
    Dog dog = new Dog();
    Cat cat = new Cat();
    dog.sound();
    cat.sound();
    System.out.println(dog.kind);
    System.out.println("----");
    
    // 상위클래스 타입으로 자식을 참조할 수는 있음
    Animal animal = null;
    animal = new Dog();
    animal.sound();
    animal = new Cat();
    animal.sound();
  }
}
반응형