JAVA/JAVA기본
JAVA - 추상 클래스란?
realizers
2022. 1. 16. 00:53
728x90
반응형
추상 클래스
- 하나 이상의 추상 메서드를 포함하는 클래스입니다.
- 추상 메서드란 선언부만 존재하며 본체는 없는 함수입니다.
- 해당 메서드 앞에 abstract 라는 키워드를 붙이며 추상 메서드가 포함되어 있다면 클래스 또한 추상 클래스이어야 하므로 클래스명 앞에 abstract 키워드가 있어야 합니다.
- 어떠한 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하지 않는다면 자식 클래스 또한 추상 클래스가 되어야 합니다.
- 객체를 생성할 수 없다는 점을 제외하고는 일반 클래스와는 다른점이 없으며, 멤버 변수와 일반 메서드를 가질 수 있습니다.
// 객체 생성 불가능
Animal animal = new Animal();
추상 클래스의 목적
추상 클래스는 일반 클래스와 달리 객체를 생성할 수 없다고 했는데 어떠한 목적을 가지고 있는지 살펴보자
- 공통된 필드와 메소드를 통일하는 용도
- 여러명의 개발자들이 Animal을 상속 받아 각자만의 실체 클래스를 구현하게 되면 각 개발자마다 변수명과 메서드명은 각각 다른 이름으로 구현이 될것입니다. 이렇게 되면 나중에 유지보수가 힘들고 통일성이 없게됩니다.
- 실체 클래스 구현시 시간을 절약한다.
- 동물에 대한 클래스를 구현해야하는데 어떤 동물일지 모를 경우 동물 추상 클래스를 상속받으면 동물에 대한 공통적인 필드와 메서드만 구현을 하면된다. 이때 오버라이딩을 하여 구현에 집중을 할 수 있습니다.
- 규격에 맞는 실체 클래스 구현
- 설계를 담당하시는 개발자분께서 규격에 맞는 구현 클래스를 작성하게 되면 해당 규격에 맞는 구현 클래스를 작성할 수 있습니다.
추상 클래스 사용 방법
- 추상 메서드는 접근 지정자로 private를 사용할 수 없는데 그 이유는 구현을 강제화하는데 자식 클래스에서 구현을 할 수 없기때문입니다.
- public, protected는 사용할 수 있고 생략을 한다면 default(같은 패키지에서만 접근 가능)가 됩니다.
- dog, cat1, cat2 객체를 생성할때마다 추상 클래스의 생성자 호출 후 자식 클래스의 생성자 호출됨
- super()메서드
public abstract class Animal {
// 멤버 변수
public String name;
public int age;
// 생성자
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 일반 메서드
public void breath(){
System.out.println("숨을 쉰다.");
}
// 추상 메서드
abstract void sound();
}
public class Dog extends Animal{
public Dog(String name, int age) {
super(name, age);
}
@Override
void sound() {
System.out.println("멍멍!");
}
}
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
}
@Override
void sound() {
System.out.println("야옹 야옹!");
}
}
public class Example {
public static void main(String[] args) {
Animal dog = new Dog("코코", 2);
Animal cat1 = new Cat("나비", 1);
Animal cat2 = new Cat("톰", 3);
// 이름 : 코코, 나이 : 2
System.out.println("이름 : " + dog.name + ", 나이 : " + dog.age);
// 이름 : 나비, 나이 : 1
System.out.println("이름 : " + cat1.name + ", 나이 : " + cat1.age);
// 이름 : 톰, 나이 : 3
System.out.println("이름 : " + cat2.name + ", 나이 : " + cat2.age);
dog.breath(); // 숨을 쉰다.
dog.sound(); // 멍멍!
cat1.breath(); // 숨을 쉰다.
cat1.sound(); // 야옹 야옹!
cat2.sound(); // 야옹 야옹!
}
}
추상 클래스의 메서드 구현 강제화
- 추상 클래스에서 추상 메서드를 선언했다면 추상 클래스를 상속 받는 자식 클래스에서 추상 메서드는 반드시 구현을 해야하지만 일반 메서드는 필요시에 구현을 하면 됩니다.
- Animal을 상속받은 Cat 클래스는 일반 메서드인 breath는 구현을 하지 않은것을 확인할 수 있습니다.
public abstract class Animal {
// 멤버 변수
public String name;
public int age;
// 생성자
public Animal(String name, int age) {
System.out.println("추상 클래스의 생성자 호출");
this.name = name;
this.age = age;
}
// 일반 메서드
public void breath(){
System.out.println("숨을 쉰다.");
}
// 추상 메서드
abstract void sound();
}
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
System.out.println("자식 클래스의 생성자 호출");
}
@Override
void sound() {
System.out.println("야옹 야옹!");
}
}
728x90
반응형