1. 탈 것을 나타내는 Vehicle 클래스를 추상 클래스로 정의하여 보자.
먼저 다음과 같은 코드를 입력하자.
abstract class Vehicle
{
public abstract double getKilosPerLiter();
}
1) 추상 클래스에 필드를 추가할 수 있는지를 알아보기 위하여 Vehicle 클래스에
정수형 변수 speed를 추가하여보자.
2) 추상 클래스에 메소드를 추가할 수 있는지를 알아보기 위하여 현재 속도를 문자열로 출력하는
printSpeed()메소드를 추가하여 보자.
3) 위의 추상 클래스를 테스트하기 다음과 같은 테스트 클래스를 작성하여 보자.
public class vehicle
{
public static void main(String[] args)
{
______________________________________ (1)
}
}
4) 추상 클래스로 객체를 생성할 수 있는지 알아보기 위하여 (1)위치에서 객체생성 문장을 작성하고
컴파일하여보자, 결과를 기록하자.
5) 위의 추상 클래스를 상속받아서 Car클래스를 정의하여 보자.
반드시 구현하여야 할 메소드는 무엇인가?
class Car extends Vehicle
{
______________________________________________________
}
6) VehicleTest 클래스의 main()에서 Car객체를 생성하여 보자.
Car객체를 통하여 getKilosPerLiter(), printSpeed()메소드를 호출하여 보자.
abstract class Vehicle
{
int speed=0;
int printSpeed()
{
return speed;
}
public abstract double getKilosPerLiter();
}
class Car extends Vehicle
{
public double getKilosPerLiter()
{
return 0;
}
}
public class vehicle
{
public static void main(String[] args)
{
Car car = new Car();
System.out.println( car.getKilosPerLiter() );
System.out.println( car.printSpeed() );
}
}
2. 다음과 같은 인터페이스를 구현하여 보자.
interface Movable
{
public abstract void speedUp(int amount);
public abstract void speedDown(int amount);
}
1) 메소드를 정의할 때 abstract를 생략하여도 되는지 실험하여 보라.
2) 인터페이스 안에 다음과 같이 속도를 나타내는 speed 변수를 추가할 수 있는지 실험하여 보자.
어떤 오류 메시지가 나오는가?
int speed;
- 초기화가 되지 않았음
3) speed의 정의를 다음과 같이 변경하면 어떻게 되는가?
int speed = 100;
- 사용가능
이 경우 speed는 어떻게 취급되는가? 다음과 같이 변경하여 보자.
final int speed = 100;
- 상수화 되어 사용가능
4) 인터페이스에 메소드를 추가할 수 있는지를 알아보기 위하여 현재 속도를 문자열로 출력하는 printSpeed()메소드를 추가하여 보자.
5) 인터페이스를 구현한 Car 클래스를 정의하여 보자.
반드시 구현하여야 할 메소드는 무엇인가?
필요한 필드들과 TurnLeft(), TurnRight() 메소드를 추가하라.
6) CarTest 클래스의 main()에서 Car 객체를 생성하여 보자.
Car 객체를 통하여 speedUp(), speedDown() 메소드를 호출하여 보자.
7) Movable 참조 변수로 Car 객체를 참조하여 보라.
speedUp() 메소드를 참조하여 보자.
TurnLeft()나 TurnRight() 메소드도 호출할 수 있는가?
8) 여러가지 형 변환을 테스트하여 보자.
interface Movable
{
final int speed=100;
public abstract void speedUp(int amount);
public abstract void speedDown(int amount);
}
abstract class Car implements Movable
{
String printSpeed()
{
return "현재 속도는 " + speed + "입니다.";
}
String TurnLeft()
{
return "현재 속도는 " + speed + "입니다.";
}
String TurnRight()
{
return "현재 속도는 " + speed + "입니다.";
}
}
public class test
{
public static void main(String[] args)
{
// 출력 생략
}
}
3. vehicle 클래스를 상속받고 Movable 인터페이스를 구현하는 Car클래스를 작성하여 보자,
필요한 필드들과 생성자, 메소드들을 모두 포함시켜라.
몇 개의 Car객체를 생성하여서 테스트하라.
4. 간단한 게임 프로그램을 다형성을 이용하여서 작성하여 보자.
게임에는 많은 캐릭터들이 있다.
예를 들어서 호빗, 타이탄, 주술사 등이 있다.
이들 클래스들이 공통의 수퍼클래스 GameCharacter로부터 상속받앗다고 가정하라.
이 클래스는 draw()라는 메소드를 가지고 있다.
각 서브 클래스는 이 draw()메소드를 재정의 한다.
이들 캐릭터들은 GameCharater 배열에 참조값이 저장된다.
화면을 다시 그리기 위하여 프로그램들은 주기적으로 모든 캐릭터의 draw()를 호출한다.
예를 들어서 호빗의 경우, draw()가 호출되면 콘솔에 "호빗을 그립니다."라고 출력한다.
1) 타이탄을 나타내는 클래스 Titan과 주술사를 나태내는 클래스 Sorcerer도 같은 방법으로 정의해보라.
2) 이들 클래스들을 테스트할 수 있는 클래스 Test를 생성하여서 호빗, 타이탄, 주술사 객체를 생성하여 보자.
3) g1.getLife()과 같이 호출하여 보자.
4) g1.getRing()를 호출하여 보자. 오류가 발생한다면 그 이유는?
5) ((Hobitt)g1).getRing()와 같이 호출하여 보자. 결과를 기록하라.
6) 호빗, 타이탄, 주술사를 각각 2개씩 생성하고 이들을 모두 arrary라는 배열에 저장하라.
배열의 타입은 무엇으로 하면 좋은가?
7) 반복 루프를 사용하여서 array배열 안에 저장된 객체에 대하여 draw() 메소드를 호출하여보자.
어떤 draw()가 호출되는가?
8) 7번을 별도의 메소드 drawAll()로 독립시켜 보자.
배열을 매개 변수로 전달하라.
9) drawAll()의 매개 변수를 Object타입의 배열로 할 수 있는가?
drawAll()에서 instanceof연산자를 사용하여서 각 객체의 타입을 분류하여 보자.
10) 게임에 필요한 필드와 생성자, 접근자, 설정자 메소드를 추가로 구현해보자.
abstract class GameCharacter
{
public GameCharacter()
{
}
public void draw()
{
System.out.println("GameCharacter()의 draw()");
}
public void getRing()
{
System.out.println("GameCharacter()의 getRing()");
}
}
class hobit extends GameCharacter
{
public void draw()
{
System.out.println("호빗을 출력합니다.");
}
}
class taitan extends GameCharacter
{
public void draw()
{
System.out.println("타이탄을 출력합니다.");
}
}
class magicion extends GameCharacter
{
public void draw()
{
System.out.println("마법사를 출력합니다.");
}
}
public class test
{
public static void main(String[] args)
{
GameCharacter g1 = new hobit();
GameCharacter g2 = new taitan();
GameCharacter g3 = new magicion();
GameCharacter g4 = new hobit();
GameCharacter g5 = new taitan();
GameCharacter g6 = new magicion();
GameCharacter[] inben = new GameCharacter[6];
g1.getRing();
inben[0] = g1;
inben[1] = g2;
inben[2] = g3;
inben[3] = g4;
inben[4] = g5;
inben[5] = g6;
for(int i=0; i<6; i++)
inben[i].draw();
}
}
'Study > Java' 카테고리의 다른 글
| 자바 다이얼로그 틀 (0) | 2012.06.28 |
|---|---|
| 자바 입력 다이얼로그 (0) | 2012.06.28 |
| Power Java 12장 프로그래밍 (0) | 2012.06.28 |
| Power Java 12장 연습문제 (0) | 2012.06.28 |
| Power Java 11장 LAB (0) | 2012.06.28 |