Notice
Recent Posts
Recent Comments
«   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
관리 메뉴

충분히 쌓여가는

추상클래스의 작성 본문

Java/객체지향

추상클래스의 작성

빌드이너프 2023. 6. 14. 14:16

추상클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나

기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다

 

 

추상클래스 사용 전

class Marine {
    int x, y;
    void move(int x, int y) { }
    void stop() { }
    void stimPact() { }
}

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

 

추상클래스 사용 후

Unit 클래스: 조상

Marine, Tank, Dropship: 자손

move 메서드에 abstract를 붙이면 자손 클래스에서 구현을 해야하는 것을 알려줄 수 있다

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

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[0].move가 호출되면 Marine의 move()가 호출되고,

group[1].move은 Tank의 move(), group[2].move은 Dropship의 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);

 

만약 Object 클래스로 한다면

Object 클래스에 move 메서드가 정의되어 있지않아 에러가 발생한다

Object[] group = new Object[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 abstractClass {
    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();

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

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) {
        System.out.printf("Marine: %d, %d%n", x, y);
    }
    void stimPact() { }
}

class Tank extends Unit {
    void move(int x, int y) {
        System.out.printf("Tank: %d, %d%n", x, y);
    }
    void changeMode() { }
}

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.printf("Dropship: %d, %d%n", x, y);
    }
    void load() { }
    void unload() { }
}

Marine: 100, 200
Tank: 100, 200
Dropship: 100, 200

 

 

 

 

Unit -> Object

리모컨의 참조변수 타입이 Object로 바뀌고, Object에는 move()가 없어서 에러 발생한다

public class abstractClass {
    public static void main(String[] args) {
        Object[] group = { new Marine(), new Tank(), new Dropship() }; // 밑 주석 한 줄로 만듬
//        Object[] 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); // 에러
        }
    }
}

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) {
        System.out.printf("Marine: %d, %d%n", x, y);
    }
    void stimPact() { }
}

class Tank extends Unit {
    void move(int x, int y) {
        System.out.printf("Tank: %d, %d%n", x, y);
    }
    void changeMode() { }
}

class Dropship extends Unit {
    void move(int x, int y) {
        System.out.printf("Dropship: %d, %d%n", x, y);
    }
    void load() { }
    void unload() { }
}