IT/Java

자바 static, 클래스변수, 인스턴스변수

노마드오브 2018. 7. 20. 23:28

static : 접근지정자 static final 자료형 - 함수 정의시 순서

     객체생성없이 바로 멤버변수나 메소드에 접근 가능

     static변수는 공유변수 역할

     static메소드는 공유변수를 활용한 기능 표현.

            -> static메소드 안에서는 non-static멤버는 사용못함


static 초기화 코드블록 또는 static 메소드 안에서는

this 또는 super 참조변수를 사용 못함!

왜냐하면 this 또는 super는 객체를 지정하는 용도이기 때문




package test;


class StaticTest {

// 클래스단위 멤버변수. 클래스변수. 정적변수. 클래스마다 한개씩 가짐 -> 공유

static int a;

static { // 클래스변수 초기화

a = 10; 

}

// 클래스단위 메소드는 클래스영역에 로딩되고 즉시 사용가능해야함.

static void sPrn() {

// 클래스단위 메소드에서는 인스턴스 멤버(non-static)는 사용못함!

System.out.println("a=" + StaticTest.a);

//System.out.println("b=" + b);  // 인스턴스변수는 사용못함!


// Prn(); // 불가능. 클래스단위 메소드안에서는 인스턴스 메소드 사용 불가능

// methodA(); // 불가능. 인스턴스 메소드이므로.

}


// 인스턴스단위 멤버변수. 인스턴스변수. 인스턴스마다 한개씩 가짐.

int b;

public StaticTest() { // 생성딘 객체의 인스턴스 변수 초기화

b = 20;

}

void prn() { // 인스턴스단위 메소드. 인스턴스 메소드.

// 인스턴스 메소드 안에서 클래스변수 사용이 가능함

// 이유 : 클래스가 인스턴스보다 먼저 메모리 할당이 되기 때문.

// System.out.println("a=" + a); // 클래스변수

System.out.println("a=" + StaticTest.a); // 클래스변수, 이렇게 쓰는 걸 권장

System.out.println("b=" + b); // 인스턴스변수


sPrn(); // 클래스단위 메소드 사용 가능

methodA(); // 가능

}

void methodA() {

System.out.println("methodA()");

}

} // StaticTest



public class Test1 {


public static void main(String[] args) {


// 연습1 : static 변수가 공유되는 것 확인예제. 주석 풀고 확인해보면 됨

// StaticTest st = new StaticTest();  // 객체 생성

// st.prn();  // 멤버 메소드 호출, a=10 b=20

//

// StaticTest st2 = new StaticTest();

// // st2.a = 100; // 이렇게 접근이 가능하지만 올바른 표현방법은 아니다

// StaticTest.a = 100;  // 클래스변수 접근

// st2.b = 200;  // 인스턴스변수 접근

// st2.prn();  // a=100 b=200

// st.prn();   // a=100 b=20


// 연습2

StaticTest.a = 100;  // 객체 생성 없이 클래스변수 사용 가능

// StaticTest.b = 200; // 에러 

StaticTest.sPrn();  // 객체 생성 없이 클래스단위 메소드 사용 가능

StaticTest st = new StaticTest();

st.b = 200;

// st.a = 100; // 스태틱 표현이 아님. 

StaticTest.a = 100;

st.prn();  // a=100 b=200

st.sPrn(); // 스태틱 표현이 아님. 권장되지는 않지만 동작은 한다.

StaticTest.sPrn();


// Math m = new Math(); // 객체생성없이 바로사용, 자바 API를 확인해보면 static으로 되어있다

System.out.println("원의 면적: " + (5*5*Math.PI));

System.out.println("절대값: " + Math.abs(-5));


} // Test1


}