Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

codingfarm

추상클래스(abstract class) 본문

Programming Language/JAVA

추상클래스(abstract class)

scarecrow1992 2021. 3. 11. 22:38

추상클래스란?

  • 추상메서드를 포함한 클래스
    • 추상메서드 : 선언부만 있고, 구현부는 없는 메서드
      • 구현부 작성은 추상클래스를 상속받는 자식클래스에서 수행한다.
  • 일반 클래스처럼 필드, 일반 메서드를 가질수 있고, 인스턴스화도 가능하다.
  • 문법 : 키워드 abstract를 붙이면 된다.
1
2
3
abstract class 클래스이름 {
    // ...
}
cs

 

  • 추상 메서드는 키워드 'abstract'를 함수 선언부 앞에 붙이면된다.
    • 아무 내용도 없는 메서드로 작성해도 추상메서드가 되지만, abstract를 붙여야 자손 클래스에서 구현을 강요할 수 있다.
1
2
abstract 리턴타입 메서드이름1();
리턴타입 메서드이름2() {};
cs

 

  • 추상 클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 추상메서드를 모두 구현해주어야한다.
    • 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손 클래스역시 추상 클래스로 지정해 주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Player {
    abstract void play(int pos);
    abstract void stop();
}
 
class AudioPlayer extends Player {
    void play(int pos) {/* ... */}    // 추상메서드를 구현
    void stop() {/* ... */}            // 추상메서드를 구현
}
 
 
// stop에 대한 구현이 없으므로 AbstractPlayer는 추상클래스가 된다.
abstract class AbstractPlayer extends Player {
    void play(int pos) { /* ... */}    // 추상메서드를 구현
}
cs

 

  • 프로그래밍에 있어서 추상화구체화의  의미는 아래와 같다.
    • 추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
    • 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
  • 상속 계층도를 따라 내려갈수록 클래스는 점점 기능이 추가되어 구체화의 정도가 심해진다.
  • 상송 계층도를 따라 올라갈수록 추상화의 정도가 심해진다.

 

아래에 Player라는 추상 클래스를 작성해 보았다. 이 클래스는 VCR이나 Audio와 같은 재생 가능한 기기(Player)를 클래스로 작성할 때, 이 들의 조상클래스로 사용될 수 있을 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
abstract class Player {
    boolean pause;
    int currentPos;
    
    Player() {
        pause = false;
        currentPos = 0;
    }
    
    abstract void play(int pos);
    abstract void stop();
    
    void play() {
        play(currentPos);
    }
    
    void pause() {
        if(pause) {
            pause = false;
            play(currentPos);
        }
        else {
            pause = true;
            stop();
        }
    }
}
 
 
class CDPlayer extends Player{
    void play(int currentPos) {
        /* ... */
    }
    
    void stop() {
        /* ... */
    }
    
    int currentTrack;
    
    void nextTrack() {
        currentTrack++;
        // ...
    }
    
    void preTrack() {
        if(currentTrack>1) {
            currentTrack--;
        }
        // ...
    }
}
cs

 

 

실제 예제 코드를 작성해보자.

스타크래프트1에서 해병과 공성전차, 수송선의 데이터를 다룰 class를 아래와 같이 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Marine {
    int x, y;
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()                { /* 현재 위치에 정지 */ }
    void stimPack()            { /* 스팀팩을 사용한다. */ }
}
 
class Tank {
    int x, y;
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()                { /* 현재 위치에 정지 */ }
    void changeMode()        { /* 공격모드를 변환한다. */ }
}
 
class Dropship {
    int x, y;
    void move(int x, int y) { /* 지정된 위치로 이동 */ }
    void stop()                { /* 현재 위치에 정지 */ }
    void load()                { /* 선택된 대상을 태운다. */ }
    void unload()            { /* 선택된 대상을 내린다. */ }
}
cs

기능 자체는 이상 없을것이다.

하지만, 우리가 여러 종류의 유닛을 동시에 선택한다면 선택된 유닛 인스턴스의 정보를 담을 방법이 굉장히 난감해진다. 그러므로 해당 클래스들의 공통 부분을 뽑아내어 Unit클래스를 정의하고 이로부터 상속받도록 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package project_1;
 
abstract class Unit {
    int x, y;
    abstract void move(int x, int y);
    void stop() {
        System.out.println("Stop!!");
    }
}
 
class Marine extends Unit {
    void move(int x, int y) {
        System.out.println("Marine is moving");
    }
    void stimPack()            { /* 스팀팩을 사용한다. */ }
}
 
class Tank extends Unit {
    void move(int x, int y) {
        System.out.println("Tank is moving");
    }
    void changeMode()        {
        System.out.println("Transforming");
    }
}
 
class Dropship extends Unit {
    void move(int x, int y) {
        System.out.println("Dropship is moving");
    }
    void load()                {
        System.out.println("Dropship load");
    }
    void unload()            { 
        System.out.println("Dropship unload"); }
}
 
public class Hello {
    public static void main(String[] args) {
        Unit[] units = new Unit[4];
        units[0= new Marine();
        units[1= new Tank();
        units[2= new Marine();
        units[3= new Dropship();
        
        for(int i=0; i<units.length; i++)
            units[i].move(100,200);        
    }
}
cs

 

 

 

 

 

'Programming Language > JAVA' 카테고리의 다른 글

예외 처리(exception handling)  (0) 2021.03.22
인터페이스(interface)  (0) 2021.03.11
다형성(polymorphism)  (0) 2021.03.10
제어자(modifier)  (0) 2021.03.07
super  (0) 2021.01.07
Comments