반응형
/*
* < 자바 프로그램 실행 과정 >
* 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 |