* 추상 클래스 (Abstract class)
객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성(필드, 메소드)를 가질 수 있다.
추상 클래스는 실체(구현) 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다. 다시 말해서 추상 클래스는 new 연산자를 사용해서 인스턴스를 생성시키지 못한다.
* 추상 클래스의 용도
1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
실체 클래스를 설계하는 사람이 여러 사람일 겨웅, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수있다. 예를 들어 소유자의 이름을 저장하는 필드를 TelePhone에서는 owner라고 하고, SmartPhone에서는 user라고 할 수 있다. 그리고 전원을 켜다라는 메소드를 Telephone에서는 turnOn()으로 설계하고, SmartPhone에서는 powerOn()이라고 설계할 수 있다. 동일한 데이터와 기능임에도 불구하고 이름이 다르다 보니, 객체마다 사용 방법이 달라진다. 따라서 Phone이라는 추상 클래스에 소유자인 owner 필드와 turnOn() 메소드를 선언하고, TelePhone과 SmartPhone은 Phone을 상속함으로써 필드와 메소드 이름을 통일시킬 수 있다.
2. 실체 클래스를 작성할 때 시간을 절약
공통적인 필드와 메소드는 추상 클래스인 Phone에 모두 선언해두고, 실체 클래스마다 다른 점만 실체 클래스에 선언하게 되면 실체 클래스를 작성하는데 시간을 절약할 수 있다. Telephone과 SmartPhone은 Phone을 상속받기 때문에 owner 필드와 turnOn()메소드를 선언할 필요가 없다.
* 추상 클래스 선언
쿠상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야 한다. abstract를 붙이게 되면 new 연산자를 사용해서 객체를 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.
public abstract class 클래스 이름 {
// 필드
// 생성자
// 메소드
}
추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드 선언을 할 수 있다. new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super 연산자를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 필요하다.
* 추상 메소드와 오버라이딩
추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버(필드, 메소드)를 통일화하는데 목적이 있다. 모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋은 것이다. 그러나 메소드의 선언만 통일화하고, 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 이런 경우를 위해서 추상 클래스는 추상 메소드를 선언할 수 있다. 추상 메소드는 추상 클래스에서만 선언할 수 있는데, 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드를 말한다. 추상 클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있는 경우, 해당 메소드를 추상 메소드로 선언하면 된다. 자식 클래스는 반드시 추상 메소드를 재정의(오버라이딩) 해서 실행 내용을 작성하여야 한다.
[public | protected] abstrac 리턴타입 메소드명(매개변수, 매개변수 2,,,,);
추상 메소드의 예)
'JAVA' 카테고리의 다른 글
Call By Value / Call By Reference (0) | 2021.08.14 |
---|---|
객체 복제 (0) | 2021.08.11 |
Static (0) | 2021.07.21 |
Map Collection (0) | 2021.07.08 |
Collection Framework (0) | 2021.07.05 |