본문 바로가기

그외 프로그래밍

[JAVA] 클래스 단위의 멤버를 위한 static


자바엔 인스턴스 단위 멤버 , 클래스 단위 멤버가 있다
   -인스턴스 단위 멤버 : 클래스 내부에 선언했던 모든 속성과 메서드
   -클래스 단위 멤버 :   정적 멤버변수와 정적 메서드

예약어 static은 이 클래스 단위 멤버를 선언할때 사용된다!!


**정적 멤버 변수

Class StaticTest
{
static int a=10;
int  b=20;
}
여기서 a는 클래스단위멤버변수
          b는 인스턴스단위멤버변수


static으로 선언한 클래스단위멤버변수는!!

1. 램상에 힙 영역이 아닌 메모리에 기억공간이 할당

2. 몇개의 객체를 생성하던지 상관없이 프로그램이 끝날 동안 클래스 단위당 한버만 메모리 할당 
                StaticTest s1 = new Static Test();
                StaticTest s2 = new Static Test();
                StaticTest s3 = new Static Test();
                StaticTest s4 = new Static Test();

      ==>StaticTest 로 4개의 객체를 생성했을때, 
           멤버변수 b는 각 객체별로 생성이 되지만, static선언된 멤버변수 a는 클래스에서 오로지 1개만 생성!!!!

3. 객체 생성없이도 클래스 명으로 멤버에 접근 가능!   ( StaticTest.a; )


 ==>객체 생성하기 전, Static.a를 출력했을때, 10이 출력됨을 볼수 있다!
      2번 설명 (몇개의 객체를 생성하던지 상관없이 프로그램이 끝날 동안 클래스 단위당 한버만 메모리 할당)
      이 역시 실행결과로 확인할수 있다.,


** 정적 메서드

staic 속성이 private 으로 선언되어있다면 정적 멤버변수를 사용하기 위해 정적 메서드를 정의해야한다!
즉 예를 들면, 
private static int a = 10;      으로 선언된 멤버변수를
System.out.println(StaticTest.a); 로 출력하고자 하면 컴파일 에러가 발생한다

public static int getA() {   return a; }  이러한 정적 메서드를 정의하여
System.out.println(StaticTest.getA());   이렇게 해야 a값을 가져올수 있다!!   (==> 간접적으로 호출)

==>위의 실습 파일 (StaticTest1)에서  class정의를 변경하면 ( 두 변수를 private으로)  바로 오류나는 것을 볼 수 있다!!



1. 인스턴스 차원이 아닌 클래스 차원에서 사용가능하도록 설계
2. 객체 생성없이도 클래스 명으로 호출 가능 (  SaticTest.getA();  )

3. this 레퍼런스를 사용 할 수 없다.   (컴파일 오류 발생!)
      ==> 정적 메소드는 객체단위로 호출되지 않고 클래스 단위로 호출하기 때문에 특정 객체의 주소를 넘겨 줄 수 없기 떄문!  
      ==> 정적 메서드에서는 정적 멤버변수는 클래스 단위로 접근 가능한 멤버이기에 인스턴스를 구분할 필요가 없으므로 this가 아예 사용되지 못하도록 한것이다!


4. 정적 메서드에서는 인스턴스 변수를 사용할 수 없다.
==> 정적 메서드에서 인스턴스 멤버인 b를 사용하면 this로 접근할 수 없기 때문에 어떤 인스턴스 소속인지 구분할 수가 없기 때문!!

5. 정적 메서드는 오버라이딩 되지 않는다.



'그외 프로그래밍' 카테고리의 다른 글

[JAVA]Address already in use: JVM_Bind 오류  (1) 2010.11.16
Call by value와 Call by reference  (3) 2010.09.13