샤브의 블로그 RSS 태그 관리 글쓰기 방명록
Device & Language (105)
2010-08-25 09:00:00
하루하루의 과제를 완성해 가면서 블로그를 만들어가고 있습니다.
오늘의 과제는 Main 함수가 작성되어 있는데 이에 맞는 CellPhone이라는 클래스를 완성하라는 과제입니다.

 CellPhone  
 String model  // 핸드폰 모델 번호
 double battery  // 남은 배터리 양
 CellPhone(String model)  // 모델 번호를 인자로 받는 생성자
 void call(int time)  // 통화 시간(분)을 출력하고, 통화 시간에 따라 배터리 양을 감소시킨다.
// 감소되는 배터리 양 = 통화시간(분) * 0.5
// 배터리 양은 0보다 작아지지 않는다.
// 통화 시간(분)이 0보다 작은 경우에는
IllegalArgumentException(“통화시간입력오류”)을 발생시킨다.
 void charge(int time)  // 충전한 시간(분)을 출력하고, 충전한 시간에 따라 배터리 양을 증가시킨다.
// 충전되는 배터리 양 = 충전시간(분) * 3
// 배터리 양은 100까지만 증가한다.
// 충전 시간(분)이 0보다 작은 경우에는
IllegalArgumentException(“충전시간입력오류”)을 발생시킨다.
 void printBattery()  // 남은 배터리 양을 출력한다.
 boolean equals(Object otherObject) // Object 타입의 객체를 입력받고, 입력받은 객체가CellPhone 타입의 클래스이면서 모델 번호가 같은 경우에 true를 리턴한다.

위와 같은 멤버변수와 메소드를 가지고 있습니다. 실제 실행 되는 쏘스를 한번 보시죠~

public class CellPhoneMain {
   public static void main(String[] args) { 
      CellPhone myPhone = new CellPhone("SCH-600");
  
      myPhone.charge( 20 );  //20분간 충전을 한다.
      myPhone.printBattery();
  
      myPhone.call( 300 );  //300분간 통화를 한다.
      myPhone.printBattery();
  
      myPhone.charge( 50 );  //50분간 충전을 한다.
      myPhone.printBattery();
  
      myPhone.call( 40 );  //40분간 통화를 한다.
      myPhone.printBattery();
  
      try {
         myPhone.call( -20 );  //통화시간이 잘못 입력되었다.
      } catch(IllegalArgumentException e) {
         System.out.println( e.getMessage() ); 
      } 
  
      CellPhone yourPhone = new CellPhone("SCH-600");
  
      if( myPhone.equals(yourPhone) ) {
         System.out.println("동일 모델입니다.");
      } else {
         System.out.println("다른 모델입니다.");
      } 
   }
}

위와 같은 소스를 가지고서 아래와 같은 결과가 나와야 합니다.

충전 시간 : 20분
남은 배터리 양 : 60.0
통화 시간 : 300분
남은 배터리 양 : 0.0
충전 시간 : 50분
남은 배터리 양 : 100.0
통화 시간 : 40분
남은 배터리 양 : 80.0
통화시간입력오류
동일 모델입니다.


이런 결과가 나오도록 해야하는 것입니다. 그래서 나온 녀석이 아래에 있습니다.

public class CellPhone {
   String model;
   double battery;

   public CellPhone(String model) {
      this.model = model;
   }

   void call(int time) {
      if (time < 0) {
         throw new IllegalArgumentException("통화시간입력오류");
      } else {
         System.out.println("통화 시간 : " + time + "분");
         battery = battery - time * 0.5;
         if (battery < 0)
            battery = 0;
      }
   }

   void charge(int time) {
      if (time < 0) {
         throw new IllegalArgumentException("충전시간입력오류");
      } else {
         System.out.println("충전 시간 : " + time + "분");
         battery = battery + time * 3;
         if (battery > 100)
            battery = 100.0;
      }
   }

   void printBattery() {
      System.out.println("남은 배터리 양 :" + battery);
   }

   public boolean equals(Object otherObject) {
      if((otherObject instanceof CellPhone)&&model.equals(((CellPhone) otherObject).model)){
         return true;
      }

      return false;
   }
}

