2008. 8. 7. 14:39

Part 3. static

1. 정적 멤버변수
class staticTest {
  static int a=10; // 정적 멤버변수(클래스 단위 멤버변수)
  int b=20;         // 
}
static으로 선언한 멤버는 램 상에 힙 영역이 아닌 메모리에 기억공간이 할당되며 메모리 영역에 할당된 static 멤버변수는 몇 개의 객체를 생성하던지 상관없이 프로그램이 끝날 동안 클래스 단위당 한번만 메모리 할당을 합니다.

2. 정적 메소드
static 속성이  private로 선언되어 있다면 정적 멤버변수를 사용하기 위한 메서드 정의가 필요합니다.
이런 메소드는 인스턴스 차원이 아닌 클래스 차원에서 사용 가능하도록 설계해야 합니다.
이건 곧 인스턴스의 생성 없이 클래스명으로 호출이 가능하다는 의미와 같습니다.
정적 메소드 사용시 유의사항
1. this 레퍼런스를 사용할 수 없다.
2. 인스턴스 변수를 사용할 수 없다.
3. 오버라이딩 되지 않는다.

package training;
class staticTest{
 // 멤버는 2가지로 나뉨 : 클래스 단위로 동작/인스턴스 단위로 동작
 // static int a=10;
 private static int a=10; // 클래스(static 추가) 단위로 동작
 // 필드 a에 대해서 segger/getter : 클래스명으로 접근하는 정적 메소드
 // 정적 메소드는 setter/getter에 static만 붙여주면 된다.
 public static int getA() {
  return a;
 }
 public static void setA(int a) {
  staticTest.a = a; // 정적 메소드는 this를 쓸 수 없다.
 }
 // int b=20;
 private int b=20; // 인스턴스 단위로 동작
 public int getB() { // 인스턴스 메서드는
  return b;       // 레퍼런스 변수로 접근해야 한다.
 }
 public void setB(int b) {
  this.b = b;
 }
}
public class Ex04 {
 public static void main(String[] args) {
  // 클래스에 대한 정보로 메모리에 올라가면서 이때
  // static 멤버도 함께 메모리 할당하고 끝나서 a는 한개만 존재
  // System.out.println(staticTest.a); // 클래스명으로 a의 소속을 밝힌다.
  System.out.println(staticTest.getA());
  staticTest s1=new staticTest();
  staticTest s2=new staticTest();
  staticTest s3=new staticTest();
  staticTest s4=new staticTest();
  // 인스턴스 필드는 인스턴스 개수만큼 존재
  // 인스턴스 필드는 반드시 레퍼런스 변수로 접근해야 한다.(클래스명은 접근불가)
  // System.out.println(s1.b);
  System.out.println(s1.getB());
  // 정적필드는 클래스명 뿐만 아니라, 레퍼런스 변수로도 접근 가능
  System.out.println(s1.getA());
  s1.setA(100); s1.setB(200);
  System.out.println(s1.getA() + ":" + s1.getB());
  System.out.println(s2.getA() + ":" + s2.getB());
 }
}