본문 바로가기
back-end/JAVA

36) 추상클래스(abstract class), 추상메서드(abstract method)

by 모두의 향연 2021. 6. 10.
728x90
반응형

36) 추상 클래스(abstract class)

 

1. 추상클래스(abstract class)

-미완성 설계도(미완성 클래스)

-미완성 메서드를 가지고 있는 클래스

1
2
3
4
abstract class Player{
    abstract void play(int pos);
    abstract void stop();
}


c

-다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가

1
Player p = new Player();//에러! 추상클래스의 인스턴스 생성불가
cs
-상속을 통해 추상메서드를 완성해야 인스턴스 생성가능
1
2
3
4
5
6
7
8
9
abstract class Player{
    abstract void play(int pos);
    abstract void stop();
}
 
class AudioPlayer extends Player{//상속
    void play(int pos) {/*내용구현*///추상메서드 구현
    void stop() {/*내용구현*///추상메서드 구현
}
cs

AudioPlayer클래스는 상속받은 메서드를 구현했으므로 acstract를 붙이지 않는다. 

그렇기에 인스턴스도 생성 가능하다.

1
AudioPlayer ap = new AudioPlayer();
cs

 

2. 추상메서드(abstract method)

-미완성 메서드

-구현부(몸통{})가 없는 메서드

-형태: abstract 리턴타입 메서드 이름();

-꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
abstract class Player{
    abstract void play(int pos);
    abstract void stop();
}
 
class AudioPlayer extends Player{
    void play(int pos) {/*내용구현*/}
    void stop() {/*내용구현*/}
}
 
abstract class AbstractPlayer extends Player{
    void play(int pos) {/*내용생략*/}
}
cs

Player클래스는 미완성 메서드를 가지고 있어서 추상 클래스다.

AudioPlayer클래스는 Player의 미완성 메서드를 가져와서 내용을 구현했으므로 추상 클래스가 아니다.

AbstractPlayer클래스는 Player의 미완성 메서드를 '하나'만 가져와서 구현했으므로 추상 클래스다.

다만, Player클래스의 play메서드를 가져와서 구현했으므로 AbstractPlayer클래스의 play메서드는 추상 메서드가 아니다.

 

메서드의 내용이 구현 X -> 추상 메서드

추상 메서드를 가지고 있다? -> 추상 클래스

 

-추상 메서드 호출 가능(호출할 때는 선언 부만 필요)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
abstract class Player{//추상클래스
    boolean pause;//일지정지
    int currentPos;//현재위치
    
    Player(){//추상클래스도 생성자가 있어야한다
        pause = false;
        currentPos = 0;
    }
    //지정된 위치에서 재생을 시작하는 기능
    abstract void play(int pos);//추상메서드
    //재생을 즉시 멈추는 기능
    abstract void stop();//추상메서드
    //재생하는 기능
    void play() {//메서드
        play(currentPos);//추상메서드 사용가능
    }
}
cs

 

메서드 내에서 추상 메서드 생성 가능하다.

나중에 자손이 상속을 통해 추상 메서드를 완성할 수 있기 때문에 사용 가능하다.

하지만, 지금 상태에서 '생성'은 가능하지만, '호출'할 수 없다.

인스턴스 메서드는 객체 생성 후에 '호출'가능하기 때문.

1. 상속을 통해 자손이 메서드를 완성하면 2. 객체 생성 가능

 

 

3. 추상 메서드 왜 쓰는가?

추상 메서드라'도' 작성해 놓으면 상속받는 자손마다 다르게 설정할 수 있다.

게임에서 캐릭터마다 play(int pos)와 stop() 기능은 다 있다. 필수 기능이다.

필수 기능이라서 캐릭터마다 다르게 설정되므로 추상 메서드를 사용한다.

일단 기본 기능을 써놓으면 가져가서 위치만 변경하면 되니까.

 

 

4. 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
abstract class Player{//추상클래스
    abstract void play(int pos);
    abstract void stop();
}
 
class AudioPlayer extends Player{
    void play(int pos) {System.out.println(pos+"위치부터 시작합니다.");}
    void stop() {System.out.println("재생을 멈춥니다.");}
}
 
public class Main {
    public static void main(String[] args) {
//    Player p = new Player();//오류! 객체생성불가능->추상클래스라서
//    AudioPlayer a = new AudioPlayer();//객체생성가능->추상클래스아니라서
   Player ap = new AudioPlayer();//다형성
    a.play(100);//추상메서드를 자손이 상속받아 완성했으므로 호출가능
    a.stop();//추상메서드를 자손이 상속받아 완성했으므로 호출가능
    a.stop();
    }
}
 
 
cs

추상 메서드를 자손이 상속받아 나머지를 완성하면, 객체 생성도 가능+메서드 호출도 가능!

15행에서 타입은 Player지만, 리모컨과 가리키는 객체는 AudioPlayer다. 

실제 호출되는 것은 Player가 아니라 AudioPlayer가 호출된다.

리모콘 타입과는 상관없다. 리모콘 타입에는 선언문만 있으면 되고, 실제로 구현되는 것은 완전히 구현된 클래스가 호출된다.

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

728x90
반응형