Java

Java, Static 클래스 변수 / 접근 제어자 / import static

greenyellow-s 2024. 7. 15. 13:45
메모리
코드
static 영역

heap 영역

stack 영역

 

static 영역

- static으로 선언하면 static 영역으로 저장된다.

- 프로그램이 종료되면 자동 소멸된다.

- 프로그램을 실행시키면 바로 static 영역으로 저장된다.

 

heap 영역

- 남은 공간

- 개발자가 메모리를 삭제할 수 없고 JVM에 의해서만 삭제 가능하다.

- 변수명, 객체명 부여가 안되며 주소로 접근 가능하다.

Test t = new Test // heap 영역에 저장된다.

 

stack 영역

- 지역변수

- { 구역 }을 벗어나면 소멸된다.

 

접근 제어자

 

1. private

자신 클래스에서만 사용 가능
2. default

private, protected, public을 안 쓴 상태

class Test{ } // default 상태

같은 패키지 내에서만 가능
3. protected

상속한 자식 클래스까지만 사용 가능
4. public

다른 패키지에 있는 거를 가져다 쓸수 있는 유일한 접근 제어자

전부 사용 가능

 

private > default > protected > public

 

static, 클래스 변수

 

class StaticTest{
                  int a;  // 필드, 초기화가 끝남(0, 쓰레기값 없음), 
                            // new를 생성해서 불러올 수 있다.
                            // 인스턴스 변수

                   static int b; // 필드, 초기화, 
                                     // new 안해도 가능, 
                                     //클래스 변수
}

 

필드에서 변수는 초기화가 이미 끝난 상태이기 때문에 기본값으로 0이 부여된다.

 

int a;

 

public StaticTest() {
               System.out.println("default 생성자");
               this.a = 7;
}


이미 초기화가 끝났기 때문에 값을 줄 수 있다.

 

package class__;

class StaticTest{ //default
	int a;
	static int b;
    
	public void calc() {
		a++;
		b++;
	}
	
	public void disp() {
		System.out.println("a = " + this.a + " b = " + StaticTest.b);
	}
    
    public class StaticMain {

	public static void main(String[] args) { 
		
		StaticTest aa = new StaticTest(); // 생성자를 부른다.
		aa.calc();
		aa.disp();
		System.out.println();
		
		StaticTest bb = new StaticTest();
		bb.calc();
		bb.disp();
		System.out.println();
		
		StaticTest cc = new StaticTest();
		cc.calc();
		cc.disp();
		System.out.println();
		

	}

} // class Sataticmain

 

int a; // 클래스 소속이다.

static int b; // 클래스 안에 썼지만 클래스 소속이 아니다.

 

  aa 실행 bb 실행 cc 실행
Static 영역 b=0   ->   b=1 b=1   ->   b=2 b=2   ->   b=3
  StaticTest 클래스 StaticTest 클래스 StaticTest 클래스
  a=0   ->   a=1 a=0   ->   a=1 a=0   ->   a=1

 

static으로 선언된 b는 클래스 안에 있지만 클래스 소속이 아니고 static 소속이다.

따라서, 값이 입력될때 마다 같은 주소의 b의 값에 추가된다.

 

하지만 a는 계속 새롭게 생성되기 때문에 aa, bb, cc 모두 다른 주소의 값을 가진 a이다.

따라서, a는 증가되지 않고 초기값에서 1만 증가한 값이 출력되는 것이다.

 

static모두 같이 쓰는 공유 변수이다.

static 영영은 다같이 쓰는 공유 변수이기 때문에 자기 자신의 객체를 불러오는 this 연산자를 사용할 수 없다.

static 변수만 사용 가능하다.

 

this.a --   error !

 

static 변수나 메소드는 호출시 클래스명으로 직접 호출할 수 있다. 객체로도 호출 가능하다

StaticTest.b

 

import static

 

간단하게 static 상수 또는 메소드를 호출할 때 사용한다.

 

ex)

 

Math.random(); 함수를 사용할 때

 

import static java.lang.Math.random();

을 import 하면 random();만 써도 사용 가능하다.