간단한 소스이니 설명은 생략~ ^^;;;

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
Java StringBuilder vs StringBuffer  (1) 2010.08.23
Java Message Service spec  (0) 2010.08.22
자바를 이용한 부대활동(???)  (0) 2010.08.21
2010-08-24 00:38:35
자, 가장 먼저 해야 할 것은

1.자바 개발키트인 JDK를 다운받아야 합니다. 

왜냐면 이게 없으면 설치에 필요한 안드로이드 SDK가 안깔리더라고요.


둘 중 아무거나 클릭, 설치합니다.

2.이제 안드로이드 SDK를 다운받을 차례입니다.


여기 들어가셔서

요걸 다운받습니다.

그리고 적당한 폴더에 압축을 풉니다. 단, 사용자 계정이 한글이 아닌 영어로 된 계정에서 깔아야 합니다.
(한글 계정에서도 까는 방법이 있다는데 제가 몰라서 -_-; 죄송합니다)

3.안드로이드 SDK 셋업 파일을 엽니다.
압축을 푼 폴더에서 이걸 클릭하면 됩니다.

4. 드라이버와 툴즈를 다운받습니다.
어떻게 다운받느냐?

SDK 셋업을 클릭하면 요게 뜹니다.

셋팅에서 이걸 클릭 안하면 아무것도 다운이 안됩니다. 요걸 클릭합시다.

그 다음에


가능한 패키지를 찾은 다음에

안드로이드 SDK 드라이버 버전 6과 USB 드라이버 패키지 리비전 3를 클릭해서 다운 받습니다.
넥서스원 드라이버는 이렇게 안하면 다운 받는 곳이 없습니다 -.-;

스샷은 다운이 완료된 곳을 표시하는 것으로, 다운을 다 받으면 이렇게 표시됩니다.

자 이제 드라이버가 다 다운받아졌습니다.

요 부분에 usb 드라이버가 있습니다. 그리고 같이 다운 받은 개발툴은 그 위 tools에 있습니다.

5.넥서스원을 켜고 디버그 모드를 켭니다.

설정-어플리케이션 설정-개발에 들어가면

이런 메뉴가 있는데, USB 디버깅과 켜진 상태로 유지를 켜 주세요.

그리고 USB에 꽂아주시면, 

컴퓨터가 넥서스원을 인식 못하는 현상이 벌어집니다. --;
예. 다음 과정은

6.넥서스원 드라이버를 수동으로 업데이트해 줍니다.

인식은 못했지만 일단 화면에는 이렇게 뜰 겁니다.
제어판에서 장치 및 프린터에 넥서스 원이라고 떠 있을 겁니다.
우클릭해서 속성을 클릭해 주세요.
다시 속성을 클릭합니다.
드라이버 업데이트를 클릭합니다.
수동으로 드라이버를 찾아보겠다고 합니다.

드라이버는 안드로이드 SDK의 압축을 풀은 폴더 속 usb 드라이버 폴더로 위치를 잡아주면 됩니다.
업데이트 시킵니다.

7.환경변수를 설정해 줍니다.

환경변수는, 안드로이드 SDK 안에 있는 명령, 즉 "어플을 다 SD카드로 옮기게 해라" 를 가능하게 할려고
설정하는 겁니다.

내 컴퓨터를 엽니다.
고급 시스템 설정을 클릭합니다.

환경 변수를 클릭해 줍니다.
시스템 변수 값을 찾다 보면 Path 라는 값이 있을 겁니다. 
편집해 줍시다.

기존 변수값의 맨 뒤에 세미콜론(;) 을 붙여준 다음,
안드로이드 SDK가 깔린 경로\tools 까지 입력해 줍니다.

8.cmd 명령어를 실행해 줍니다.

시작-실행에서 cmd.exe를 실행시킵니다.
요런게 뜰 겁니다.

adb shell 을 타이핑 한 다음

pm setInstallLocation 2 라고 써 줍시다.

그런 뒤 휴대폰을 재부팅하고,

설정-어플리케이션 관리 에 들어가서 어플리케이션을 클릭하면,

모든 어플리케이션에서 "SD카드로 이동" 이라는 옵션이 생기는 것을 발견하실 겁니다.

