자바 공부기록 38 - Static의 정의 / Static 변수
●Static
-멤버변수, 멤버메소드에 적용할 수 있는 키워드
-정적 변수(클래스의 변수), 정적 메소드(클래스의 메소드)를 선언할 때 사용
-프로그램의 구동 전부터 메모리를 확보하고 존재하는 멤버변수 및 메서드를 말합니다
참고) 자바프로그램의 구동 과정
1. JVM에 의해서 실행할 모든 클래스 중, static 메소드, static 멤버필드를 수집해서
메모리에 로딩되고, 프로그램의 시작(main메소드의 실행)전에 메모리 적재됩니다
2. 메모리에 로딩된 static 메소드 중, main 이름을 검색
3. main 메소드가 검색되었다면 JVM 해당 main 메소드를 호출하여 프로그램을 시작합니다
-동적멤버변수(인스턴스멤버변수)는 객체가 반드시 생성되어야 사용할 수가 있습니다
- 그러나 스태틱 변수는 main 메서드 실행전에 , 객체생성 전에 미리 생성되어 있는 변수,
객체와는 독립적이면서, 클래스에는 종속적으로 사용하도록 생성됩니다.
객체를 생성하지 않고도 사용할 수 있는 클래스의 멤버변수입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class StaticA{
int num; // 인스턴스 멤버변수 (동적 멤버변수)
static int number = 100; // 스태틱 멤버변수 (정적 멤버변수)
}
public class Class19 {
public static void main(String[] args) {
StaticA a1 = new StaticA();
a1.num = 100;
System.out.println("a1 객체의 동적 멤버변수 값 : " + a1.num);
System.out.println("Static 클래스의 정적(static) 멤버변수 값 : " + StaticA.number);
|
cs |
->동적멤버변수는 new로 객체 생성 후에 변수 사용가능
->정적멤버변수는 따로 객체 선언 없이 바로 (클래스명).(스태틱변수명)으로 사용가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class StaticA{
int num; // 인스턴스 멤버변수 (동적 멤버변수)
static int number = 100; // 스태틱 멤버변수 (정적 멤버변수)
}
public class Class19 {
public static void main(String[] args) {
StaticA a2 = new StaticA();
a2.num = 200;
System.out.println("a2 객체의 동적 멤버변수 값 : " + a2.num);
System.out.println("Static 클래스 정적(static) 멤버변수 값 : " + StaticA.number);
StaticA a3 = new StaticA();
a3.num = 300;
System.out.println("a3 객체의 동적 멤버변수 값 : " + a3.num);
System.out.println("Static 클래스 정적 멤버변수 값 : " + StaticA.number);
|
cs |
-동적변수는 객체생성마다 그 객체안에 생성되서 객체의 갯수만큼 생성되지만
정적변수는 프로그램 전체를 통틀어 한개 만들어집니다. 그 값도 일관성있게 끝까지 유지됩니다.
1
2
3
4
5
6
7
8
9
10
11
|
class StaticA{
int num; // 인스턴스 멤버변수 (동적 멤버변수)
static int number = 100; // 스태틱 멤버변수 (정적 멤버변수)
}
public class Class19 {
public static void main(String[] args) {
StaticA.number = 10;
System.out.println("a객체의 정적 멤버변수 값 : " + StaticA.number);
|
cs |
-동적 변수와 마찬가지로 private 으로 보호 되지 않았다면 main메소드에서 임의 접근이 가능하고
private로 보호된 static 변수에 대한 임의접근은 static 메서드를 사용하여 값을 저장하거나 얻어 냅니다.
static이 아닌 멤버메서드에서는 접근이 불가능합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package days23;
class StaticB {
int bunho;
static int count = 0;
StaticB(){
count++;
//bunho = StaticB.count;
// static 멤버들도 같은 클래스 안에서 클래스이름을 앞에 두지 않고 사용이 가능합니다
bunho = count;
}
}
public class Class20 {
public static void main(String[] args) {
System.out.printf("count = %d\n", StaticB.count);
StaticB b1 = new StaticB();
System.out.printf("b1.bunho = %d, count = %d\n", b1.bunho, StaticB.count);
StaticB b2 = new StaticB();
System.out.printf("b2.bunho = %d, count = %d\n", b2.bunho, StaticB.count);
StaticB b3 = new StaticB();
System.out.printf("b3.bunho = %d, count = %d\n", b3.bunho, StaticB.count);
}
}
|
cs |
-정적변수는 같은 클래스안에서 (클래스이름). 을 붙이지 않고도 변수명으로만 사용이 가능

● 예제 - this를 이용하여 생성자 호출 활용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package days23;
class Student{
private int bun;
private String name;
private int [] scores;
static int count = 0;
Student(){
scores = new int[3];
bun = ++count;
}
Student(String name){
this();
this.name = name;
}
Student(String name, int kor, int eng, int mat){
this(name);
this.scores[0] = kor; this.scores[1] = eng; this.scores[2] = mat;
}
Student( Student s ){
this(s.name, s.scores[0], s.scores[1], s.scores[2]);
}
public void prn() {
System.out.println(this.bun + " : " + this.name + " : "
+ this.scores[0] + " : " + this.scores[1] + " : " + this.scores[2]);
}
}
public class Class21 {
public static void main(String[] args) {
Student s1 = new Student("홍길남", 98,69,87);
Student s2 = new Student("홍길서", 45,87,78);
Student s3 = new Student("홍길동", 56,99,55);
Student s4 = new Student( s3 );
System.out.println( "학생수 : " + Student.count );
s1.prn(); s2.prn(); s3.prn(); s4.prn();
}
}
|
cs |
- 학생수는 정해져있지 않기 때문에 객체가 생성될때마다 bun 값을 1씩 늘려주는 코드를 작성해야한다.
하지만 int bun은 객체 생성시마다 새로 생기기 때문에, 처음부터 만들어지고 모든 메소드가 딱 한개로 공유하고 있는 '스태틱 변수'를
활용해야한다.
- static int count = 0;
Student() {
scores = new int[3]; // 과목수는 국어, 영어, 수학으로 정해져 있기 때문에 데이터 공간은 3개로 생성하기
bun = ++count; }// 객체가 생성될때마다 bun이 1씩 늘어남
- 생성자 메소드의 매개변수로 어떤 값을 받던간에, 모두 공통적으로 필요로 하는 scores 배열 변수의 선언과 bun 값의 증가를
아~무런 매개변수가 없는 생성자 메소드에 적어준다. 그 후에, 다른 생성자 메소드에서 호출하면됨
-아예 매개변수로 클래스의 객체를 받을 수 있다는 점도 기억해두기