static 이란?

Organ·2023년 9월 3일
0

JAVA

목록 보기
5/14

static 키워드의 의미

public class Resource{
	public static void Main(String[] args)
	{
		solution.Foo1();				// static이 있는 경우
		
		Solution sol = new Solution();		// static이 없는 경우
		sol.Foo2();
		
	}
	
	public class Solution
	{
		public static void Foo1() {}
		
		public void Foo2() {}
	}
}

new 키워드가 붙은 메모리는 heap에 위치한다. new 키워드를 쓰면 heap 공간에 우리가 올릴만한 적당한 크기가 있는지 확인하고 그 정도 크기가 있으면 그곳에 메모리를 적재한다. 그 다음에 메모리에 접근할 수 있는 주소를 받아서 Foo2같은 함수를 호출할 수 있는 것. 이 말은 메모리에 코드가 올라가 있지 않으면 우리는 Foo2함수를 호출할 수 없다는 말. 그렇다면 Foo1함수는 new 없이 어떻게 호출할 수 있을까? 이걸 이해하기 위해서 static 키워드가 어디에 위치해 있는지 알아야 한다. static 키워드는 heap이나 stack과 다르게 static키워드가 붙은 클래스나 함수들이 올라갈 수 있는 별개의 메모리 공간이 있다. 컴파일러는 static 키워드가 붙은 함수나 변수나 클래스들을 프로그램 실행과 동시에 static메모리 공간에 적재시킨다. new를 하지 않더라도 컴파일러가 다 적재시킨다. 그렇기 때문에 우리가 new를 하지 않더라도 Foo1함수에 접근할 수 있는 것이다.

즉 static 키워드가 붙은 것들을 적재하기 위한 static 메모리 공간이 따로 있고 컴파일러가 적재해주기 때문에 우리의 예상대로 static 키워드가 동작하는 것. 이 메모리 공간은 프로그램이 시작해서 끝날 때 까지 절대로 지워지지 않는다.

static 키워드 유무에 따른 호출 범위

public class Resource{
	public static void Main(String[] args)
	{
		//int _nonStaticStar = 0;
		static int _staticVar = 0;  // static키워드가 붙은 변수는
	}
	
	public class Solution
	{
		public static void Foo1() 
		{
			//_nonStaticVar = 0;
			_staticVar = 0;			// static이 붙은 메소드에서도 호출이 가능하고
		}
		
		public void Foo2() 
		{
			//_nonStaticVar = 0;
			_staticVar = 0;			// static이 붙지 않은 메소드에서도 호출이 가능하다.
		}
	}
}
public class Resource{
	public static void Main(String[] args)
	{
		int _nonStaticStar = 0;				// static이 붙지 않은 변수에서는
		static int _staticVar = 0;  
	}
	
	public class Solution
	{
		public static void Foo1() 		
		{
			_nonStaticVar = 0;				// static 메소드에서는 접근이 안된다.
			
			_staticVar = 0;			
		}
		
		public void Foo2() 
		{
			_nonStaticVar = 0;				// static이 붙지 않은 함수에서는 접근이 가능하다.
			_staticVar = 0;			
		}
	}
}

에러를 읽어보면 'static이 아닌 필드, 메소드 또는 속성에 개체 참조가 필요하다.' 라는 문구가 나온다. 컴파일러 입장에서 생각해보면 static키워드가 붙은 것들은 컴파일러 입장에서 이미 모두 메모리에 올라가 있다. Foo1은 static 키워드가 붙어 있기 때문에 프로그램 시작과 동시에 메모리에 올라가 있다. 그러나 이 함수에서 접근하는 _nonStaticVar는 사용자가 new 키워드로 직접 메모리에 올리기 전까지는 메모리에 올라가지 않는다. 즉 Foo1이 메모리에 올라가 있는 상태에서 _nonStaticVar는 올라가 있지 않을 확률이 있다. 그러니 에러가 나는 것. 그래서 static 키워드가 붙은 함수나 클래스에서는 모두 static 키워드가 붙은 것들끼리 참조가 가능한 것이다.

출처

https://www.youtube.com/watch?v=O6Y4vSrWrUI&list=LL&index=6

0개의 댓글