백그라운드로 계속 돌아가는 프로그램,

위젯 프로그램을 제외하고 SD카드로 옮겨주세요.

사용후 이상이 발견되면 바로 "휴대폰으로 이동"을 클릭해 주시면 됩니다.

SD카드로 어플을 돌리면 부족한 내장메모리를 해결함은 물론

기분상(?) 인지 어플 돌아가는 속도가 왠지모르게 빨라졌다는 느낌을 받을수...도 있습니다.
(받을 수도 있다는 겁니다 -.-)

참고로 제가 Sd카드로 어플을 옮기고 난뒤
quadrant  벤치마크 어플을 작동시키니

80~100점 정도 향상을 보는 효과를 봤습니다. (모든 폰이 이렇게 되진 않을 겁니다. 더 효과가 좋을수도 있고..)


그럼, 이제 마음껏 어플을 까시면 되겠습니다. ^^


이 글은 다음 분들의 글에서 정보를 받아 작성했습니다.

참고 URL

넥서스원(NexusOne) 스크린캡쳐



2010-08-23 00:18:57

 

 

 StringBuilder

 StringBuffer

동기화 여부 

실행  속도 

 >

 쓰레드 사용

비추 

추천 

자바 지원 버전 

1.5 

1.0 

상호 호환 

StringBuilder와 StringBuffer간의 호환 됨...

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java Message Service spec  (0) 2010.08.22
자바를 이용한 부대활동(???)  (0) 2010.08.21
2010-08-22 01:07:46

[출처:ORACLE]
1.1 관념
  이 명세서는 JavaTM 메시지 서비스(JMS)의 목적과 기능을 설명해줍니다. JavaTM 메시지 서비스(JMS)은 자바프로그램이 엔터프라이즈 메시징 서비스의 메시지를 만들거나 보내고 받고 읽는 일반적인 역할을 제공합니다.

1.2 개요
  엔터프라이즈 메시징 제품(또는 메시지 지향 미들웨어 제품)은 통합 내부 작업에 필수적인 컴포넌트가 되고 있다. 이런 제품들은 신뢰할 수 있고 유연한 시스템으로 통합하는 비지니스 컴포넌트를 분리할 수 있다. 전통적인 메시지 지향적인 미들웨어 벤더들 외에도 엔터프라이즈 메시징 제품들은 또한 몇몇의 데이터베이스 벤더들과 많은 인터넷 관련 회사들에 의해서도 제공됩니다. 자바 언어 클라이언트와 자바언어기반 미들 계층 서비스는 이 메시징 시스템을 사용할 수 있는 능력이 있어야 한다. 자바 메시징 서비스(이하 JMS)는 자바 언어 프로그램이 이 시스템에 접근하는 일반적인 방법을 제공한다. JMS는 엔터프라이즈 메시징 제품에 JMS 클라이언트가 접근하는 방법을 정의하는 인터페이스와 관련된 시맨틱들의 집합이다.

  메시징이 피어 투 피어인 이래로, JMS의 사용자들은 일반적으로 클라이언트로 여겨진다. JMS 어플리케이션은 메시지를 교환하는 클라이언트의 집합과 메시지를 정의하는 어플리케이션의 집합으로 구성된다. JMS를 충족시키는 제품은 JMS 인터페이스들을 포함하는 프로바이더가 제공함으로 작동된다.

1.2.1 JMS는 Mail API인가?
  메시징은 컴퓨팅 분야에서 꽤널리 정의되어있다. 그것은 다양한 운영체제 개념을 묘사하는데 사용되어지고 이메일과 팩스 시스템을 묘사하기 위해서도 사용되어지며 엔터프라이즈 어플리케이션간에 비동기식 커뮤니케이션을 묘사하는데에도 사용되고있기 때문이다. 여기서 묘사된 바와 같이 메시지는 사람이 아닌 엔터프라이즈 어플리케이션에 의해 소모되는 비동기식 요청, 리포트, 이벤트들이다.
  메시지는 이런 시스템을 조정하는데 필요한 중요한 정보를 포함하고 특정 비지니스 액션을 묘사하는 정밀하게 형식화된 데이터를 포함한다. 이러한 메시지들의 교환을 통해서 각각의 어플리케이션들은 엔터프라이즈의 진행을 추적한다.

