클래스를 설계도라고 한다면, 추상클래스는 미완성 설계도라고 할 수 있다.
예를들어 3개의 유사한 제품이 있는데, 이 제품들의 설계도가 90%가 동일하다고 한다면, 이 3개 제품의 설계도를 모두 일일이 그린다면 엄청난 시간이 낭비될 것이다. 90%의 똑같은 내용을 3번 반복해서 그리게 될 테니까.
그 대신 세 설계도의 공통부분인 90%만 한 장 그린 다음에 복사기로 3장을 복사하고, 나머지 10%씩을 그려 완성하면 훨씬 효율적으로 제품 설계도를 만들 수 있을 것이다.
게다가 만일 공통부분이 변경되는 일이 생겨도 설계도 변경작업이 어렵지 않을 것이다.
추상 클래스를 미완성 설계도(90%만 완성됨)에 비유한다는 것, 즉 클래스가 미완성이라는 것은 미완성 메서드(추상 메서드)를 포함하고 있다는 뜻이다.
미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로는 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서 완성될 수 있다.
추상클래스 자체로는 클래스로서의 역할은 못하지만, 새로운 클래스를 작성하는 데 있어 바탕이되는 조상클래스로서 중요한 의미를 갖는다.
클래스 선언부의 abstract 키워드는 이 클래스가 추상클래스임을 뜻하며 추상 메서드가 있으니 상속을 통해 구현해주어야 한다는 것을 의미한다.
abstract class 클래스이름 {
// ..
}
추상클래스는 추상메서드를 포함하는 것 외에는 일반 클래스와 같다. 생성자, 멤버변수, 일반 메서드도 가질 수 있다.
추상 메서드를 포함하지 않는 클래스도 abstract 키워드를 통해 추상클래스로 지정할 수 있는데, 추상클래스로 지정된 완성된 클래스일 경우에도 인스턴스를 생성할 수 없게 된다.
메서드는 선언부와 구현부로 구성되어 있다. 여기서 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다. 설계만 해두고 실제 수행될 내용은 작성하지 않기 때문에 미완성인 것이다.
메서드를 미완성 상태로 남겨두고, 실제 내용은 상속받는 클래스에서 구현하도록 비워두는 것이다.
추상 메서드 역시 abstract 키워드를 붙여주고, 구현부가 없기 때문에 괄호 {} 대신 문장의 끝을 알리는 ;을 붙여준다.
abstract 메서드(파라미터: 타입): 타입;
// abstract methodEx(param: string): void;
추상클래스를 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상 메서드를 모두 구현해주어야 한다. 만일 하나라도 구현하지 않는다면, 자손클래스 역시 추상클래스로 지정해주어야 한다.
추상 클래스를 만드는 두 가지 방법이 있다.
상속이 자손클래스를 만들기 위해 조상클래스를 사용하는 것이라면,
추상화는 기존의 클래스의 공통부분을 뽑아 조상클래스를 만드는 것이라고 할 수 있다.
추상화를 구체와와 반대되는 의미로 이해하면 쉽다. 상속 계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 심해지고, 상속 계층도를 따라 올라갈수록 추상화의 정도가 심해진다고 할 수 있다.
즉, 내려갈수록 세분화되고, 올라갈수록 공통요소만 남게되는 것이다.
정리하면 추상화란, 클래스간의 공통점을 찾아 내 공통 조상을 만드는 작업이고, 구체화란 상속을 통해 클래스를 구현하고 확장하는 작업이다.
// 추상 클래스
abstract class Unit {
public x: number;
public y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
public abstract move(x: number, y: number): void;
}
const unit = new Unit(2, 5) // 불가능!!
// 자식 클래스
class Tank extends Unit {
move(x: number, y: number) {
return x + y
}
changeMode(): void {
return '모드 변경'
}
}
class Marine extends Unit {
move(x: number, y: number) {
return x * y
}
stimPack(): void {
return '스팀팩 사용'
}
}
대충 이런 느낌
참고 많이했습니다ㅎㅎ