추상 클래스의 작성

essential·2023년 8월 21일

객체 지향

목록 보기
33/40

추상 클래스의 작성(1)

  • 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만든다.
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() {}
}

Unit[] group = new Unitp[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[] 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) // 에러!!! Object 클래스에 move메서드가 정의 되어 있지 않다.
  • 추상 메서드가 호출 되는 게 아니고 실제 인스턴스(Marine, Tank, Dropship)의 구현된 메서드가 호출 됨

Ex.7_10

public class Ex7_10 {
	public static void main(String[] args) {
		Unit[] group = { new Marine(), new Tank(), new Dropship() };
		// 위 코드와 네 줄의 코드는 같은 의미
		// 위 코드는 배열의 생성과 초기화를 한 번에 한 것
		// Unit[] group = new Unitp[3];
		// group[0] = new Marine();
		// group[1] = new Tank();
		// group[2] = new Dropship();
	
		for (int i = 0; i < group.length; i++)
		// group의 타입은 Unit[]/ group[0], group[1], group[2] 의 타입은 Unit
			group[i].move(100, 200);
		//group[0].move(100, 200); Marine 객체의 move(100,200) 을 호출
		//group[1].move(100, 200); Tank 객체의 move(100,200) 을 호출
		//group[2].move(100, 200); Dropship 객체의 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.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() { /* 선택된 대상을 내린다. */ }
}

추상 클래스의 작성(2)

  • 추상화(명확X) ↔ 구체화(명확)
    • 추상화 된 코드는 구체화된 코드보다 유연하다. 변경에 유리
    • GregorianCalendar cal = new GregorianCalendar(); // 구체적
    • Calendar cal = Calendar.getInstance(); // 추상적
      • 나라 별 캘린더라면 추상화 한 건 다형성에 의해 나라 별로 쓸 수 있음
profile
essential

0개의 댓글