자바의 정석 - 추상클래스의 작성

Yohan·2024년 1월 24일
0

추상클래스의 작성

  • 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
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() {}
}
  • 위와 같은 코드에서 공통적인 부분을 뽑아서 추상클래스를 만들 수 있다.
abstract class Unit { // 공통 부분
	int x, y;
    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() {}
}
  • 참조변수배열 group은 Unit[ ]을 타입으로 하고 있고, Unit에는 move메서드가 정의되어 있어서 move메서드를 사용 가능! 하지만, 실행되는 코드는 자손을 통해 구현된 move메서드!
    -> Unit[ ] 타입대신 Object[ ]가 들어가면 최고조상이라 될 것 같지만 Object에는 move메서드가 정의되어있지 않으므로 에러 발생
Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();

for(int i = 0; i < group.length; i++) {
	group[i].move(100, 200);
}

실습

public class Ex {
    public static void main(String[] args) {
        Unit[] group = { new Marine(), new Tank(), new Dropship() };
        /*  위 코드와 동일
        Unit[] group = new Unit[3];
        group[0] = new Marine();
        group[1] = new Tank();
        group[2] = new Dropship();
        */

        // group의 타입은 Unit[]
        // group[0], group[1], group[2] 의 타입은 Unit (group[0] = new Marine()인데 Marine객체는 Unit의 자손이라서 , 나머지도 동일)
        for (int i = 0; i < group.length; i++)
            group[i].move(100, 200);
    }
}

abstract class Unit {
    int x, y;
    void move(int x, int y) {}
    void stop() {}
}

class Marine extends Unit {
    void move(int x, int y) {
        System.out.println("Marine[x=" + x + ",y=" + y + "]");
    }
    void stimPack() {}
}

class Tank extends Unit {
    void move(int x, int y) {
        System.out.println("Tank[x=" + x + ",y=" + y + "]");
    }
    void changeMode() {}
}

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.println("Dropship[x=" + x + ",y=" + y + "]");
    }
    void load() {}
    void unload() {}
}

추상클래스 장점

  1. 관리 용이
  2. 중복 제거
  3. 설계도를 쉽게

추상화 <-> 구체화

  • 추상화 : 불명확
  • 구체화 : 명확
  • 추상화된 코드는 구체화된 코드보다 유연하다. 변경에 유리!
profile
백엔드 개발자

0개의 댓글