JAVA

[Java] static 변수

sagesse2021 2021. 10. 29. 18:31
반응형
/*
* < 자바 프로그램 실행 과정 >
* 0. 소스 코드 작성 및 컴파일 후 클래스 실행
* 1. 클래스 로딩
*    => static 변수 및 메서드가 메모리에 로딩됨
* 2. main() 메서드 호출(실행)
* 3. 인스턴스 생성
*    => 인스턴스 변수 및 메서드가 메모리에 로딩됨
* 4. 인스턴스 메서드 호출(실행)
*    => 로컬 변수가 메모리에 로딩됨
* 5. 결과 출력
* 6. 프로그램 종료
* static 키워드
* - 클래스, 메서드, 변수의 제한자로 사용
* - 메서드 또는 변수에 static 키워드를 사용할 경우
*   인스턴스 멤버가 아닌 클래스(= 정적 = static) 멤버로 취급됨
*
* < static 변수 >
* - 멤버변수에 static 키워드를 사용할 경우 클래스(정적) 멤버로 취급됨
*   => 모든 인스턴스에서 하나의 변수를 공유함
*   => 즉, 클래스 당 하나만 생성됨(클래스 영역 = Method Area 에 생성됨)
*   - 클래스명.멤버변수명 형태로 접근
*/
package static_member;

public class Ex {

	public static void main(String[] args) {
		
		//Ctrl + Shift + r = 
		NormalMember n1 = new NormalMember(); // 인스턴스 생성
		NormalMember n2 = new NormalMember(); // 인스턴스 생성
		// => 두 개의 인스턴스가 생성되며, 인스턴스 멤버변수도 두 개씩 생성됨
		
		System.out.printf("n1.a : %d, n2.a : %d \n",n1.a, n2.a);
		System.out.printf("n1.b : %d, n2.b : %d \n",n1.b, n2.b);
		
		// n1 인스턴스의 인스턴스 멤버변수 a 값을 99로 변경
		// n1 인스턴스의 인스턴스 멤버변수 b 값을 999로 변경
		n1.a =99;
		n1.b = 999;
		System.out.printf("n1.a : %d, n2.a : %d \n",n1.a, n2.a);
		System.out.printf("n1.b : %d, n2.b : %d \n",n1.b, n2.b);
		
		// 즉, 인스턴스 멤버변수인 a 와 b 는 인스턴스마다 생성되므로
		// 하나의 인스턴스에서 인스턴스 멤버변수 값을 바꾸더라도
		// 다른 인스턴스 멤버변수에는 아무런 영향이 없다!
		// => 생성된 메모리 공간이 다르기 때문
		System.out.println("=======================================");
		
		// StaticMember 클래스의 인스턴스 생성 전에 static 멤버 접근
		System.out.println("StaticMember.a : " + StaticMember.a);
		//=> 인스턴스 생성 전 이미 메모리에 로딩되어있으므로 
		//   클래스명만으로 static변수에 접근할 수 있다
		
		StaticMember s1 = new StaticMember();
		StaticMember s2 = new StaticMember();
		
		System.out.printf("s1.a : %d, s2.a : %d \n",s1.a, s2.a);
		System.out.printf("s1.b : %d, s2.b : %d \n",s1.b, s2.b);
		
		s1.a = 99; //클래스에 한개만 존재, 값을 공유,값을 바꾸면 다른 값에 영향을 줌,static(클래스 = 정적) 멤버변수 값을 변경
		s1.b = 999; //객체 당 하나만 존재,인스턴스 멤버변수 값을 변경
		
		System.out.printf("s1.a : %d, s2.a : %d \n",s1.a, s2.a);
		System.out.printf("s1.b : %d, s2.b : %d \n",s1.b, s2.b);
		
		// 즉, static 멤버변수 값(a)을 s1 인스턴스에서 변경하게 되면
		// s2 인스턴스도 동일한 변수 값을 공유하고 있으므로
		// 변경된 값이 두 인스턴스 모두 적용(공유)됨
		// => 즉, 하나의 인스턴스에서 값을 변경하면 모든 인스턴스가 영향을 받음
		
		
		s2.a = 1000;
		System.out.printf("s1.a : %d, s2.a : %d \n",s1.a, s2.a);
		
		// static 멤버는 참조변수명 대신 클래스명만으로도 접근 가능
		StaticMember.a = 500;
//		StaticMember.b = 500; // 컴파일에러 발생! 클래스명만으로 접근 불가!
		System.out.printf("s1.a : %d, s2.a : %d \n",s1.a, s2.a);
		
		System.out.println("===================================");
		
		//static멤버 변수의 대표적인 예
		// => java.util.Math 클래스의 PI변수
		System.out.println("PI 값 : " + Math.PI);

	}

}

class NormalMember {
	int a = 10; // 인스턴스 멤버변수
	int b = 20; // 인스턴스 멤버변수
}
class StaticMember {
	static int a = 10; // static 멤버변수(클래스 멤버변수 = 정적 멤버변수)
	int b = 20;
}
/*
n1.a : 10, n2.a : 10 
n1.b : 20, n2.b : 20 
n1.a : 99, n2.a : 10 
n1.b : 999, n2.b : 20 
=======================================
StaticMember.a : 10
s1.a : 10, s2.a : 10 
s1.b : 20, s2.b : 20 
s1.a : 99, s2.a : 99 
s1.b : 999, s2.b : 20 
s1.a : 1000, s2.a : 1000 
s1.a : 500, s2.a : 500 
===================================
PI 값 : 3.141592653589793
*/

 

반응형

'JAVA' 카테고리의 다른 글

[Java] 싱글톤 디자인 패턴  (0) 2021.10.29
[Java] static 메서드  (0) 2021.10.29
[Java] package  (0) 2021.10.29
[Java] 생성자 this()  (0) 2021.10.29
[Java] this 키워드  (0) 2021.10.29