- Java Static 이란?
영어 단어로서의 static은 다음과 같은 의미를 가진다 정지상태의, 고정된, 변화가없는 이러하듯 static으로 선언된 자원 들은 JVM의 메모리 영역에 딱 한번만 올라가게 된다. 이러한 이유로 다음과 같은 특징을 같습니다.
- static 변수는 인스턴스(클래스를 생성한 객체)끼리 값을 공유한다.
- static 변수와 메서드는 인스턴스 생성(new Class)없이 메모리에 스스로 올라간다.
기본적으로 static을 활용한 코드는 다음과 같다.
public class StaticClass {
static int testInt = 100;
static int getTestInt () {
return testInt;
}
public int getInt () {
return testInt;
}
public void setInt (int value) {
testInt = value;
}
}
testInt, getTestInt() 를 static으로 선언하고 getInt() 로 접근 setInt(int value) 로 값을 변경하는 코드이다
public class Test {
public static void main(String[] args) {
// 인스턴스 화 없이 변수 메소드 접근
System.out.println("1 : " + StaticClass.testInt);
System.out.println("2 : " + StaticClass.getTestInt());
// 인스턴스 의 메소드 접근
StaticClass sc1 = new StaticClass();
StaticClass sc2 = new StaticClass();
StaticClass sc3 = new StaticClass();
StaticClass sc4 = new StaticClass();
System.out.println("3 : " + sc1.getInt());
// static변수 값 변경
sc1.setInt(300);
System.out.println("4 : " + sc1.getInt());
System.out.println("5 : " + sc2.getInt());
System.out.println("6 : " + sc3.getInt());
System.out.println("7 : " + sc4.getInt());
}
}
위 코드를 보면 StaticClass.testInt, StaticClass.getTestInt() 는 클래스를 생성하지 안고 바로 사용한것을 볼 수 있있다. 이렇게 사용할 수있는 이유는 Class Loader가 로드한 Class파일을 메모리영역(RunTime Data Area)에 올려줄때 static으로 선언된 자원들을 메모리에 올라 가기때문이다
간단하게 말하면 이런의미가 된다 자바코드를 작성하고 코드를 RUN(java application) 할때 JVM 에 여러순서가 있는데 (.java -> .class) -> 메모리 영역에 할당(RunTime Data Area) -> 메모리 영역에 올라간 파일을 실행엔진(Execution Engine)이 실행하여 java 코드가 돌아가는데 메모리 영역에 할당 할때 static 값이 미리 메모리에 올리기 때문에 인스턴스(생성) 없이 사용 가능하다.
위에 말을 이해하고 있다면 JVM이 돌아가는 로직을 모두 알고 있다는 말이 된다 자세한 내용은 다음 내용에서 심층적으로 작성할 예정이다.
<jvm 기본 설명>
<github>
https://github.com/jkkim09/JAVA-BASE/tree/master/src/main/java/java_test/staticTest
<static은 언제 어디서 할당 되는가>
https://jktech.tistory.com/11?category=887327
'Tech > Java' 카테고리의 다른 글
main(String[] args) 메소드 깊이 있게 알아보자 (4) - main() method (0) | 2020.05.21 |
---|---|
main(String[] args) 메소드 깊이 있게 알아보자 (3) - Return Type (0) | 2020.05.21 |
main(String[] args) 메소드 깊이 있게 알아보자 (1) - 접근지정자(Access Modifier) (0) | 2020.05.19 |
JVM(Java Virtual Machine) (0) | 2020.05.18 |
Java 입문부터 다시 시작 하기 (Hello World) (0) | 2020.05.18 |
댓글