추상 메서드
- 추상 메서드는 구현부는 없고, 선언만 해놓은 메서드를 말한다.
- 함수를 선언하고, abstract라는 키워드를 적어줌으로써 구현부({...})는 생략할 수 있다.
추상 클래스(abstract class)
- 추상 메서드를 가지고 있는 class를 추상 클래스라고 한다.
- 클래스를 정의하고, abstract라는 키워드를 적어준다.
- 추상 클래스는 상속을 통해서, 자식 클래스에서 추상 메서드를 구현해줘야 인스턴스 생성이 가능하다.
// 추상 클래스
abstract class Player {
// 추상 메서드
abstract void play(int pos);
abstract void stop();
}
// 추상 클래스는 상속을 통해서 완성해야 객체 생성이 가능하다.
class AudioPlyaer extends Player{
void play(int pos) {
System.out.println(pos + "초부터 play 시작.");
}
void stop() {
System.out.println("play 정지.");
}
}
// 추상 클래스의 일부 메서드만 구현한다면, class 앞에 abstract 키워드 붙여야 함.
abstract class Test extends Player{
void play(int pos) {
System.out.println("TEST");
}
}
- 위 예제와 같이 Player라는 추상 클래스 안에는 play, stop 이라는 추상 메서드가 선언 되어있다.
- AudioPlayer라는 하위 클래스를 정의하고, 상위 클래스에서 선언한 play(), stop()메서드를 구현함으로써
AudioPlyaer타입의 객체를 생성할 수 있게 되는 것이다. - 만약, 하위 클래스(Test)에서 추상 클래스의 일부 메서드만 구현 한다면 추상 클래스로 처리해줘야한다.
아직 stop()이라는 추상 메서드가 존재하기 때문.
추상 클래스를 굳이굳이 사용하는 이유는? 언제 사용?
상위 클래스에서 메서드를 구현하고, 하위 클래스에서 오버라이딩해서 사용할 수도 있는데 굳이 왜 사용하는가에 대해 의문이 있을 수 있다.
- 추상 메서드를 선언하고, 추상 클래스를 정의함으로써 해당 메서드를 사용하려면 하위 클래스에서 정의를 해야하는 강제성을 띠게 된다.
- 단지 부모 클래스의 메서드를 상속받아 재정의를 하거나 or 안하거나 와는 다르게
추상 클래스는 해당 추상 메서드를 명확하게 구현해줘야 사용이 가능하므로 강제성을 띤다는 면에서 차이가 존재한다.
- 단지 부모 클래스의 메서드를 상속받아 재정의를 하거나 or 안하거나 와는 다르게
- 공통적인 기능들을 묶음으로써 코드의 중복을 제거할 수 있고, 관리가 용이하다.
- 추상 클래스를 의미있는 단계별로 나누어 설계하면 중간에 원하는 기능을 추가or수정해서 손 쉽게 새로운 하위 클래스를 다룰 수도 있다.
- 꼭 필요한 기능인데 하위 클래스마다 다르게 구현되어야 할 때 사용하게 된다.
추상 클래스, 추상 메서드 정리
// 추상 클래스
abstract class Player {
// 추상 메서드
abstract void play(int pos);
abstract void stop();
}
// 추상 클래스는 상속을 통해서 완성해야 객체 생성이 가능하다.
class AudioPlyaer extends Player{
void play(int pos) {
System.out.println(pos + "초부터 play 시작.");
}
void stop() {
System.out.println("play 정지.");
}
}
public class AbstractEx {
public static void main(String[] args) {
// AudioPlyaer p = new AudioPlyaer();
Player p = new AudioPlyaer();
p.play(10);
p.stop();
}
}
- Player라는 추상 클래스를 정의함으로써, 플레이어 기능이 있는 객체마다 다르게 정의할 수 있게끔 빌드업을 해주었다.
- AudioPlayer라는 자식클래스를 정의하고, 추상메서드를 구현함으로써 인스턴스를 생성할 수 있게끔한다.
- AudioPlayer타입으로 인스턴스를 참조하여 사용할 수 있게된다.
- 만약, AudioPlyaer에서 play()메서드만 구현했다면 추상 클래스로써 정의해줘야 했을 것이다.(abstract class AudioPlayer ...)
'JAVA' 카테고리의 다른 글
1. 자바 컴파일 과정 (0) | 2022.11.23 |
---|---|
22. 인터페이스 (0) | 2022.11.14 |
20. 다형성의 장점 (0) | 2022.11.10 |
19. 다형성, 참조변수의 형변환 (0) | 2022.11.10 |
18. 캡슐화 (0) | 2022.10.03 |