스타크래프트 예제로 알아보는 Java 추상(abstract) 클래스와 인터페이스(interface)의 개념

추상클래스는 주로 다형성의 개념을 살리기 위해서 사용된다.
실제로 개발을 하면서 추상클래스나 인터페이스를 사용하면서 개발을 해 본 경험은없다.
추상클래스나 인터페이스를 개발에 사용하려면 설계에 많은 시간을 투자해야 된다고 한다.
이말은 추상클래스나 인터페이스를 굳이 사용하지 않아도 된다는 말이다.
하지만 그래도 궁금해서 공부하는 차원에서 알아보았다.

스타크래프트의 모든 개체들은 유닛(Unit)이라는 개념을 가진다.
공통적으로 스타크래프트의 유닛들은 이동, 취소(나 홀드), 공격(라바 등 제외)의 동작들을 할 수 있다.

따라서 추상클래스는 말 그대로 공통적인 부분을 최대한 뽑아서 상위개념으로 만들어 주는 역할을 한다.

그리고 인터페이스는 각각의 클래스들의 성질을 나누는 역할을 한다.
Mechanic이라는 인터페이스를 implements 한 클래스들은 scv가 수리를 할 수 있도록 하는 성질을 가지게 한다.

public class InterfaceEX {

public static void main(String[] args) {

SeizeTank tank = new SeizeTank();
ScienceVessle vessle = new ScienceVessle();
NoSteamMarine marine = new NoSteamMarine();

print(tank);
print(vessle);
print(marine);
ScienceVessle v1 = new ScienceVessle();
ScienceVessle v2 = new ScienceVessle();
ScienceVessle v3 = new ScienceVessle();
NoSteamMarine m1 = new NoSteamMarine();
NoSteamMarine m2 = new NoSteamMarine();
SeizeTank t1 = new SeizeTank();
SeizeTank t2 = new SeizeTank();
SeizeTank t3 = new SeizeTank();
SeizeTank t4 = new SeizeTank();

//다른 유닛들을 부대로 지정할때  다형성의 개념
Unit[] arrU = new Unit[9];
arrU[0] = v1;
arrU[1] = v2;
arrU[2] = v3;
arrU[3] = m1;
arrU[4] = m2;
arrU[5] = t1;
arrU[6] = t2;
arrU[7] = t3;
arrU[8] = t4;

for(int i = 0 ;i<arrU.length; i++){
arrU[i].attack();
}
for(int i = 0 ;i<arrU.length; i++){
if(arrU[i] instanceof NoSteamMarine){
NoSteamMarine m = (NoSteamMarine) arrU[i];
m.upgrade();
}
}
}

public static void print(Object obj){
if(obj instanceof Mechanic){
System.out.println("기계임 수리가능함");
}else{
System.out.println("기계 아님 생물임 수리불가능함");
}
}

}
abstract class Unit{
int health;
abstract void move();
abstract void attack();
abstract void stop();
}
//클래스 구분 용도
interface Mechanic {}
class SeizeTank extends Unit implements Mechanic {

void move(){
System.out.println("SeizeTank 가 움직임");
}
void attack(){
System.out.println("SeizeTank 가 공격함");
}
void stop(){
System.out.println("SeizeTank 가 멈춤");
}
}
class NoSteamMarine extends Unit{

void move(){
System.out.println("NoSteamMarine 가 움직임");
}
void attack(){
System.out.println("NoSteamMarine 가 공격함");
}
void stop(){
System.out.println("NoSteamMarine 가 멈춤");
}
void upgrade(){
System.out.println("스팀팩을 개발중입니다.");
}
}
class ScienceVessle extends Unit implements Mechanic{

void move(){
System.out.println("ScienceVessle 가 움직임");
}
void attack(){
System.out.println("ScienceVessle 가 공격함");
}
void stop(){
System.out.println("ScienceVessle 가 멈춤");
}
}


댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째