[기본 개념] 2 | (6.1) 추상클래스
1> 추상클래스란?
2> 추상메서드(abstract method)
3> 추상클래스의 작성
1. 추상클래스란?
클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
추상클래스는 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다.
추상클래스는 키워드 'abstract'를 붙이기만 하면 된다. 이렇게 함으로써 클래스 선언부의 abstract를 보고 상속을 통해 구현해주어야 한다는 것을 쉽게 알 수 있을 것이다.
abstract class 클래스이름 {
· · ·
}
추상클래스도 생성자가 있으며 멤버변수와 메서드도 가질 수 있다.
2. 추상메서드(abstract method)
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다. 이와 같이 남겨놓는 이유는 상속받는 클래스에 따라 메서드의 내용이 달라질 수 있기 때문에 조상클래스에서 선언부만 작성하는 것이다. 그리고 주석을 덧붙여 어떤 기능을 수행할 것인지 알려주어 상속받는 자손 클래스가 적절히 구현해주어야 한다.
추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 구현부가 없으므로 괄호{ } 대신 ';'을 적어준다.
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */
abstract 리턴타입 메서드이름( ) ;
3. 추상클래스의 작성
상속이 자손클래스를 만드는데 조상클래스를 사용하는 것이라면 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이라 할 수 있다.
추상화 클래스 간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 상속을 통해 클래스를 구현, 확장하는 작업
기존의 클래스로부터 공통된 부분을 뽑아내어 추상클래스를 만들어 보도록 하자.
class Marine { // 보병
int x, y ; // 현재위치
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop( ) { /* 현재 위치에 정지 */ }
void stimPack( ) { /* 스팀팩을 사용한다. */ }
}
class Tank { // 탱크
int x, y ; // 현재위치
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop( ) { /* 현재 위치에 정지 */ }
void changeMode( ) { /* 공격모드를 변환한다. */ }
}
class Dropship { // 수송선
int x, y ; // 현재위치
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop( ) { /* 현재 위치에 정지 */ }
void load( ) { /* 선택된 대상을 태운다. */ }
void unload( ) { /* 선택된 대상을 내린다. */ }
}
이 유닛들은 각자 나름대로의 기능을 가지고 있지만 공통부분을 뽑아내어 하나의 클래스로 만들고, 이 클래스로부터 상속받도록 변경해보자.
abstract class Unit {
int x, y ;
abstract void move(int x, int y) ;
void stop( ) { /* 현재 위치에 정지 */ }
}
class Marine extends Unit { // 보병
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stimPack( ) { /* 스팀팩을 사용한다. */ }
}
class Tank extends Unit { // 탱크
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void changeMode( ) { /* 공격모드를 변환한다. */ }
}
class Dropship extends Unit { // 수송선
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void load( ) { /* 선택된 대상을 태운다. */ }
void unload( ) { /* 선택된 대상을 내린다. */ }
}
각 클래스의 공통부분을 뽑아내서 Unit클래스를 정의하고 이로부터 상속받도록 하였다. 이 Unit클래스는 다른 유닛을 위한 클래스를 작성하는데 재활용될 수 있을 것이다.
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 2 | (7.2) 인터페이스 다형성, 장점 (0) | 2021.11.20 |
---|---|
[기본 개념] 2 | (7.1) 인터페이스 상속, 구현, 다중상속 (0) | 2021.11.20 |
[기본 개념] 2 | (5.3) 매개변수의 다형성, 객체를 배열로 (0) | 2021.11.19 |
[기본 개념] 2 | (5.2) instance of 연산자, 참조변수와 인스턴스 연결 (0) | 2021.11.19 |
[기본 개념] 2 | (5.1) 다형성, 참조변수의 형변환 (0) | 2021.11.19 |