일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Stored Procedure
- union find
- String
- DP
- 이진탐색
- SQL
- Brute Force
- binary search
- Dijkstra
- two pointer
- Trie
- 그래프
- Two Points
- 다익스트라
- Hash
- 스토어드 프로시저
- MYSQL
Archives
- Today
- Total
codingfarm
추상클래스(abstract class) 본문
추상클래스란?
- 추상메서드를 포함한 클래스
- 추상메서드 : 선언부만 있고, 구현부는 없는 메서드
- 구현부 작성은 추상클래스를 상속받는 자식클래스에서 수행한다.
- 추상메서드 : 선언부만 있고, 구현부는 없는 메서드
- 일반 클래스처럼 필드, 일반 메서드를 가질수 있고, 인스턴스화도 가능하다.
- 문법 : 키워드 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