객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스 라고 한다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 가질 수 있다.
여기서 특성이란 필드와 메소드들을 말한다. 예를 들어 Bird class, Insect class, Fish class 등의 실체 클래스들에서 공통되는 필드와 메소드들을 따로 선언한 Animal class 를 만들 수 있는데 이것이 바로 추상 클래스이다.
추상 클래스의 용도
실체 클래스의 공통적인 특성(필드, 메소드)을 뽑아내어 추상 클래스로 만드는 이유는 아래와 같이 두가지 이유가 있다.
1. 공통된 필드와 메소드의 이름을 통일할 목적
실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.
데이터와 기능이 모두 동일함에도 불구하고 이름이 다르다 보니, 객체마다 사용 방법이 달라진다. 따라서 추상 클래스를 상속함으로써 메소드 이름을 통일 할 수 있다.
2. 실체 클래스를 작성할 때 시간 절약
공통적인 필드와 메소드는 추상 클래스에 모두 선언해두고, 다른 점만 실체 클래스에 선언하면 실제 클래스를 작성하는데 시간을 절약할 수 있다.
일반적으로 개발 프로젝트에서 설계자와 코더(코드를 작성하는 사람)는 다른 일을 수행한다. 실계자는 코데어게 클래스는 어떤 구조록 작성해야 한다는 것을 알려줘야한다. 이를 단순히 문서로 전달한다면, 코더가 실수로 필드와 메소드 이름을 다르게 코딩할 수 있다. 코더가 작성해야 할 클래스가 다수이고 이 클래스들이 동일한 필드와 메소드를 가져야 할 경우, 설계자는 이 내용들을 추려내어 추상 클래스로 설계 규격을 만드는 것이 좋다. 그리고 코더에게 추상 클래스를 상속해서 구체적인 클래스를 만들도록 요청하면 된다.
예를 들어, 자동차를 설계할 때에는 일반적인 타이어 규격에 맞추어서 작성해야 한다. 즉, 특정한 타이어만 사용할 수 있도록 자동차를 설계하지는 않는다는 것이다. 이는 일반적인 타이어 규격을 준수하는 타이어는 어떠한 것이든 부착할 수 있도록 하기 위해서이다.
여기서 타이어 규격은 타이어의 추상 클래스라고 볼 수 있고, 타이어 규격을 준수하는 한국 타이어나 금호 타이어는 추상 클래스를 상속하는 타이어의 실체 클래스라고 볼 수 있다.
추상 클래스의 선언
추상 클래스를 선언할 때에는 클래스 선언에 absrtact 키워드를 붙여야 한다. abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.
추상 클래스는 일반 클래스와 마찬가지로 필드, 생성자, 메소드 선언을 할 수 있다. new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.
'Java' 카테고리의 다른 글
| 자바 인터페이스 타입 변환과 다형성 (2) | 2023.06.27 |
|---|---|
| 자바 인터페이스 (0) | 2023.06.27 |
| 자바 클래스 타입 변환과 다형성 (0) | 2023.06.26 |
| 자바 상속 (0) | 2023.06.26 |
| 자바 패키지와 접근 제한자 (0) | 2023.06.26 |