추상 클래스란?
객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 합니다. 즉, 추상 클래스는 실체 클래스와 상속의 관계를 가지고 있으며 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스가 추상 클래스의 특성을 물려받아 추가적인 특성을 가질 수 있도록 합니다. 또한, 추상 클래스는 직접 객체화할 수 없으며, 단일 상속만 허용합니다.
추상 클래스를 사용하는 주요 이유는 다음 두 가지입니다.
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("야옹");
}
}
간단하게 추상 클래스를 구현하고 실체화 했으니 이제 사용방법에 대해서 알아보겠습니다.
첫 번째로 실체 클래스인 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();
}
}
위 예제처럼 추상 클래스를 상속한 실체 클래스는 공통된 메소드와 속성을 가지면서도 자신만의 고유한 기능을 구현할 수 있습니다. 다형성을 통해 부모 클래스 타입으로 자식 클래스 객체를 다룰 수 있으므로, 추상 클래스는 유연하고 확장 가능한 코드 설계에 큰 도움이 됩니다. 이러한 장점 덕분에 추상 클래스는 객체지향 프로그래밍에서 매우 중요한 설계 기법으로, 다양한 상황에 맞춰 쉽게 확장할 수 있는 코드 구조를 만드는데 유용하게 활용됩니다.
'Java' 카테고리의 다른 글
[Java] final 필드, 메소드, 클래스 (0) | 2024.10.30 |
---|---|
[Java] 인터페이스란 무엇인가? (0) | 2024.10.30 |
[Java] 객체 지향 프로그래밍(OOP)의 4가지 특징과 원칙(SOLID) (0) | 2024.10.29 |
[Java] 자바 가상 머신(JVM)란 무엇인가? (2) | 2024.10.29 |
[Java] 이것이 자바다 - 상속 (1) | 2023.07.04 |