JongDDA의 한걸음 한걸음씩
[Java] 추상 클래스(abstract class) 본문
추상 클래스(abstract class)
클래스를 설계도에 비유한다면 추상 클래스는 미완성 설계도에 비유할 수 있다. 말 그대로 완성되지 못한 채로 남겨진 설계도를 말한다. 따라서 추상클래스는 인스턴스를 생성할 수 없다. 상속을 통해 자식 클래스에 의해서만 완성시킬 수 있다.
추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무 것도 없는 상태에서 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다. 추상 클래스는 중요한 틀의 기능을 할 수 있고 완벽한 클래스를 만드는데 효율적일 것이다.
추상 클래스는 키워드 'abstract'를 붙이기만 하면 된다.
abstract class 클래스이름{
...
}
추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다. 추상 클래스에도 생성자가 있으며, 멤버변수와 메서드도 가질 수 있다.
추상 메서드(abstract method)
메서드는 선언부와 구현부로 구성되어 있다. 추상메서드의 경우 선언부만 작성하며 구현부는 작성하지 않은 채로 남겨 둔다. 이와 같이 작성을 하는 이유는 매서드의 내용이 상속받은 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 하기 때문이다.
추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 구현부가 없으므로 { } 괄호 대신 문장의 끝을 알리는 ';' 을 적어준다.
abstract 리턴타입 메서드이름();
추상클래스로부터 상속받는 자식클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자식 클래스 역시 추상클래스로 지정해 주어야 한다.
abstract class Mammalia {
// 추상 메서드
abstract void eating();
abstract void sleeping();
}
public class Horse extends Mammalia{
public void run() {
System.out.println("말 ~~ 달지자~~~");
}
// 추상메서드로 구현, 반드시 오버라이드 해야 한다.
@Override
void eating() {
// TODO Auto-generated method stub
}
@Override
void sleeping() {
// TODO Auto-generated method stub
}
}
public class Rabbit extends Mammalia {
// 추상메서드로 구현
@Override
void eating() {
System.out.println("당근을 먹어요");
}
@Override
void sleeping() {
System.out.println("들판 위에서 자요");
}
}
추상클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.
아래의 예시 코드를 통해 추상클래스에 대해 자세리 알아보자
컴퓨터 게임에 나온느 유닛들을 클래스로 간단히 정의해 보았다. 이 유닛들은 각자 나름대로의 기능을 가지고 있지만 공통부분을 뽑아내어 하나의 클래스로 만들고, 이 클래스로부터 상속받도록 변경해 보았다.
abstract class Unit {
int x, y, hp;
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] 입출력(I/O) (0) | 2021.08.19 |
---|---|
[Java] 인터페이스(Interface) (0) | 2021.08.18 |
[Java] 다형성(Polymorphism) (0) | 2021.08.17 |
[Java] 제어자(modifier) (0) | 2021.08.17 |
[Java] 상속(Inheritance) (0) | 2021.08.16 |