1.2.2 기존 메시지 시스템
  메시징 시스템은 피어투피어 기술이다. 보편적으로, 각각의 클라이언트들은 메시지를 다른 클라이언트와 주고 받을수 있다. 각각의 클라이언트는 메시지를 만들고 주고 받기 위한 기술을 제공하는 메시징 에이전트와 연결되어 있다.
  각각의 시스템은 메시지에 접근하고 만들어서 데이터를 채우는 방법을 제공한다. 어떤 시스템은 많은 목적지로 메시지를 브로드캐스팅할수 있는 능력이 있는가 하면 다른 시스템은 하나의 목적지로만 메시지를 보낼 수 있다. 일부 시스템은 메시지의 비동기 수신을 위한 기술을 제공합니다.(메시지가 도착하면 클라이언트에게 전달된다.) 다른 시스템은 동기 수신만을 제공한다.(클라이언트는 각각의 메시지를 요청해야 한다.) 각각의 메시징 시스템은 일반적으로 메시지 기반 당 선택할 수 있는 서비스의 범위를 제공합니다. 한 가지 중요한 속성은 시스템이 배달을 보장할 수 있는 길이다.
  이것은 단순하고 최선의 노력과 보장에 따라 다르지만 단 한번의 배달이다. 다른 중요한 속성은  살아있고 우선순위가 있으며 응답이 필수적인 메시지이다.

1.2.3 JMS 목적
  JMS는 메시징 시스템의 모든 기능의 집합을 제공하는 경우, 의도한 사용자에게 매우 복잡할 것입니다. 반면에 JMS는 모든 제품들에게 메시징의 일반적인 특징의 공통점 그 이상이다. JMS는 복잡한 엔터프라이즈 응용 프로그램을 구현하는 데 필요한 기능을 포함하는것은 중요하다. JMS는 엔터프라이즈메시징의 개념과 기술의 공통 집합을 정의합니다. JMS는 Java 언어 프로그래머가 엔터 프라이즈 메시징 제품을 사용하도록 배워야하는 개념의 집합을 최소화하려고 시도합니다. JMS는 애플 리케이션을 메시징의 이동성을 최대화하기 위해 노력하고 있습니다.

1.2.3.1 JMS 프로바이더(provider)
앞서 언급한 것처럼, JMS provider는 메시징 제품을 위해 JMS를 구현한 부분을 제공합니다. 이상적으로 JMS provider들은 애플릿과 같이 순수 자바에서 사용될 것이다. 설치를 간단하게 하고 운영체제나 아키텍쳐를 넘어서 작업할수 있습니다. JMS의 중요한 목표는 provider를 구현하기위해 필요한 작업을 간소화하는 것입니다.
 

1.2.3.2 JMS 메시지
JMS는 메시지 인터페이스들의 집합을 정의한다. 클라이언트는 JMS provider에 의해 지원되도록 구현된 메시지를 사용한다. JMS의 주 목적은 클라이언트가 JMS provider에 독립적인 메시지를 생성하고 작업하는 모순되지 않는 API를 가지는 것이다.

 

1.2.3.3 JMS 도메인
메시징 제품은 크게 포인트투포인트 또는 구독 게시시스템으로 분류할 수 있다. 피투피제품은 메시지큐의 개념으로 만들어져있다. 각각의 메시지는 특정큐로 찾아간다. 클라이언트는 그들의 메시지를 가지고 있는 큐로부터 메시지들을 추출한다. 게시/구독 클라이언트가 콘텐츠 계층에서 어떤 노드에 메시지들의 주소를 지정한다. 게시자들과 구독자들은 일반적으로 익명이고 콘텐츠 계층 구조를 동적으로 게시하거나 구독할 지도 모른다. 시스템은 노드의 여러 게시자로부터 다수의 구독자에게 도착하는 메시지들의 분배를 다룬다. 각 도메인의 시멘틱들을 지원하면서 JMS는 클라이언트가 두 도메인에서 메시지를 주고 받을 수 있는 인터페이스의 집합을 제공합니다. 또한 JMS는 클라이언트 인터페이스를 각 도메인에 맞게 제공합니다. JMS 1.1 버전 이전에서는, 각 도메인에 맞게 조정되는 클라이언트 인터페이스만 사용할 수 있었다. 이러한 인터페이스는 이전 버전의 JMS 클라이언트를 구현에 대한 호환성을 제공하기 위해 지원을 계속합니다. 클라이언트를 구현하기 위한 기본 접근 방법은 도메인 독립적인 인터페이스를 사용하는 것입니다. "공통 인터페이스"로 참고되는 이러한 인터페이스는 도메인의 특정 인터페이스의 부모입니다.

 

