## 코드 Test2.java ``` package org.javatutorials.eclipe; public class Test2 { static public void main(String[] args) { Test3 ts = new Test3(); System.out.println(ts.b); ts.add(); System.out.println("클래스"+ts.a+" "+"인스턴스"+ts.b); System.out.println(); Test3 ts1 = new Test3(); System.out.println("클래스"+ts.a+" "+"인스턴스"+ts.b); System.out.println("클래스"+ts1.a+" "+"인스턴스"+ts1.b); } } ``` Test3.java ``` package org.javatutorials.eclipe; public class Test3 { static int a = 0; int b =0; Test3(){ b++; a++; } public void add() { Test3 ts = new Test3(); ts.b++; ts.a++; ts.a++; Test3 ts1 = new Test3(); System.out.println(ts.b); } } ``` ## 질문 각각 별도의 클래스 파일 Test2와 Test3 입니다. Test2 안에서 Test3를 인스턴스화 시켜 add 메소드를 실행하였습니다. 여기서 궁금한것이 Test3 내부에 있는 add 메소드를 통하여 인스턴스 변수 b의 값을 2로 변경해주었는데 add 안에 println은 생성자안에 ++와 메소드안의 ++ 를 통하여 2가 찍히면서 Test2안에 System.out.println("클래스"+ts.a+" "+"인스턴스"+ts.b) 에서의 ts.b는 add호출후 Test3를 새로 인스턴스화 한것도 아닌데 어째서 1이 찍히는것인가요? 그리고 static 변수는 계속 숫자가 유지되며 올라가던데 main메소드가 끝까지 종료되었을때 static 영역도 종료되는것인가요?
## 답변 #### Q1: Test2안에 System.out.println(“클래스”+ts.a+” “+”인스턴스”+ts.b) 에서의 ts.b는 add호출후 Test3를 새로 인스턴스화 한것도 아닌데 어째서 1이 찍히는것인가요? 메인 메소드 첫줄에 ts객체 생성시, b의 값이 1이 되었기 때문입니다. ``` public static void main(String[] args) { Test3 ts = new Test3(); ... } ``` #### Q2: static 변수는 계속 숫자가 유지되며 올라가던데 main메소드가 끝까지 종료되었을때 static 영역도 종료되는것인가요? 네 맞습니다. 메인 메소드가 종료되면 해당 static 영역 메모리는 해제되어 반환됩니다. ## 참조 링크 + 자바 Static과 메모리구조 (https://goo.gl/EAFA3P)