[Java] 다시 정리하는 "추상 클래스"

rara_kim·2022년 12월 5일
0

Java

목록 보기
37/39

추상클래스란?

객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다.
추상 클래스와 실체 클래스는 상속의 관계를 가지고 특성을 물려받고, 추가적인 특성을 가질 수 있다.

여기서 특성이란 필드메소드들을 말한다.
예를 들어 Bird 클래스, Fish 클래스 의 실체 클래스에서 공통되는 필드와 메소드를 따로 선언한 Animal 클래스를 만들 수 있는데, 이것이 바로 추상 클래스이다.

추상 클래스의 용도

1️⃣공통된 필드와 메소드의 이름을 통일할 목적

실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.
데이터와 기능이 모두 동일함에도 불구하고 이름이 다르다 보니, 객체마다 사용 방법이 달라진다.
이 방법 보다는 추상클래스에 필드와 메소드는 선언하고, 상속함으로써 이름을 통일할 수 있다.

2️⃣실체 클래스를 작성할 때 시간 절약

공통적인 필드와 메소드는 추상 클래스에 모두 선언해두고, 다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는 데 시간을 절약할 수 있다.

예를 들어, 자동차를 설계할 때에는 일반적인 타이어 규격에 맞추어서 작성해야 한다.
즉, 특정한 타이어만 사용할 수 있도록 자동차를 설계하지는 않는다는 것이다.
이는 일반적인 타이어 규격을 준수하는 타이어는 어떠한 것이든 부착할 수 있도록 하기 위해서 이다.

여기서 타이어 규격은 타이어의 추상 클래스라고 볼 수 있고, 다이어 규격을 준수하는 한국 타이어나 금호 타이어는 추상 클래스를 상속하는 타이어의 실체 클래스라고 볼 수 있다.

추상 클래스 선언

추상 클래스를 선언할 때는 abstract 키워드를 붙여야 한다.
abstract를 붙이면 new 연산자를 이용한 객체 생성이 불가능하고, 상속을 통해서 자식 클래스만 만들 수 있다.

public abstract class Tire {
	//필드
    //생성자
    //메소드
}

추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드 선언을 할 수 있다.
new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.

추상 메소드와 재정의

추상 클래스는 실체 클래스가 공통적으로 가져가야 할 필드와 메소드들을 정의해놓은 추상적인 클래스로, 실제 클래스의 멤버를 통일하는 데 목적이 있다.

하지만 메소드의 선언만 통일하고, 실제 내용은 실체 클래스마다 달라야 하는 경우가 있다.
이런 경우를 위해서 추상 클래스는 추상 메소드를 선언할 수 있다.
추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드를 말한다.

추상 클래스 설계시 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있을 경우 해당 메소드를 추상 메소드로 선언한다.
자식 클래스는 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.

예를 들어, Animal 클래스를 추상 클래스로 선언한다고 했을 때, 어떤 소리를 내는지는 결정할 수 없지만 동물은 소리를 낸다는 공통적인 특징을 규정하기 위해 sound() 메소드를 추상 메소드로 선언할 수 있다.

Animal 클래스를 상속하는 하위 클래스는 동물마다 고유한 소리를 내도록 sound() 메소드를 재정의해야 한다.
Dog는 "멍멍", Cat은 "야옹" 소리를 내도록 Dog/Cat 클래스에서 메소드를 재정의 할 수 있다.

public abstract class Animal {
	//필드
	public String kind;

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

GitHub: 추상 클래스 연습문제 풀이 코드

profile
느리더라도 꾸준하게

0개의 댓글