1.2.3.4 이식성

기본 이식의 목표는 새로운, JMS, 어플리케이션들이 동일한 메시징 도메인 내에서 제품간에 이식이 되는 것입니다. 이것이 기계 구조와 운영체제를 넘어서는 JMS 클라이언트의 예상되는 이식성이다. 

Although JMS is designed to allow clients to work with existing message
formats used in a mixed language application, portability of such clients is not
generally achievable (porting a mixed language application from one product
to another is beyond the scope of JMS).

JMS는 클라이언트가 기존의 메시지 형식으로 혼합 언어 응용 프로그램에서 사용되는 이러한 클라이언트의 이동성 작동하도록 설계되어 있지만 일반적으로 달성되지 않습니다

 

 

1.2.4 What JMS Does Not Include
JMS does not address the following functionality:
• Load Balancing/Fault Tolerance - Many products provide support for
multiple, cooperating clients implementing a critical service. The JMS API
does not specify how such clients cooperate to appear to be a single, unified
service.
• Error/Advisory Notification - Most messaging products define system
messages that provide asynchronous notification of problems or system
events to clients. JMS does not attempt to standardize these messages. By
following the guidelines defined by JMS, clients can avoid using these
messages and thus prevent the portability problems their use introduces.
• Administration - JMS does not define an API for administering messaging
products.
• Security - JMS does not specify an API for controlling the privacy and
integrity of messages. It also does not specify how digital signatures or keys
are distributed to clients. Security is considered to be a JMS providerspecific
feature that is configured by an administrator rather than controlled
via the JMS API by clients.
• Wire Protocol - JMS does not define a wire protocol for messaging.
• Message Type Repository - JMS does not define a repository for storing
message type definitions and it does not define a language for creating
message type definitions.

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java StringBuilder vs StringBuffer  (1) 2010.08.23
자바를 이용한 부대활동(???)  (0) 2010.08.21
2010-08-21 15:11:08

자~ 제목은 거창하지만 사실 내용은 별게 없습니다.
현재까지 배운 쏘스를 고쳐서 만드는 작업으로 현재 듣는 강의의 소스입니다~ ^^;;;
하나하나 해 가면서 첨부해 나갈 수도 있을 것이라고 생각합니다.

일단 과제는 이렇습니다.

1. 모든 병사는 건강도를 갖는다.
2. 척후병은 적군의 동태를 감시하다가 적군이 움직이면 지휘관에게 보고를 한다. 매번 보고때마다 건강도는 2씩 감소한다.
3. 지휘관은 척후병의 주어진 정보를 바탕으로 소총수에게 공격과 방어를 명령하낟. 이때, 적군의 수가 5명 이하이면 공격을 초과이면 방어를 하도록 한다.
4. 소총수는 소총으로 공격과 방어를 한다. 한번의 공격에 총알 5개를 사용하고, 한번의 방어에 총알1개를 사용한다. 건강도는 한번 공격때 5씩 감소하고, 한번 방어할 때 10씩 감소한다.
5. 소총수는 총탄이 떨어지면 지휘관에게 보고를 한다.
6. 지휘관은 소총수에게 총탄이 남아 있는 한 총탄을 지급한다. 한번 지급되는 총탄은 50발이다. 하지만 총탄이 모자라면 적게 줄 수도 있다.
7. 지휘관은 소총수의 건강도를 체크하다가 건강도가 70이하가 되면, 취사병에게 식사를 준비시킨다. 취사병이 식사를 먹일 때마다 지휘관과 척후병은 1씩, 나머지 병사들의 건강도는 10씩 증가한다.

