'자바 Basic/자바언어의핵심'에 해당되는 글 14건

  1. 2007.11.30 자바공부-14.첫번째 자바프로그램



















첫번째 자바프로그램을 만들어 보겠습니다. 

지금까지 배운 것을 바탕으로 Zealot클래스와 Player클래스를 설계해봤습니다.

 

Zealot 클래스

 

/**

*            스타크래프트 프로토스 유닛 질럿입니다.

*/

public class Zealot {

          int strength;                                                               // 질럿의 체력

          int shields;                                                                // 질럿의 쉴드

          static int attack = 16;                                      // 기본 공격력을 16을 초기화

          static int armor = 1;                                        // 기본 아머를 1로 초기화

          /**

          *            질럿의 멤버변수를 초기화하는 생성자

          */

     public Zealot() {

                   strength = 100;                                 // 체력을 100으로 초기화

                          shields = 100;                                  // 쉴드를 100으로 초기화

            }

             /**

             *            질럿의 체력을 구합니다.

             */

     public int getStrength() {                                     

                          return strength;

             }

             /**

             *            질럿의 쉴드를 구합니다.

             */

             public int getShields() {

                          return shields;

             }

             /**

             *            질럿의 공격력을 구합니다.

             */         

             public static int getAttack() {

                          return attack;

             }

             /**

             *            질럿의 아머를 구합니다.

             */         

             public static int getArmor() {

                          return armor;

             }

             /**

             *            질럿 종족의 기본 공격력을 증가시킵니다.

             */

             public static void attackUpgrade() {                

                           attack++;

             }

             /**

             *            질럿 종족의 기본 아머를 증가시킵니다.

             */

             public static void armorUpgrade() {                

                           armor++; 

      }

             public void sound() {                       // My Life For Aiur 를 화면에 출력합니다.

                          System.out.println("My Life For Aiur");                          

             }

}

예제 1 - 23  Zealot.java

 

예제 1 - 23에서는 Zealot 클래스를 새롭게 만들어 보았습니다.

 

public 지정자

 

우선 사용자 데이터형을 만드는 class 키워드 앞에 public을 추가로 붙혔고, static 메소드와

멤버 메소드 앞에도 public을 추가했습니다.

public의 의미를 아주 간명하게 말한다면 만들어진 질럿 객체가 메소드를 외부에 공개한다

는 의미입니다.

일반적으로 자바에서 객체를 이용하는 방법은  객체를 만들고 만든 객체와 레퍼런스를

결합시킨후에, 레퍼런스를 이용하여 객체의 메소드를 호출하면 객체는 클래스에 정의된

메소드의 내용을 실행합니다.

 

만약 클래스설계자가 메소드앞에 public을 붙여놓았다면 이런 메커니즘이 항상 허용됩니다.

하지만 만약 클래스 설계자가 메소드 앞에 public을 붙여 놓지 않았다면 어떻게 될까요?

조금 복잡하긴 한데 기본적으로 질럿 객체의 메소드를 호출할 수 없다고 생각하면 됩니다.

이런 이유로 객체가 할 수 있는 행동을 정의해놓은 메소드 앞에 public이 붙여 있는 것이

일반적입니다.

 

변수의 초기화

 

질럿 클래스는 두개의 멤버변수를 갖고 있습니다. 체력과 쉴드입니다.

스타크래프트를 경험해 본 독자라면 모두 아시겠지만 질럿은 만들어 질 때 체력과 쉴드의

값이 100 으로 만들어지고, 전투를 할 때 점차로 줄어듭니다.

항상 체력과 쉴드의 초기값이 100이어야 합니다. 이런 멤버변수의 초기화 과정은

대부분 생성자에서 이루어 집니다.

질럿 클래스에서도 생성자에서 체력과 쉴드의 값을 100으로 초기화 했습니다.

멤버변수의 초기화를 생성자에서 수행하면 만들어진 질럿 객체는 자신의 멤버변수를 별도로

초기화 해줄 필요가 없기 때문에 아주 편리합니다.

 

질럿클래스는 두개의 static 변수를 갖고 있습니다. 기본공격력과 기본아머입니다.

기본 공격력이 16의 값을 가진 것은 질럿이 한번 공격할 때 상대방 유닛에게 입히는

데미지가 16이라는 것이고,기본 아머가 1의 값을 가지는 것은 질럿이 상대방 유닛으로부터

공격을 당할 때 데미지를 얼마나 덜 입느냐 하는 수치입니다.

만약 공격력이 5인 마린이 질럿을 공격한다면 질럿은 기본 아머가 1이기 때문에 실제로는

4의 데미지만 입게 됩니다.

두개의 static 변수는 질럿 한마리,한마리마다 독립적으로 관리가 되어서는 안되고,

