JAVA/JAVA Basic

[ JAVA ] static 알아보기

IT록흐 2021. 6. 18. 20:20
반응형

 

 

JAVA는 객체지향언어다.

 

객체들은 데이터를

주고받으며 대화를 한다.

 

하지만 데이터 중에서도

'공용성'이 높은 데이터들이 있다.

 

 

예를들어 테슬라가 만들어내는 차는 모두 '전기차'이다.

그러므로 테슬라가 만들어내는 차들은 [ Strig cartype = "Electronic"; ] 속성을 가져야한다.

 

테슬라가 차 100대를 생성했다 가정하면 컴퓨터 메모리 Heap 영역에 100대의 객체가 생성될 것이다. 이는 메모리에 cartype 필드 또한 100개가 생성된다는 의미다. 즉, 100개의 cartype 필드 안에는 모두 똑같은 "Electronic" 문자열 리터럴을 가리키는 주소 데이터가 저장된다는 의미다.

 

얼마나 비효율적인가?

 

이와 같이 공용성이 높은 데이터는

static처리를 해서 쓸데없는 메모리 낭비를

방지할 수 있다.

 

static

 

static으로 지정된 필드나 메소드는 메소드영역에 저장된다. main 스레드가 클래스를 참조하면 JVM이 연결된 링크를 통해 클래스를 찾아 여러가지 검사를 한 후, 클래스를 메소드 영역 메모리에 할당한다.(동적 클래스 로딩)

 

이때 staic으로 처리된 코드들이 실행되어 메모리 할당을 받는다.

 

그러므로 객체가 생성되기 이전부터 메모리 상에 존재하는 데이터들이기 때문에, 어떤 객체든 static 데이터를 사용할 수 있는 '공용성'을 띄는 것이다.

 

 

ClassFile.java

public class ClassFile {
	static String static_msg = "난 메소드영역에서 왔어!";
	String object_msg = "난 힙영역에서 왔어!";
}

 

 

Main.java

public class Main {

	public static void main(String[] args) {
		
		System.out.println (ClassFile.static_msg); //객체생성없이
		
		ClassFile cf = new ClassFile(); // 객체 생성
		
		System.out.println(cf.object_msg);
	}

}

 

<출력결과>

 

static 블럭

 

static 필드를 단순히 리터럴로 초기화시켜 줄 수 있지만, 복잡한 과정이 필요한 경우도 있다.

 

< ClassFile.java >

 

static 필드로 배열을 선언하고 static 블록 안에서 배열을 초기화 시켜주는 모습이다.

 

< Main.java >

public class Main {

	public static void main(String[] args) {

		ClassFile.staticMethod(); // 배열 출력
	}
}
​

 

 

그리고 static 메소드를 호출하여 출력해보자.

 

< 출력결과 >

 

static 메소드를 사용할 때, static은 main스레드가 클래스를 참조할 때 실행되어 메모리에 할당된다는 점을 유념해야 한다.객체가 생성되기 이전이니, static이 붙지 않은 객체 필드나 객체 메소드를 사용해서는 안된다.

 

 

 


정리

 

1. static은 메소드 영역에 할당되어 공용성을 띄는 데이터를 만든다.

2. static 블럭을 사용하면 복잡한 초기화도 가능하다.

 

반응형