충분히 쌓여가는
추상클래스의 작성 본문
추상클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나
기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다
추상클래스 사용 전
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() { }
}
'Java > 객체지향' 카테고리의 다른 글
인터페이스를 이용한 다형성 (0) | 2023.06.15 |
---|---|
인터페이스의 선언, 상속, 구현 (0) | 2023.06.15 |
추상 클래스(abstract class), 추상 메서드(abstract method) (0) | 2023.06.13 |
하나의 배열로 여러 종류 객체 다루기(다형성 장점 2) (0) | 2023.06.13 |
매개변수의 다형성(다형성 장점 1) (0) | 2023.06.13 |