본문 바로가기

Language/Java

static의 사용 이유와 스레드(thread)의 대한 개념

반응형

0. JVM의 메모리 구조 - static, stack, heap

JVM의 메모리 구조에는 여러 영역이 있지만 static, stack, heap 영역 3가지 공간에 대한 정리를 하려고 합니다.
구체적인 JVM 의 메모리 구조에 대한 정리는 아래를 참고 해주시면 될것 같습니다.

 

Call by reference 와 Call by Value 차이

Call by reference와 Call by value 의 차이에 대한 공부를 진행하던중 public class Test { public static void change(String src){ src = "new"; } public static void main(String[] args) { String step = "o..

jminc00.tistory.com

 

JVM의 구조를 간단하게 정리하자면 다음과 같습니다. 

 

1. JVM의 메모리 구조는 Stack, Heap, Static 영역이 존재한다. 

2. Stack 영역에는 '스택 프레임'라는 용어를 사용하는데 '{' 를 만나면 생성되고 '}' 를 만나면 사라지게 된다. 

또한 기본형 타입 변수의 값들과 Heap 영역에 존재하는 인스턴스를 참조하는 참조값 변수들은 스택 영역에 존재한다. 

3. Heap 영역에는 인스턴스가 저장되어 있고 스택영역에 해당 인스턴스를 참조하는 변수들을 이용해 인스턴스를 제어할 수 있다. 

3. Static 영역에는 static 이 붙는 변수, 메서드가 저장된다. 


여기서 우리는 static 영역에 대한 정리를 해보려고 합니다. 


1. static

static으로 선언된 메서드나 멤버변수들은 static 영역에 생성되면서 모든 객체 들이 사용할 수 있는 공유 개념을 가진다.

public class Practice { 
	private static int value; 
    
    static { 
    	value = 100; 
    } 
   	
    public static void main(String [] args ) { 
    	System.out.println(value); 
	} 
}

static의 특징

- 객체를 생성하지 않고도 사용가능하다.
- 모든 객체가 공유하는 변수가 된다.

static 의 핵심은 '공유 공간' 입니다.

공유라는 건 함께 사용한다는 의미인데 이 사용하는 주체가 스레드(thread) 입니다.


2. 스레드(thread) 란?

스레드의 정의는 '프로세스 내에서 실제로 작업을 수행하는 주체' 를 의미합니다.

예를 하나 들겠습니다. '재고관리' 프로그램내에 다수의 사용자가 동시 접속이 가능하고 재고는 A 상품 하나만 존재하며 접속한 사용자는 저장된 재고를 삭제 또는 추가 기능을 수행할 수 있다고 가정해 보겠습니다.

A 사용자, B 사용자, C 사용자가 일정한 시간을 두고 동시에 프로그램에 접속했다면 각 프로세스에 각각의 스레드가 생성됩니다 즉, 각 프로세스 내에서의 사용자들이 스레드가 되는 셈이죠.


3. static을 사용하는 이유는 무엇일까?

그렇다면 static을 굳이 사용하는 이유는 무엇일까요?

이전의 예시에서 6시 이후에는 해당 프로세스에 접속 하지 못하게 하고 접속 중이라면 강제 종료 하는 기능이 프로그래밍 되어있다고 가정해보겠습니다.


여기서 '6시' 라는 변수는 공유할 수있는 젼수이기 때문에 static으로 관리하는것이 효과적일 것입니다
그 이유는 만약 '6시' 에서 '7시'로 변경한다고 한다면 static의 변수만 수정해주면 되기 때문입니다.


4. static을 사용의 주의사항

static을 적절한 목적을 두고 사용한다면 프로그램을 유지보수하는데 큰 효과를 줄 수 있지만 반대로 적절히 사용하지 못한다면 오히려 프로그램 상의 오류가 존재할 수 있습니다.

예를 들어 보겠습니다.

A, B, C 3명의 사용자가 5초의 시간 간격을 두고 접속 중이고 하나의 프로세스가 종료 되는 데 까지는 100초의 사긴이 걸린다고 가정해보겠습니다. 재고는 100개가 있다고 가정해보겠습니다.

C가 프로그램이 실행된지 10초의 시간이 흘렀다면 B는 15초, A는 20초가 흘렀을겁니다.

이때 각 프로그램 시작 30초가 지날때 A는 재고 20개를 가져가고 B는 재고 30개를 가져가고 C는 재고 30개를 추가한다고 가정해 보겠습니다.

그럼 각각의 결과는 80, 50, 80 개의 재고가 보여 져야 합니다.

하지만 static변수로 선언됬기 때문에 프로세스가 다 종료 되기전에 static변수를 수정하는 일이 발생하기 때문에 세 프로그램이 모두 종료 됬을때 각각의 결과가 모두 80개로 동일한 결과가 나오는 불상사가 생기게 됩니다.

이러한 이유는 static이 가지고 있는 '공유 공간' 때문입니다.

결론적으로 static을 목적에 따라 적절히 사용해야 사용자에 목적에 맞는 프로그램을 설계 할 수 있습니다.

반응형