개발공부/JAVA

[JAVA] 클래스 - 정적 멤버(static)

jnnjnn 2024. 3. 5. 17:03

1. 정적 멤버

 

자바는 클래스 로더를 이용해서 클래스를 메소드 영역에 저장하고 사용한다. 클래스 파일의 바이트가 로드되는 곳이기 때문에 메소드 영역은 클래스 영역, 스태틱 영역이라고도 한다. 정적 멤버들은 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다. 그렇기 때문에 정적 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능하다.

 

 

2. 정적 멤버 선언

필드와 메소드는 모두 정적 멤버가 될 수 있다. 정적 멤버를 선언하려면 static 키워드를 앞에 붙여주면 된다.

public class Car{
// 정적 필드 선언
static String tire;

// 정적 메소드 선언
static void run(){}
}

 

객체마다 가지고 있을 필요가 없는 공용적인 필드는 정적 필드로 선언하는 것이 좋다. 또, 인스턴스 필드를 이용하지 않는 메소드는 정적 메소드로 선언하는 편이 좋다.

 

3. 정적 멤버 사용

 

정적 멤버는 객체 참조 변수로도 접근이 가능하지만 클래스 이름으로 접근하는 것이 정석이다.

public class C01Static {
    public static void main(String[] args) {
        C01MyClass o1 = new C01MyClass();
        o1.name = "son";
        C01MyClass o2 = new C01MyClass();
        o2.name = "lee";

        // 참조변수로 static 멤버(필드, 메소드) 사용 권장하지 않음
//        o1.location = "seoul";
        C01MyClass.location = "seoul"; // 권장되는 방법

        System.out.println(C01MyClass.location);
        System.out.println(o2.location);

        // static 메소드는 클래스로 접근해서 실행시키는 것을 권장
        o1.method2();
        C01MyClass.method2();
    }
}

class C01MyClass {
    // 인스턴스 필드 (인스턴스 변수)
    String name;

    // static 필드 (class 변수)
    static String location;

    // 인스턴스 메소드
    void method1() {

    }

    static void method2() {

    }
}

 

4. 인스턴스 사용 불가

정적 메소드와 정적 필드는 객체가 없어도 실행된다는 특징 때문에 내부의 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 객체 자신의 참조인 this도 사용할 수 없다. 

 

정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 정적 메소드 내부에서 객체를 먼저 생성하고 참조 변수로 접근해야 한다.

 

public class Car {
    int speed;

    void run() {
        System.out.println(speed + "으로 달립니다");
    }

    static void stimulate() {
        Car myCar = new Car();
        myCar.speed = 200;
        myCar.run();
    }
    }

 

당연하게도 인스턴스 메소드와 인스턴스 필드는 정적 멤버를 사용할 수 있다.