2010년/6월

6월30일 JAVA(static의 메소드)

뽀얀햄스터 2010. 6. 30. 08:58

package net.itisn;

import java.util.*;
class StudentInfo
{
  private final String name;
  private int id;
  private  static int nextId =1;
  StudentInfo(String name)
  {
    this.name=name;
    setId();
  }
  private void setId()
  {
    id=nextId;
    nextId++;
  }
  int getId()
  {
    return id;
  }
  public  static int getNextid()
  {
    return nextId;
  }
  
  
}

public class StaticMethod {

  
  public static void main(String[] args) {
    StudentInfo james = new StudentInfo("james");
    StudentInfo brown = new StudentInfo("Brown");
    System.out.printf("%d, %d, %d\n",james.getId(),brown.getId(),StudentInfo.getNextid());

  }

}

===========================================================
===========================================================
private로 된경우는 밖에서 접근이 불가능하다 하지만 static을 사용하면 메모리공간에 힙영역에 만들어지는것이 아니고 스택 영역이므로  공유가된다.


package net.itisn;

class Sample
{
  int insA;
  int insB=insA;
  static int stA;
  void method()
  {
    int localA=0;
    int localB=localA;
  }
}
public class StaticTest {

  /**
   * @param args
   */

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Sample s1 = new Sample();
    Sample s2 = new Sample();
    
    s1.method();
  }

}
=====================================================
=====================================================
클래스영역의 지역변수와 메소드안의 지역변수의 저장하는 공간위치가 틀리다
그래서 클래스영역의 지역변수는 자동으로 초기화가 되지만 메소드안의 지역변수는
저장하는 위치가 어중간하기때문에 우리가 초기화를 시켜야 대입이 가능하다.
=====================================================
=====================================================
package net.itisn;

public class StaticTest2 {

  static int a;
  int b;
  StaticTest2()
  {
  }
  
  StaticTest2(int b)
  {  
    a +=b;
    this.b+=b;
  }
  public static void main(String[] args) {
    System.out.println("StaticTest2.a : "+StaticTest2.a);
    StaticTest2 s1 =new StaticTest2(10);
    System.out.println("s1.a : "+s1.a);
    System.out.println("s1.b : "+s1.b);

    StaticTest2 s2 =new StaticTest2(5);
    System.out.println("s2.a : "+s2.a);
    System.out.println("s2.b : "+s2.b);
    
    StaticTest2 s3 =new StaticTest2(20);
    System.out.println("s3.a : "+s3.a);
    System.out.println("s3.b : "+s3.b);
    //static은 프로그램에서 한개가만들어지고 각 객체끼리 공유가 된다 그래서 
    //값이 증가한다. 
  }

}


=========================================================
=========================================================
결국에는 클래스안에서 static은 객체생성시 각객체끼리 공유한다고 보면된다.
static은 스택영역에 만들어진다.



메소드도  역시 마찬가지로 static인경우  지역변수와 마찬가지로 공유하는것과 같다. static의 기본적 속성처럼 객체를 생성하지 않아도 스택영역에 실행동시에 공간을 가져오기때문에 함수자체가 있다.
그래서 static에 맡게 사용하라고  경고를 띄우주는데 private static을 사용하여 안전하게 만들수 있다.