본문 바로가기
JAVA/객체지향

자바 추상클래스 의미, 구현 방법 (abstract class)

by 스코리아 2023. 9. 8.

안녕하세요, 스코리아입니다.

오늘은 자바 추상 클래스의 의미와 구현방법에 대해서 알아보겠습니다.

 

추상 (abstract)이란?

  • 어원적 의미: 실체들 간에 공통되는 특성을 추출한 것
  • 예: 삼성, 현대, LG를 통틀어 "회사"라 함

추상 클래스 (abstract class)란?

  • 실체 클래스(객체를 만들어 사용할 수 있는 클래스)들의 공통되는 필드와 메소드를 정의한 클래스
  • 추상 클래스는 실체 클래스의 부모 클래스 역할을 할 수 있음 (실체 클래스 -> 상속-> 추상 클래스)

자바 추상 클래스

추상 클래스 특징

  • 구현 코드 없이 메소드의 선언만 있는 추상 메소드(abstract method)를 포함한 클래스
  • abstract 예약어 사용
  • 추상 클래스는 단독으로 객체를 생성할 수 없고, 부모 클래스로만 사용 가능 (인스턴스화 불가)
  • 메소드 선언(declaration) : 반환타입, 메소드 이름, 매개변수로 구성
  • 메소드 정의(definition) : 메소드 구현(implementation)과 동일한 의미 구현부(body)를 가짐 ({ })

추상 클래스 용도

  • 실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적
    • 실체 클래스를 설계하는 사람이 여러 명이면, 실체 클래스마다 메소드가 제각기 다른 이름을 가질 수 있음 (이름을 통일하면 편리)
  • 실체 클래스를 작성할 때 시간을 절약
    • 실체 클래스는 추가적인 필드와 메소드만 선언하면 됨
  • 실체 클래스 설계 규격을 만들 때 유용
    • 실체 클래스가 가져야 할 필드와 메소드를 추상 클래스에 미리 정의해 놓고 실체 클래스는 추상 클래스를 무조건 상속받아 작성

추상 클래스 구현하기

Animal 클래스를 추상 클래스로 정의하고, 그 하위 클래스로 Cat, Dog 클래스를 만들어봅시다.

Animal 클래스를 만들어보겠습니다.

  • kind 이름의 String 타입 필드와 breathe 이름의 메소드, 그리고 sound 이름의 추상 메소드를 정의해 주겠습니다.
  • breath는 추상 메소드가 아닌 일반적인 메소드입니다.
  • 추상 메소드를 정의하기 위해 sound 메소드abstract 키워드를 붙여줍니다. (추상 메소드에 abstract 키워드를 붙이면 class도 반드시 abstract 타입이어야 합니다)
public abstract class Animal { // 추상 클래스
    public String kind;

    public void breathe() {
        System.out.println("숨 쉬기");
    }

    // 추상 메소드
    public abstract void sound();
}

이제 Cat 클래스를 만들어보겠습니다.

  • 기본 생성자에 Animal 클래스의 kind 필드에 대한 정의를 해주었고, sound 추상 메소드를 오버라이딩(재정의) 해주었습니다.
  • 하위 클래스에서는 무조건 상위 클래스의 모든 추상 메소드를 재정의해야 합니다. 예를 들어 Animal 클래스에 sound 외에 see라는 추상 메소드도 정의해 있다면 해당 메소드도 이곳에 재정의해야 합니다.
public class Cat extends Animal{
    public Cat() {
        this.kind = "포유류";
    }

    // 하위 클래스는 무조건 상위 클래스의 모든 추상 메소드를 재정의해야함
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

 

이번에는 Dog 클래스를 만들어보겠습니다.

  • 기본 생성자에 Animal 클래스의 kind 필드에 대한 정의를 해주었고, sound 추상 메소드를 오버라이딩(재정의) 해주었습니다.
public class Dog extends Animal{
    public Dog() {
        this.kind = "포유류";
    }

    // 하위 클래스는 무조건 상위 클래스의 모든 추상 메소드를 재정의해야함
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

위 클래스들을 테스트해 보기 위해 AnimalExample 클래스를 만들어보겠습니다.

public class AnimalExample {
    public static void main(String[] args) {
        // Animal animal1 = new Animal(); // abstract 추상 클래스는 인스턴스화 불가능

        // Dog 타입, Cat 타입
        Dog dog = new Dog();
        Cat cat = new Cat();

        dog.sound();
        cat.sound();
        System.out.println("-----------");

        // Animal 타입으로 자동타입변환
        Animal animal = new Dog();
        animal.sound(); // dog sound

        animal = new Cat();
        animal.sound(); // cat sound

        System.out.println("-----------");
        animalSound(new Dog());
        animalSound(new Cat());
    }

    // animal에는 어떤 타입도 올 수 있음 : Dog 혹은 Cat 타입 (다형성)
    public static void animalSound(Animal animal) {
        animal.sound(); // dog 혹은 cat
    }
}
  1. (중요) new Animal()처럼 abstract 추상 클래스 인스턴스화 불가합니다.
  2. Dog 타입, Cat 타입으로 하여금 인스턴스를 각각 생성해 보고 sound 메소드를 각각 호출해 보았습니다.
  3. Animal 타입으로 자동타입변환된 인스턴스를 각각 생성해 보고 sound 메소드를 각각 호출해 보았습니다. (2와 동일한 결과 출력)
  4. animalSound 이름을 가진 static void 메소드를 생성하였고, 매개변수로 Animal(부모 추상 클래스) 타입이 들어갔습니다. 이럴 경우 animal에는 Dog 혹은 Cat 타입이 들어올 수 있습니다. 그리고 sound 메소드를 호출하였습니다. (다형성의 성질 : https://skorea6.tistory.com/26 )
  5. Dog와 Cat 인스턴스를 매개변수로 하여금 animalSound 메소드를 호출해 보았습니다.

자바 추상클래스 예제 - 실행결과

추상 클래스 구현시 특징

  • 메소드에 구현 코드가 없으면 abstract로 선언
  • abstract로 선언된 메소드를 가진 클래스는 abstract로 선언
  • 모든 메소드가 구현된 클래스라도 abstract로 선언된 클래스라면 인스턴스화 불가
  • 추상 클래스의 추상 메소드는 하위 클래스가 상속하여 전부 구현해야 함

 

이렇게, 추상 클래스에는 메소드의 선언부만 작성하고 (추상메소드) 실체 클래스에서는 메소드의 실행 내용을 작성합니다. (오버라이딩)

그리고 abstract를 사용하면, 공통되는 필드와 메소드를 분류하고 정의해 줄 수 있습니다.

 


지금까지 자바(Java)의 추상 클래스 의미와 구현 방법에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.