추상 메소드는
자식 클래스에서 재정의해야만 사용할 수 있는 메소드이다.
추상 클래스는
이런 메소드를 하나 이상 포함하는 클래스를 추상 클래스라고 한다.
이 재정의한 메소드를 부모 클래스의 객체 변수를 통해 사용하려면 부모 클래스의 객체 변수를 선언할 때 자식 클래스의 생성자를 이용해야 한다.
좀 더 쉽게 말하자면
우리가 집 설계도를 만들고 있는 건축가라고 할 때, 이 집에 문을 달아야 한다고 하자.
- 여기서 설계도는 추상 클래스이다
근데 지금은 어떤 문을 달지 아직 미정이다.
문의 종류는 워낙 많다.. 자동문,미닫이문,,여닫이문 등등... 그에 따라 문을 여는 방식이 다르다.
그래서 일단 설계도(추상 클래스)에는
“문을 열 수 있어야 한다”는 정도만 넣어주는 것이다.
즉, 추상 클래스에 open()이라는 추상 메서드를 정의하는 것
그리고 나중에 구체적인 문이 만들어질 때 —
예를 들어 여닫이문, 미닫이문, 자동문 같은 문들이 생기면,
그때 각 문 클래스가 자기 방식대로 문을 여는 방법을 정의하는 것이다.
결국, 추상 클래스는
“문을 열어야 한다”는 공통 규칙만 정해두고,
실제로 어떻게 여는지는 자식 클래스가 결정하도록 맡기는 것
문의 여는 방식은 자식 클래스가 정의한다.
아래는 위 비유에 따른 코드 예시이다.
// 문 설계도 (추상 클래스)
//추상 클래스
abstract class Door {
abstract void open(); // "문을 열어야 한다"는 규칙만 정의 (추상 메소드)
}
// 여닫이문
class SwingDoor extends Door {
void open() {
System.out.println("문을 앞으로 연다");
}
}
// 미닫이문
class SlidingDoor extends Door {
void open() {
System.out.println("문을 옆으로 민다");
}
}
// 자동문
class AutomaticDoor extends Door {
void open() {
System.out.println("센서가 사람을 감지하고 열린다");
}
}
public class Main {
public static void main(String[] args) {
// 여닫이문 객체 생성
Door swing = new SwingDoor();
swing.open(); // 문을 앞으로 연다 출력
// 미닫이문 객체 생성
Door sliding = new SlidingDoor();
sliding.open(); // 문을 옆으로 민다 출력
// 자동문 객체 생성
Door auto = new AutomaticDoor();
auto.open(); // 센서가 사람을 감지하고 열린다 출력
}
}
- 내가 달고 싶은 원하는 문의 객체만 생성하면 된다.
그럼 왜 굳이 추상 클래스를 사용해야 할까?
간단히 말하면
공통된 규칙은 미리 정해두고,
각자 다르게 해야 하는 부분은 강제로 만들게 하기 위해서이다.
이 부분도 코드를 통해 살펴보자.
class SwingDoor {
void open() { System.out.println("문을 앞으로 연다"); }
}
class SlidingDoor {
void open() { System.out.println("문을 옆으로 민다"); }
}
class AutomaticDoor {
void open() { System.out.println("센서가 사람을 감지하고 열린다"); }
}
겉보기엔 잘 동작한다.
하지만,
이 세 문이 서로 아무 관계가 없게 된다.
사람인 우리 입장에선, 문의 종류라는 걸 알지만, 얘네가 다 문이라는 걸 코드가 모른다.
마치 like 하하버스 랄까.. 잘생기고 인기짱인데, 난 그걸 몰라
그래서 아래 코드는 사용할 수 없다.
void testDoor(Door door) {
door.open();
}
왜냐,, door라는 공통 타입이 없으니까
그래서 추상 클래스를 사용해야 아래와 같은 코드를 쓸 수 있다.
Door door = new AutomaticDoor(); // 자동문이지만, 추상 클래스를 통해 문으로서 인식됨
door.open(); // 자동으로 열린다
이렇게 해야, 코드 입장에서 자동문이 문이라는 걸 알고 있기 때문에 Door 타입 하나로 여러 종류의 문을 다 다룰 수 있다...
이게 바로 자바의 다형성이다.
요약하자면,
- 추상 클래스는 공통 규칙을 정의해서
“이 클래스는 이런 기능들을 반드시 가져야 해”라고 정해두는 역할. - 자식 클래스는 그 규칙을 따라서 자신만의 방식으로 구현하는 역할.
이렇게 하면 코드를 더 일관성 있고, 재사용성 있게 만들 수 있다.
이상,, 정처기 공부하다 다시 한번 다져보는 추상클래스