모든 질럿에게 공통으로 적용되어야 하는 개념을 가진 변수이기 때문에 static 키워드를

붙여 static 변수로 선언했습니다.

 

질럿의 기본 공격력과 기본 아머 역시 질럿이 만들어 질 때 이미 초기화 되었으면

좋겠습니다. 멤버변수의 초기화는 생성자를 이용하는데,불행히도 기본공격력, 기본아머는

멤버변수가 아니므로 생성자에서 초기화 해서는 안됩니다.

만약 생성자에서 초기화를 한다면 상당한 문제가 발생합니다.

질럿 한마리 한마리가 만들어 질때마다, 기본공격력, 기본아머가 항상 초기화 시키는

값으로 되돌아갑니다. 왜냐하면 attack,armor 변수는 클래스당 1개만 있는 변수이고

모든 질럿들이 공통적으로 공유하는 변수인데, 생성자에서 공유하는 변수의 값을 수정

해버리른 셈이되니까 말입니다.

예제 1 - 23의 질럿클래스 처럼 일반적으로 static 변수는 변수 선언과 동시에 초기화를

수행합니다.

 

          static int attack = 16;                         // 질럿 클래스 하나뿐인 공격력을 저장하는 변수를 초기화

             static int armor = 1;                           // 질럿 클래스 하나뿐인 아머를 저장하는 변수를 초기화

 

예제 1-23 질럿클래스에서 변수의 초기화를 하는 것을 보면 멤버변수는 생성자에서,

static 변수는 변수선언과 동시에 초기화를 합니다.

이는 질럿클래스 뿐아니라 자바의 모든 클래스에도 적용됩니다.

 

 

멤버메소드와 static 메소드

 

클래스 설계자는 객체의 상태는 멤버변수를 통해서 구현하고, 객체가 수행하는 기능은

멤버 메소드를 통해서 구현합니다. 이런 관점에서 본다면 질럿 클래스를 설계자는

질럿 객체에게 3가지의 기능을 부여 했습니다.

 

첫째는 현재의 체력이 얼마인지 알아볼 수 있게 한 것이고, 둘째는 현재의 쉴드의 값이

얼마인지 알아볼 수 있게 한 것이고, 셋째는 질럿으로 하여금 소리를 내게 하는 것입니다.

각각의 메소드는 실제로 메소드의 내용에 걸맞게 어울리는 이름을 갖고 있고, 걸맞는

값을 돌려주고 있습니다.

예제 1 - 23의 질럿클래스의 멤버메소드 public int getStrength() 메소드는 질럿 객체의

체력(strength)를 구하는 메소드이며, 반환되는 체력의 값이 int형의 값인 것을 알려줍니다.

그리고  질럿 전체의 특성을 저장하고 있는 기본 공격력과 기본 방어력은 질럿 객체에 속한

변수가 아니므로 static 으로 선언해서 질럿객체을 만들지 않고도 읽고,쓸수 있습니다.

질럿 클래스 설계자는 4개의 static 메소드를 만들었는데, 현재 질럿들의 기본공격력,

기본 아머의 값을 알아 내는 메소드와 공격력과 아머의 값을 증가시키는 메소드입니다.

이렇게 4개의 메소드를 static 으로 선언한 이유는스타크래프트 게임에서 프로토스의 건물

포지에서 지상군의 공격력 업그레이드가 완성되면 질럿의 공격력이 증가되는데 이 때 질럿

을 만들지 않고도 모든 질럿의 기본 공격력을 높여주어야 하기 때문입니다.

             static 메소드의 사용법은 객체에 대한 호출이 아니므로 객체의 존재는 필요치 않고

다만 클래스이름.메소드이름의 구조를 가집니다.

질럿의 공격력을 1 증가 시키는 방법은 Zealot.upgradeAttack();              이고, 아머를 증가시키는

방법은 Zealot.upgradeArmor(); 을 호출하면 됩니다.

자바의 static 메소드는 객체가 없이도 클래스이름과 static 메소드를 바로 호출할 수

있기 때문에 C 언어로 비교해본다면, C 언어의 함수와 자바에서의 static 메소드가 가장

비슷 하다고 생각합니다.

예제 1 - 23 Zealot.java로 저장했습니다.

 

이 질럿을 개념화한 질럿클래스를 Zealot.java로 저장하겠습니다.

public class로 시작하는 클래스는 반드시 클래스 이름과 파일이름이 같아야 합니다.

 

Player 클래스

예제 1 - 24 Player라는 클래스입니다. Player 클래스는 질럿 객체를 만드는 방법과

질럿 객체의 메소드를 호출하는등, 질럿 클래스에서 제공하는 기능을 사용해보는

간단한 객체입니다.

 

