정적변수 static. Java코드로 분석

2023. 12. 31. 11:58정보처리,전산/자료구조

반응형

Q.

         

class Static{
 
    public int a = 20;
    static int b = 0;
    
}
 
public class Main{
    public static void main(String[] args) {
        
        int a;
        a = 10;
        Static.b = a;
 
        Static st = new Static();
 
        System.out.println(Static.b++);
        System.out.println(st.b);
        System.out.println(a);
        System.out.print(st.a);
    }
}

         

클래스 ststic 정의 후 인스턴스 a, 정적 변수 b 가 선언 되었다.

 

클래스 Main에 main 메서드가 있다. 변수 a선언 후 10으로 초기화 하고 static 클래스 정적 변수 b에 할당한다.

static 클래스 인스턴스 생성 후 변수 st에 할당한다.

 

 

A.

int a;
a = 10;
Static.b = a;

static.b 는 정적변수이기 때문에 Static 클래스 인스턴스와는 독립적 존재이다.

 

정적변수를 메모리 구조로 설명하면

#include <stdio.h>

void	test()
{
	int num = 0;

	num++;
	printf("%d\n", num);
}

int main()
{
	test();
	test();
	
}

 

 

결과는 

1

1

로 나온다 이유는 test()함수를 실행할 때마다 num이 0으로 초기화 되기때문이다.

  

 

이제 num을 static변수로 바꾸면 

#include <stdio.h>

void	test()
{
	static int num = 0;

	num++;
	printf("%d\n", num);
}

int main()
{
	test();
	test();
	
}

 

결과는

1

2

가 된다.

 

static 변수는 함수가 끝나고 다음 함수가 실행되더라도 이전 값이 유지되고 프로그램이 종료될 때 메모리가 해제된다.

 

메모리 구조를 간단하게 표현하면

 

 

 

 

지역변수는stack에 저장되어 함수 종료 시 메모리에서 사라진다.

그러나 static 변수는 프로그램 시작 시  DATA영역에 할당되고 이 변수는 함수 종료가 아니라 프로그램이 종료될 때 소멸된다.

-(static 의 기본값은 0으로 초기화 된다, 외부 참조 불가(정보은닉),매개변수로 사용할 수 없다.)

 

 

 

 

 

출력

- static.b 값은 10이고 출력 후에 1이 증가 하므로 일단 10이다

- 정적 변수 b는 1이 증가되고 클래스 내의 모든 인스턴스에 1이 증가한 값으로 업데이트 됨

(st.b와 static.b는 별개의 메모리 위치이다. static.b의 값을 참조하는 것이 아니라 st의 인스턴스 변수인 b를 참조.

별개의 주소가 하나의 값을 가리킴)

static.b는 클래스 자체의 정적 변수이고 st.b는 인스턴스를 통해 정적변수에 접근함.

 

-print(a)는 10 출력

- st.a는 static 클래스의 인스턴스 변수 a를 출력한다.

 

10

11

10

20

 

                                                  

 

 

 

 

반응형

'정보처리,전산 > 자료구조' 카테고리의 다른 글

삽입 정렬 insertion Sort  (0) 2024.07.22
ArrayList LinkedList  (0) 2024.04.26
16진수 8진수  (0) 2024.03.29
이진탐색 binary search  (0) 2024.03.15
포인터 문제 c로 분석  (0) 2024.01.01