Creating Abstract Class

-여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

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() {..}
}

extract the common method by using abstract modifier(제어자) and creating "Unit" abstract class :


abstract class Unit {
    int x,y;
    //whatever class which inherit Unit should implement move method
    abstract void move(int x, int y);
    void stop() {..}
}

class Marine extends Unit {
    void move(int x, int y) {..}
    void stimPack() {..}
}
class Tank extends Unit {
    void move(int x, int y) {..}
    void changeMode() {..}
}
class Dropship extends Unit {
    void move(int x, int y) {..}
    void load() {..}
    void unload() {..}
}
Unit[] group = new Unit[3];
//Object[] group = new Object[3];
//Object 배열을 생성할 순 있지만 여기에는 move라는 메서드가 없기 때문에
//Object배열의 group[i]에 move가 있어도 Object에는 move가 없기 때문에 에러가 난다!
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();

for(int i = 0; i < group.length; i++) {
    //Unit이 아니라 상속받은 각각의 객체에 접근, 실제로 구현된 메소드를 호출한다.
    group[i].move(100,200);
}

For someone who don't get it understand why use Abstract class

  1. Easy to maintain

  2. Easy to create class

  3. Remove duplication

by using Meaningful steps of abstract class, can use mid class.

Abstract <-> Specific

Abstract code is more easier than specified code to modify code.

추상 클래스 타입 참조 변수로 자손 객체 담을 수 있다.

GregorianCalendar cal = new GregorianCalendar();//specific
//abstract what to return
Calendar cal = Calendar.getInstance();//abstract. return child object.

once write abstract code, it is more broad.

no need to create every single calendar.

easy to modify : just modify getInstance method

Calendar cal = Calendar.getInstance();

public static Calendar getInstance(Locale aLocale) {
    return createCalendar(TimeZone.getDefault(), aLocale);
}

private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
    //...
    if(caltype != null) {
        switch (caltype){
        //Child Classes of Calendar Class
        //BuddhistCalendar, JapaneseImperialCalendar, GregorianCalendar
        case "buddhist";
            cal = new BuddhistCalendar(zone,aLocale);
            break;
        case "japanese";
            cal = new JapaneseImperialCalendar(zone,aLocale);
            break;
        case "gregory";
            cal = new GregorianCalendar(zone,aLocale);
            break;
    }
}

Last updated