위의 문제를 현재까지 배운 내용을 가지고서 분석/작성하는 것입니다.

그래서 제일 먼저 공통 사항을 뽑아 냈습니다.
위의 사람들은 사람이면서 군인입니다.
그래서 나온 녀석이 Soldier 클래스~

public abstract class Soldier {
   final static int MAXHEALTH = 100 ;
   final static int MINHEALTH = 0 ;
   final static int MAXBULLETIN = 280 ;
   final static int MINBULLETIN = 0 ;
 
   private int health =  80 ;
   private int bullet = 50 ;
 
   public int getHealth() {
       return health;
   }

   public void setHealth(int health) {
      this.health = health;
   }

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
 
   abstract void incHealth();
}


위에서 보시는 바와 같이 health와 bullet을 공통적으로 가지고 있으며 식사를 하게 되면 건강도가 올라가야 해서 3가지 공통 요소를 뽑아냈습니다.

그리고 다음은 척후병입니다.
척후병은 지휘관에게 보고를 해야하기에 지휘관이 누구인지를 정확하게 알아야 합니다.

import java.util.Random;

public class Scout extends Soldier {
   void reportNum(Commander commander) {
      int num = 0;
      Random r = new Random();
      num = r.nextInt(10) + 1;
      System.out.println("적 " + num + "명 출현!!!!!");
      decHealth(num);
      commander.report(num);
   }

   void decHealth(int num) {
      if (getHealth() < 2) {
         setHealth(0);
         System.out.println("척후병이 죽었습니다.");
         System.exit(0);
      } else {
         setHealth(getHealth() - 2);
         System.out.println("척후병의 HP:" + getHealth());
      }
   }

   void incHealth() {
      setHealth(getHealth() + 1);
      System.out.println("철후병의 HP:" + getHealth());
   }
}


보고를 할 때는 지휘관이 누구인지 알아야 하기에 지휘관의 클래스를 인자로 받는 함수를 선언하였습니다.
그리고 보고 할때마다 건강도가 감소해야한다는 조건이 있어서 decHealth와 report 함수를 호출하게 되어있습니다.

public class Commander extends Soldier {
   Rifleman rifle;
   Cooksoldier cook;
   Scout scout;
   Magazine magazine;

   public Commander(Rifleman rifle, Cooksoldier cook, Scout scout, Magazine magazine) {
      this.rifle = rifle;
      this.cook = cook;
      this.scout = scout;
      this.magazine = magazine;
   }

   void incHealth() {
      if (getHealth() != 100) {
         setHealth(getHealth() + 1);
      }
      System.out.println("지휘관의 HP:" + getHealth());
   }

   void giveBullet() {
      if (magazine.getBullet() > 50) {
         magazine.setBullet(magazine.getBullet() - 50);
         System.out.println("탄 50발을 소총수에게 보급하였습니다.");
         System.out.println("탄약고 잔탄:"+magazine.getBullet());
         rifle.incBullet(50);
      } else if(magazine.getBullet() > 0) {
         rifle.incBullet(magazine.getBullet());
         System.out.println("탄 " + magazine.getBullet() + "발을 소총수에게 보급하였습니다.");
         magazine.setBullet(0);
      } else{
         System.out.println("탄약고가 비었습니다.");
      }
   }

   void report(int num) {
      if (num > 5) {
         System.out.println("지휘관:방어하라!!!");
         rifle.command(this, 2);
      } else {
         System.out.println("지휘관:공격하라!!!");
         rifle.command(this, 1);
      }
      if (rifle.getHealth() <= 70)
         checkHealth();
      }

   void checkHealth() {
      System.out.println("취사병~!!! 밥준비해~~~");
      cook.cooking(this);
   }
}


지휘관은 척후병에게 보고 받은 사항에 대해서 판단을 하여 공격인지 방어인지에 대해서 소총수에게 명령을 하게 되고 소총수가 총탄이 떨어지는 경우에는 탄약고에 있는 총탄을 소총수에게 주는 작업을 하게 되어 있고 또한 소총수의 건강도를 점검하다가 70이하로 떨어진 경우에는 취사병에게 취사명령을 하여 모든 군인들의 건강도를 올리도록 합니다.

다음은 소총수 입니다.

