[Java] 자바 #18, 정적 멤버 static (정적 키워드)

static 키워드

클래스 멤버(변수, 메소드)에 붙이는 키워드

멤버변수는 클래스가 객체로 생성될 때 메모리에 로딩하지만, static 키워드가 붙은 멤버는 프로그램이 실행될 때 메모리에 로드된다.

클래스 멤버이긴 하지만 자기가 로드되기 위한 공간으로써만 클래스안에 선언하는 의미가 있다.


1. 멤버변수

2. 멤버 메소드

메소드 내에서 못씀

   

<멤버변수>

- static 변수, 정적변수, 공용변수


static 키워드 알아보기 예제 #1

1
2
3
4
5
class MyGrade{
    public int kor = 100;
    public int eng = 90;
    public static int math = 80;
}
cs


내 성적이라는 클래스가 있다고 할때, 그 멤버변수로 국어, 영어, 수학 점수를 가지고 있다고 하자.

이 성적 데이터에 접근하기 위해서는 우선 MyGrade 클래스의 객체를 선언해야한다.!


1
2
3
4
5
6
7
8
class StaticTest{
    public static void main(String[] args){
        MyGrade grade = new MyGrade();    
        System.out.println(grade.kor);    //100
        System.out.println(grade.eng);    //90
        System.out.println(grade.math);    //80
    }
}
cs

이런식으로 MyGrade 객체를 생성하고 멤버변수에 접근하는 것이 일반 멤버변수 접근방법이었습니다. 그런데 static 키워드가 붙은 클래스멤버(메소드포함)는 객체변수(grade)로 접근하는 방법은 옳지 않습니다.

static 키워가 붙은 변수 혹은 메소드는 클래스명으로 직접 접근이 가능합니다.


1
System.out.println(MyGrade.math);
cs

바로 이런식으로 말이죠!!!


static 키워드 알아보기 예제 #2


1
2
3
4
5
6
7
8
9
10
11
12
//마우스 클래스
class Mouse{
    static int count=0//마우스 개수.
    int memCount=0;
    
    public static int getCount() {
        return count;
    }
    public static void setCount(int count) {
        Mouse.count = count;
    }
}
cs

이러한 마우스(갯수)라는 클리스가 있을 때!


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
public class StaticTest{
    public static void main(String[] args) {
        //마우스 공장 -> 마우스 생산 -> 몇개를 생산?
        m1();
        m2();
    }
    public static void m1() {
        
        Mouse m1 = new Mouse();
        m1.memCount++;
        Mouse m2 = new Mouse();
        m2.memCount++;
        Mouse m3 = new Mouse();
        m3.memCount++;
        
        //count가 정말 마우스 개수가 맞나?
        System.out.println("마우스 개수 : "+m1.memCount);
        System.out.println("마우스 개수 : "+m2.memCount);
        System.out.println("마우스 개수 : "+m3.memCount);
    }
    
    private static void m2() {
        //같은클래스 -> 마우스 3개 생성 -> 마우스 갯수가 3개일까?
        Mouse m1 = new Mouse();
        Mouse.setCount(Mouse.getCount()+1);
        
        Mouse m2 = new Mouse();
        Mouse.setCount(Mouse.getCount()+1);
        
        Mouse m3 = new Mouse();
        Mouse.setCount(Mouse.getCount()+1);
        
        //count가 정말 마우스 개수가 맞나?
        System.out.println("마우스 생산 개수 : "+m1.getCount());
        System.out.println("마우스 생산 개수 : "+m2.getCount());
        System.out.println("마우스 생산 개수 : "+m3.getCount());
        System.out.println("마우스 생산 개수 : "+Mouse.count);
    }
}
cs


다음의 결과를 실행해보시기 바랍니다.!


결과는 1 1 1 / 3 3 3 3

이렇게 나옵니다. static 키워드가 가지는 의미가 이 결과로 더욱 와닿을 것입니다. 

static 키워드가 선언된 Mouse클래스의 count변수는 클래스가 아닌 프로그램이 실행될 때 메모리에 로딩되어 0의 값으로 이미 자리잡고 쭉 그자리를 지키고 있습니다. 그 위치가 Mouse클래스의 내부일 뿐이고 클래스변수로 접근을 하던 클래스 명으로 접근을 하던 항상 그놈이 그놈(count)입니다.


항상 그 자리를 지켜서 정적이다!! 라고 이해하시면 좋겠네요^^ 




static 키워드가 붙은 멤버는 또하나의 특징을 갖고있습니다.

위의 경우는 다른 Class에서 static 키워드를 호출하는 경우인데요. 

그렇다면 같은 클래스내에 있는 메소드에서 static 멤버를 호출하는 경우는 어떻게될까요?

클래스 내부에서 호출하기 위해서는 한가지 조건이 따릅니다.

static 메소드를 호출하는 메소드 또한 static으로 선언되어야 한다.


동일 클래스 내부에서 static 키워드 호출하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class StaticTest {
    int x = 10;
    static int y = 20;
    
    public static void main(String[] args) {
        m1(); //에러발생1
        m2();
    }
    
    public void m1() {
        System.out.println(x+y);
    }
    
    public static void m2() {
        System.out.println(x+y); // 에러발생1
    }
}
cs


에러발생 1

- 이 부분은 static키워드가 붙은 메인메서드에서 일반 메소드인 m1을 호출하려 하였기 때문에 발생합니다. 위의 설명처럼 m1 메소드에 static 키워드를 붙이면 에러가 사라집니다.


에러발생 2

- 이 부분도 마찬가지로 static 키워드에서 일반 변수인 x의 값에 접근하려하였기 때문에 에러가 발생합니다. x에 static 키워드를 붙이거나 m2에서 static 키워드를 제거해주면 에러는 사라집니다. 하지만 m2의 static 키워드를 떼버리면!! 메인메서드에서 m2를 실행시킬수는 없겠죠?




댓글

Designed by JB FACTORY