본문 바로가기

Java

[Java] 이것이 자바다 - 추상 클래스

추상클래스란?

객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 즉 추상클래스는 실체 클래스와 상속의 관계를 가지고 있으며 추상클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체클래스가 추상클래스의 특성을 물려받아 추가적인 특성을 가질수 있게 된다. 그리고 추상 클래스는 단일 상속만 가능하다.

 

추상클래스를 사용하는 이유는 두가지가 있다.

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

실체 클래스를 설계하는 사람이 여러 사람일 경우 같은 기능을 가진 메소드를 구현하면서도 메소드 이름을 다르게 설정하여 객체마다 사용 방법이 달리질 수 있다. 이를 방지 하기 위하여 추상클래스에 메소드를 구현하고 추상클래스를 상속받아 사용함으로써 자식 클래스에서 구현하는 메소드의 이름을 통일할 수 있다.

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

하나의 추상클래스에 필드와 메소드를 선언하고 여러 실체 클래스에서 이 추상클래스를 상속받아 사용하기 때문에 실체 클래스에서 또 다시 필드나 메소드를 선언할 필요가 없다. 이렇게 하면 실체 클래스를 작성하는 시간을 절약할 수 있고 개발자들의 실수를 줄일 수 있다.

추상클래스 선언 및 사용법

추상클래스는 아래와 같이 클래스를 선언할때 abstract 키워드를 붙여야 한다.

메소드도 마찬가지로 abstract 키워드를 붙여 구현하고 중괄호를 쓰지 않는다.

public abstract class Animal {
    public String kind;
    
    public void breathe() {
    	System.out.println("울음 소리");
    }
    
    public abstract void sound();
}

추상 클래스를 상속 받는 실체클래스를 구현한다.

추상 클래스에서 구현한 추상 메소드를 Override하여 재정의 한다.

public class Dog extends Animal {
    public Dog() {
    	this.kind = "포유류";
    }
    
    @Override
    public void sound() {
    	System.out.println("멍멍");
    }
}
public class Cat extends Animal {
    public Cat() {
    	this.kind = "포유류";
    }
    
    @Override
    public void sound() {
    	System.out.println("야옹");
    }
}

아래와 같이 객체를 생성하여 메서드를 호출하는데 책에서는 총 3가지 방법으로 표현해 놓았다.

첫 번째로 Dog와 Cat 변수로 호출했고, 두 번째는 Animal 변수로 자동 타입 변환하여 sound() 메소드를 호출했다. 세 번째는 부모 타입의 매개 변수에 자식 객체를 대입하여 메소드의 다형성을 적용했으며 세가지 방법 모두 같은 결과를 출력한 것을 확인할 수 있다.

참고로 자식 타입은 부모 타입으로 자동 타입 변환 될수 있다. 

public class AnimalExample {
    public static void main(String[] args) {
    	Dog dog = new Dog();
        Cat cat = new Cat();
        
        dog.breathe();
        dog.sound();
        cat.breathe();
        cat.sound();
        
        System.out.println("-------");
        
        Animal animal = null;
        animal = new Dog();
        animal.breathe();
        animal.sound();
        
        animal = new Cat();
        animal.breathe();
        animal.sound();
        
        System.out.println("-------");
       	
        animalSound(dog);
        animalSound(cat);
    }
    
    public static void animalSound(Animal animal) {
    	animal.breathe();
    	animal.sound();
    }
    
}