/**

* 스타크래프트를 하는 플레이어입니다. 질럿을 몇마리 만듭니다.

*/

public class Player {

             public static void main(String[] args) {                        

 

                           Zealot z1 = new Zealot();    // z1 질럿을 만듭니다.

                           Zealot z2 = new Zealot();    // z2 질럿을 만듭니다.

                           z1.sound();                                                                           

                           z2.sound();                                                                           

 

                           System.out.println("z1 strength " + z1.getStrength());

                           System.out.println("z2 strength " + z2.getStrength());

                           System.out.println("z1 attack " + z1.getAttack());

                           System.out.println("z2 attack " + z2.getAttack());

            

                           Zealot.attackUpgrade();                    // 공격력 증가시키는 static 메소드 호출

                          

                           System.out.println("z1 attack " + z1.getAttack());

                           System.out.println("z2 attack " + z2.getAttack());

             }

}

예제 1 - 24

 

예제 1- 24 Player클래스는 멤버변수, static 변수가 하나도 없습니다.

Player 클래스는 어떤 객체를 염두에 두고 설계한 것이 아니라 단순하게 프로그램을 실행

시켜보기 위한 목적이 전부이기 때문입니다.

 

public static void main(String[] args) 메소드

 

자바는 프로그램(클래스를 실행할 때)을 실행할 때 public static void main(String[] args)

메소드의 존재를 찾습니다. 일단 pubilc static void main(String[] args)를 찾으면

public static void main(String[] args)를 실행을 합니다.

 만약 프로그램이 public static void main(String[]args)을 갖고 있지 않으면 오류가 납니다.

Player 클래스는 단순히 질럿 객체를 몇 개 만들어보는데 의의가 있으므로 public static

void main(String[] args) 메소드만 갖고 있습니다.

 

Player클래스는 먼저 질럿을 두마리 만든후 각각의 질럿에게 레퍼런스 z1 z2를 결합

합니다. 그리고 레퍼런스를 이용해서 각각의 질럿에게 소리를 내게합니다.

실제로 소리를 내면 좀더 멋있겠지만 질럿들은 화면에 "My Life For Aiur"라는 문장을 출력

합니다. 그리고 z1, z2 질럿의 체력이 얼마인지 멤버함수를 통해서 알아낸후 화면에

출력합니다.

그 다음에는 멤버함수를 사용하지 않고 직접 멤버변수 기본공격을 참조해서 그 값을 화면에 출력합니다. 100의 값과 16의 값을 가질 것입니다.

다음에 static 메소드를 공격력을 증가시킨후 다시 두질럿의 체력과 기본공격력을 화면에

출력하고 있습니다. Player클래스도 public 클래스이므로 반드시 Player.java로 저장합니다.

 

 

Zealot 클래스와 Player 클래스의 컴파일과 실행

 

자바 프로그램을 실행하기 위해서는 컴파일을 먼저 해야합니다.

컴파일은 javac 컴파일러를 이용합니다.

 

그림 1 - 1 [compile (Zealot.java Player.java)]

 

필자는 컴파일된 클래스를 classes 폴더아래로 모두 옮겨 두고 싶어서 classes 폴더를

먼저 만들고 javac의 옵션으로 -d classes를 지정했습니다.

이렇게 하면 javac 컴파일러가 컴파일이된 결과인 .class 파일들을 classes 폴더아래에

모아줍니다. 보기에 깔끔하고 사용하기도 좋습니다.

 

일단 컴파일이 끝나면 클래스를 실행시킬수 있습니다. 물론 모든 클래스를 실행 시킬수

있는 것은 아니구요, 반드시 특별한 메소드가 있는 클래스를 실행 할 수 있습니다. 

Player 클래스는 그 특별한 메소드를 포함하고 있습니다.

이 특별한 메소드는 public static void main(String[] args) 메소드입니다.

 

자바가 클래스를 실행 시킬때 제일 먼저 시작하는 출발점이 이 특별한 메소드입니다.

 

 그림 1 - 2 [run (Player) ]

 

출력된 결과를 보면 예상대로 두개의 질럿의 체력과  공격력이 초기화가 제대로 되어

있는 것을 알수 있고, 공격력이 증가되면 두개의 질럿 모두에게 반영되는 것을 알수 있습니다. z1 질럿의 attack값이 16, z2 질럿의 attack값이 16 이었는데 Zealot.attackUpgrade()

호출한 다음 z1 질럿, z2 질럿의 attack값이 각각 1씩 증가 했음을 알 수 있습니다.

실상은 attack 변수는 질럿클래스를 통틀어 1개 뿐이고, 그 변수를 모든 질럿객체가

공유하고 있으므로 이런 결과를 쉽게 예상할 수 있습니다.

Posted by
,