public class Rifleman extends Soldier {
   void decHealth(Commander commander, int command) {
      int temp = getHealth();
      switch (command) {
      case 1:
         if (temp > 5) {
            setHealth(getHealth() - 5);
         } else {
            setHealth(0);
         }
         break;
      case 2:
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
         }
         break;
      }
      temp = getHealth();
      if (getBullet() == 0) {
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
            System.out.println("소총수가 죽었습니다.");
            System.exit(0);
         }
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void decBullet(Commander commander, int code) {
      switch (code) {
      case 1:
         if (getBullet() > 5) {
         setBullet(getBullet() - 5);
         System.out.println("소총수가 5발을 소모하였습니다.[" + getBullet() + "]");
      } else if (getBullet() > 0) {
         System.out.println("소총수가 " + getBullet() + "발을 소모하였습니다.[0]");
         setBullet(0);
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   case 2:
      if (getBullet() > 1) {
         setBullet(getBullet() - 1);
         System.out.println("소총수가 1발을 소모하였습니다.[" + getBullet() + "]");
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   }

   if (getBullet() < 1)
      commander.giveBullet();
   }

   void incBullet(int num) {
      setBullet(getBullet() + num);
      System.out.println("소총수가 " + num + "발을 보충받았습니다.");
   }

   void command(Commander commander, int code) {
      switch (code) {
      case 1:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      case 2:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      }
   }
}


소총수는 지휘관에게 명령을 받으면 공격이나 방어를 하면서 건강도가 변하게 되고 총탄도 소모하게 됩니다. 그리고 총탄을 소모하게 되면 지휘관에게 보고 하고 총탄을 보급받게 되어 있습니다.

다음은 밥만 짓는 취사병이네요~

public class Cooksoldier extends Soldier {
   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("취사병의 HP:" + getHealth());
   }

   void cooking(Commander commander){
      commander.incHealth();
      incHealth();
      commander.rifle.incHealth();
      commander.scout.incHealth();
   }
}


병사들 중에 가장 간단한 클래스네요. 밥져주고 건강도가 올라가는 함수로 구성되어 있습니다.
마지막으로 탄약고입니다.
클래스 상속은 없는 간단한 클래스 입니다.

public class Magazine {
   int bullet = 70;

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
}


여기 까지 모든 클래스가 끝났네요~
위의 클래스들을 돌려주는 클래스를 한번 보시죠~

public class ArmyDemo {
   public static void main(String[] args) {
      Cooksoldier cook = new Cooksoldier();
      Rifleman rifle = new Rifleman();
      Scout scout = new Scout();
      Magazine magazine = new Magazine();
      Commander commander = new Commander(rifle, cook, scout, magazine);

      while (true) {
         scout.reportNum(commander);
      }
   }
}


총탄을 280로 주면 100% 사람이 죽기에 총탄수와 건강도의 기본 값을 수정하여 테스트 해보았습니다.

적 3명 출현!!!!!
척후병의 HP:78
지휘관:공격하라!!!
소총수의 HP:75
소총수가 5발을 소모하였습니다.[45]
적 5명 출현!!!!!
척후병의 HP:76
지휘관:공격하라!!!
소총수의 HP:70
소총수가 5발을 소모하였습니다.[40]
취사병~!!! 밥준비해~~~
지휘관의 HP:81
취사병의 HP:90
소총수의 HP:80
철후병의 HP:77
.................................................
....중간 생략....
.................................................
적 10명 출현!!!!!
척후병의 HP:24
지휘관:방어하라!!!
소총수의 HP:5
보유한 탄이 없습니다.
탄약고가 비었습니다.
취사병~!!! 밥준비해~~~
지휘관의 HP:100
취사병의 HP:100
소총수의 HP:15
철후병의 HP:25
적 1명 출현!!!!!
척후병의 HP:23
지휘관:공격하라!!!
소총수가 죽었습니다.

누군가가 죽으면 끝나게 만들어서 이렇게 되는 군요~
총탄도 많고 건강도가 조금씩 떨어져서 이렇게 내용이 좀 적네요~^^

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java StringBuilder vs StringBuffer  (1) 2010.08.23
Java Message Service spec  (0) 2010.08.22