본문 바로가기
Programming/Java

[Java] 9. static

by Rayched 2022. 12. 21.

1. 'static'

① 'static'의 정의

- Java에서 사용되는 키워드 중 하나

- Class 내부의 변수나 함수에 'static'을 붙이는 것으로

   해당 변수나 함수는 객체를 생성하지 않고 바로 사용할 수 있다.

- 객체 생성 없이 바로 사용할 수 있으므로

   프로그램 내에서 공통적으로 사용되는 데이터를 관리할 때 이용한다.

//'static' 사용 예시

public class Main {
    public static void main(String[] args) {
        Sample.A = 15;
        Sample.talk();
        //별도의 인스턴스 생성 없이
        //'Sample' class가 가진 변수와 함수 사용가능
        System.out.printf("A의 값: %d", Sample.A);
    }
}

class Sample {
    static int A;
    static void talk(){
        System.out.println("안녕하세요.");
    }
    //'static'이 붙은 변수 A와 함수 talk()는
    //프로그램이 실행되고 클래스가 메모리에 올라갈 때
    //자동적으로 생성되므로 new 연산자를 통한 인스턴스 생성이 필요없다.
}

인스턴스 생성 없이도 클래스 맴버를 쓸 수 있다.


② static 변수와 static 함수

(1). static 변수

- 클래스를 통해서 생성되는 모든 인스턴스가 공통적으로 같은 변수 값을 가져야하는 경우에 'static' 키워드를 붙인다.

- static이 붙은 클래스 변수는 클래스가 메모리에 올라갈 때, 자동적으로 생성되기 때문에

  별도의 인스턴스를 생성하지 않고 바로 사용할 수 있다.

 

(2). static 함수

- static이 붙은 함수도 클래스의 객체를 생성하지 않고 바로 사용할 수 있지만

  객체가 가진 변수는 해당 객체를 생성해야만 존재한다.

- static 함수는 클래스의 일반 맴버 변수를 사용해서는 안된다.

 

(3). static 함수 보충 설명

아래의 코드는 static 함수가 왜 클래스의 일반 맴버 변수를 사용할 수 없는지에 대한 설명을 하기위한 예시이다.

public class Main {
    public static void main(String[] args) {
        Count aCount = new Count();
        aCount.dan1();
        aCount.dan2();
        Count.dan3();
        Count.dan4();

    }
}

class Count {
    int A = 5;
    int B = 10;

    static int c = 15;
    static int d = 20;

    //static 변수 X, 함수 X
    int dan1(){
        System.out.println(A+B);
        return 0;
    }
    //static 변수 O, 함수 X
    int dan2(){
        System.out.println(c+d);
        return 0;
    }
    //static 변수 X, 함수 O
    static int dan3(){
        System.out.println(A+B);
        return 0;
    }
    
    //static 변수 O, 함수 O
    static int dan4(){
        System.out.println(c+d);
        return 0;
    }
}

해당 프로그램은 실행되지 않고, 컴파일 에러가 발생하고

아래와 같은 에러 메시지가 나오는 것을 확인할 수 있을 것이다.

일단 컴파일 에러가 발생한 것은 지극히 정상적인 결과이다.

 //static 변수 X, 함수 O
    static int dan3(){
        System.out.println(A+B);
        return 0;
    }
  //A와 B는 static이 붙지 않은 변수이다.

static 함수 dan3는 프로그램이 실행될 때, 객체화가 되어있는 상태이다.

그리고 변수 A와 B는 객체에 포함된 변수로, 객체가 생성되어야만 메모리에 올라간다.

즉, 이미 객체화가 된 함수 dan3은 두 변수가 메모리에 올라갔는 지 여부를 파악하지 못하는 상태에서

두 변수 A, B의 현재 값을 더하라고 명령하고 있으니 컴파일 에러가 발생하는 것이다.

 

"static 함수는 static 변수만 사용할 수 있다."

 

하지만 반대로 클래스의 맴버 함수는

클래스의 맴버 변수만이 아니라,  static이 붙은 변수를 써도

문제가 되지 않는다.

이를 증명하기 위해서 함수 dan3를 주석처리하고

프로그램을 실행해보자.

public class Main {
    public static void main(String[] args) {
        Count aCount = new Count();
        aCount.dan1();
        aCount.dan2();
        //Count.dan3();
        Count.dan4();

    }
}

class Count {
    int A = 5;
    int B = 10;

    static int c = 15;
    static int d = 20;

    //static 변수 X, 함수 X
    int dan1(){
        System.out.println(A+B);
        return 0;
    }
    //static 변수 O, 함수 X
    int dan2(){
        System.out.println(c+d);
        return 0;
    }
    /*
    //static 변수 X, 함수 O
    static int dan3(){
        System.out.println(A+B);
        return 0;
    }*/

    //static 변수 O, 함수 O
    static int dan4(){
        System.out.println(c+d);
        return 0;
    }
}

별도의 에러없이 정상적으로 실행되는 것을 확인할 수 있다.


③ main 메소드에 static이 붙은 이유

이제 static에 대한 기본적인 것을 알았으니

추가적으로 main 메소드에 왜 static이 붙었는지를 간단하게 알고 끝내자.

일단 Java의 규칙 상 main 메소드는 제일 먼저 실행되어야 한다.

여기서 main 메소드에 static이 붙어있지 않다면

외부에서 다른 객체가 main 메소드를 호출해야만 한다.

다만 이렇게 되면 main 메소드가 제일 먼저 실행되어야 하는

Java의 규칙에 어긋나기 때문에 'static' 키워드를 붙여서외부에서 별도로 main 메소드를 호출하지 않아도프로그램을 실행하면 자동으로 메모리에 main 메소드가 할당되게 하는 것으로

Java의 규칙을 지킬 수 있다.


 

'Programming > Java' 카테고리의 다른 글

[Java] 11. 생성자 (Constructor)  (0) 2023.01.16
[Java] 10. 상속 (Inheritance)  (0) 2022.12.22
[Java] 8. Scanner  (0) 2022.12.04
[Java] 함수, 메소드  (0) 2022.11.30
[Java] 7. 클래스와 객체 (Part 2)  (0) 2022.11.21