안녕하세요, 스코리아입니다.
오늘은 자바 추상 클래스의 의미와 구현방법에 대해서 알아보겠습니다.
추상 (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
}
}
- (중요) new Animal()처럼 abstract 추상 클래스는 인스턴스화가 불가합니다.
- Dog 타입, Cat 타입으로 하여금 인스턴스를 각각 생성해 보고 sound 메소드를 각각 호출해 보았습니다.
- Animal 타입으로 자동타입변환된 인스턴스를 각각 생성해 보고 sound 메소드를 각각 호출해 보았습니다. (2와 동일한 결과 출력)
- animalSound 이름을 가진 static void 메소드를 생성하였고, 매개변수로 Animal(부모 추상 클래스) 타입이 들어갔습니다. 이럴 경우 animal에는 Dog 혹은 Cat 타입이 들어올 수 있습니다. 그리고 sound 메소드를 호출하였습니다. (다형성의 성질 : https://skorea6.tistory.com/26 )
- Dog와 Cat 인스턴스를 매개변수로 하여금 animalSound 메소드를 호출해 보았습니다.
추상 클래스 구현시 특징
- 메소드에 구현 코드가 없으면 abstract로 선언
- abstract로 선언된 메소드를 가진 클래스는 abstract로 선언
- 모든 메소드가 구현된 클래스라도 abstract로 선언된 클래스라면 인스턴스화 불가
- 추상 클래스의 추상 메소드는 하위 클래스가 상속하여 전부 구현해야 함
이렇게, 추상 클래스에는 메소드의 선언부만 작성하고 (추상메소드) 실체 클래스에서는 메소드의 실행 내용을 작성합니다. (오버라이딩)
그리고 abstract를 사용하면, 공통되는 필드와 메소드를 분류하고 정의해 줄 수 있습니다.
지금까지 자바(Java)의 추상 클래스 의미와 구현 방법에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
'JAVA > 객체지향' 카테고리의 다른 글
자바 인터페이스 의미, 특징, 선언, 구현 방법 (interface) (1) | 2023.09.21 |
---|---|
자바 강제타입변환(다운케스팅 형변환) 의미, 사용방법 (2) | 2023.09.06 |
자바 다형성 의미, 사용방법 (feat.객체지향) (1) | 2023.09.02 |
자바 메소드 재정의 의미, 사용방법 (@Override) (2) | 2023.08.31 |
자바 자동타입변환(업케스팅 형변환) 의미, 사용 방법 (2) | 2023.08.29 |