본문 바로가기

JAVA/혼공자

[혼공자] Chapter 07-3 추상 클래스

▶ 추상 클래스란?
정의 : 실체 클래스의 공통된 특징을 추출하여 선언한 클래스
cf. 사전상 정의보다 특징이 더 중요한 개념 같다.

Q. 추상 클래스가 필요한 이유?
① 필드와 메소드 이름 통일
기능이 동일함에도 이름이 다른 경우, 사용 방법이 달라서 복잡해진다.
Ex. 이름이 다르므로, 메소드에 넣는 부분도 다르게 작성해줘야 함
이때, 동일한 클래스를 상속한다면 메소드 이름을 통일할 수 있다.
Ex. Cat 클래스의 소리 함수 : meow( ) / Dog 클래스의 소리 함수 : woof( ) 처럼 이름이 따로 있는 것보다
Cat, Dog 모두 Animal 클래스를 상속하게 하면 void makeSound(Animal ani){ani.sound( );} 처럼
공통된 함수를 사용할 수 있어 통일감 있다.

② 클래스를 작성하는 시간 절약
추상 클래스에서 추가되는 부분만 작성하면 되므로 시간 절약된다.

③ 실체 클래스의 설계 규칙 지정
추상 클래스 내부의 추상 메소드는 반드시 구현을 해야 하므로 (구현 안하면 컴파일에러)
통일된 규격으로 클래스를 구현할 수 있다.

⭐추상 클래스 철학⭐
실체 클래스의 규격 제시를 위해 필수 멤버를 모아두었지만, 
구체적인 것은 정의하지 않아 (ex. 추상 메소드)
상속을 통해서 자손 클래스에서 완성되도록 유도한다.

따라서 추상 클래스는 추상 메소드를 포함하고 있어야 하고, (없어도 되긴 하지만, 있는게 큰 특징)
실체 클래스의 부모이며, 상속을 위한 것이므로 생성자로 객체를 만들 수 없다. 
또한 '상속을 통해 완성'하게 하는 철학에 맞게 
추상 클래스를 상속받는 실체 클래스는 추상 메소드를 반드시 재정의 해야 한다.

즉, 추상 클래스의 목적은 ① 설계 규격 제시, ② 추상 메서드 재정의 강요이다. 
따라서 추상 클래스를 '미완성 설계도'로 비유하기도 한다.

▶ 정리 : 추상 클래스 특징
- 클래스 선언부의 class 앞에 abstract 키워드를 붙인다.
- 하나 이상의 추상 메소드를 포함하고 있어야 한다.
  추상 메소드가 없는 추상 클래스도 문법상 만들 수 있긴 하지만,
  메소드 오버라이딩을 강제할 수 없으므로 '추상 클래스'라는 본질에서 벗어난다.
- 상속만을 위한 클래스이기 때문에 new 생성자( )를 통해서 객체를 만들지 못한다.
- 필드, 생성자, 메소드를 가질 수 있다.

▶ 추상 메소드
필요한 이유 : 반드시 구현해야 하는 메소드이고, 메소드의 이름은 같아야 하나, 내부 구현은 달라야 하는 경우가 있다. 
Ex. sound( ) 함수는 반드시 구현되어야 하지만, 동물에 따라 내부 구현이 달라야 한다.

추상 클래스에는 선언부만 존재하고 구현부는 존재하지 않는다.
리턴 타입 앞에 abstract 키워드를 넣고{ }를 없애고 세미콜론을 붙이면 추상 메소드를 선언할 수 있다. 

문법 : 접근 제한자 abstract 리턴 타입 메소드명( );

실체 클래스에서 오버라이딩할 때는 abstract 키워드를 없애고 { } 부분을 작성하면 된다.
실체 클래스가 추상 메소드를 오버라이드 하지 않으면 컴파일 에러가 발생한다.

 

abstract class Animal{
	public String kind;
	public void there() {System.out.println("어떤 동물이 있습니다.");}
	public abstract void sound(); // 추상 메소드
}

class Cat extends Animal{
	@Override
	public void sound() {System.out.println("야옹~");} // 추상 메소드 재정의
}

class Dog extends Animal{
	@Override
	public void sound() {System.out.println("멍멍!");} // 추상 메소드 재정의
}


public class AnimalExample {

	public static void main(String[] args) {
		Dog dog = new Dog();
		Cat cat = new Cat();
		
		dog.sound();
		cat.sound();
	}
}

 

※ 헷갈림 정리
- 추상 클래스에 반드시 추상 메서드가 있어야 하는 건 아니다. 하지만 추상 메서드가 없는 추상 클래스는 그 본질에서 벗어나기 때문에 일반적으로 '추상 클래스는 하나 이상의 추상 메서드를 갖는다'라고 하는 것이다.
- 추상 메서드는 추상 클래스 뿐 아니라 인터페이스에서도 선언된다.
- 추상 클래스와 메서드는 반드시 abstract 키워드가 필요하고, 추상 메서드는 구현부 없이 세미콜론으로 끝난다.