본문 바로가기

JAVA

[JAVA] 모래성 쌓기 게임 (Static)

반응형

정적(Static)이란? 

정적(Static)은 고정된이란 의미를 가지고 있습니다. 

static이라는 키워드를 사용하여 static변수와 static메소드를 만들 수 있는데 

이 둘을 합쳐서 정적 멤버(=클래스 멤버)라고 합니다. 

정적 필드, 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이기때문에

클래스로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리됩니다. 

따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있습니다. 

Static영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만, 

Garbage Collector의 관리 영역 밖에 존재하기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게됩니다.

그렇기에 static을 남발하게되면 성능에 악영향을 줄 수 있습니다. 

 

클래스 설계시 static의 사용지침

  • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 보고 있다면 Static을 붙여준다. 
  • 작성한 메소드 중 인스턴스 변수를 사용하지 않는 메소드에 대해서 static을 붙일것을 고려한다. 

 

해당 static을 멤버변수에 사용하여 모레성쌓기 게임 프로그램을 만들어보았다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package class02;
 
import java.util.Random;
 
class Person{
   String name; // 이름 
   static int sand=100// static 붙은 이유 = 변하지 않는 공용 데이터이기 때문에 
   boolean game() {
      Random random = new Random();
      int num=random.nextInt(20)+1//랜덤수 생성 1~20까지 
      System.out.println(name+"님이 "+num+" 가져갑니다..");
      sand-=num;
      System.out.println("남은 모래: "+sand);
      System.out.println();
      if(sand<=0) { // 남은 모래가 0보다 작으면 게임종료 
         System.out.println(name+"님, 게임오버!");
         return true;
      }
      return false;
   }
   Person(String name){
      this.name=name;
   }
}
 
public class Test08 {
 
   public static void main(String[] args) {
   
      Person[] p = new Person[3];
      // 객체 배열     
       
      p[0]=new Person("홍길동");
      p[1]=new Person("아리");
      p[2]=new Person("티모");
      
      int i=0;
      while(true) {
         if (p[i].game()) {
            break;
        }
         i++// 다음 사람의 순서로 넘어가게 해줌 
         if (i==p.length) { //순서가 끝나면 다시 순서 다시 초기화 
            i=0;
        }
      }
   }
}
cs

"

 

반응형