정적 멤버

Heidi·2023년 6월 14일
0

프로그램을 작성하다보면 여러 개의 객체가 하나의 변수를 공유해야되는 경우가 있다. 이러한 멤버를 정적 멤버(static member) 또는 클래스 멤버라고 한다. 필드(변수)를 정의할 때 static을 붙이면 정적 멤버가 된다.

프로그램에서 객체들마다 개별적으로 소유해야 하는 멤버들도 있고, 객체들이 공유하는 멤버도 있다. 객체마다 별도로 소유하는 멤버를 인스턴스 멤버라고 한다. 반면 하나의 멤버를 다른 객체와 공유할 수도 있는데, 이것을 정적 멤버라고 한다.

class Television {
	int channel;
    int volume;
    boolean onOff;
    static int count;
}

=> channel, volume, onOff는 모두 인스턴스 변수이다. 이 클래스로 객체를 여러 개 생성했을 때, 각 객체는 인스턴스 변수에 대해 독립적인 기억 공간을 갖고 있으며, 각기 다른 값을 가질 수 있다.

정적 변수는 클래스당 하나만 생성되는 변수이다. (객체가 변수를 공유하니까 그렇겠지?) 정적 변수를 만들려면 변수를 정의할 때 앞에 static을 붙이면 된다. 동일한 클래스로 생성된 모든 객체들은 하나의 정적 변수를 공유한다.

정적 변수는 객체 없이도 사용이 가능하다. 정적 멤버를 사용하려면 단순히 클래스 이름 뒤에 점 연산자(.)를 붙이면 된다.

Television.count = 100;

객체가 있다면 객체의 이름을 통해서도 접근이 가능하다.

Television obj = new Television();
obj.count = 100; 

(근데 어차피 하나만 생성된 같은 변수니까 접근하는 방법만 다른 거임)

정적 변수의 생성 시기

정적 변수는 객체의 생성과는 상관없이 클래스가 JVM에 적재되는 순간 생성된다. 객체가 사라져도 정적 변수는 없어지지 않는다. 정적 변수는 프로그램이 종료되어야 비로소 소멸된다.

반면 인스턴스 변수는 객체가 생성되어야 비로소 만들어진다. 또한 객체가 소멸되면 인스턴스 변수도 없어진다. 인스턴스 변수는 객체 생성 후에만 사용이 가능하다.

public class Pizza {
private String toppings;
private int radius;
static final double PI = 3.141592;
static int count = 0;

public Pizza(String toppings) {
    this.toppings = toppings;
    count++;
}

}
public class PizzaTestofPizza {
public static void main(String[] args) {
Pizza p1 = new Pizza("Super Supreme");
Pizza p2 = new Pizza("Cheese");
Pizza p3 = new Pizza("Pepperoni");

    int n = Pizza.count;

    System.out.println("지금까지 판매된 피자 개수 = " + n);
}

}

=> 내가 궁금한 점 : 어떻게 int count가 피자의 갯수를 나타내게 되지?
=> count++기 때문에 객체가 한번 생성될때마다 1씩 증가함 + static int라서 모든 객체가 같은 int의 값을 공유함

다음에서는 static final double PI 에 대해서 살펴보자

정적 메소드

변수와 마찬가지로 메소드도 정적 메소드로 만들 수 있다. 정적 메소드도 정적 변수와 마찬가지로 static 수식자를 메소드 앞에서 붙여서 만든다. 정적 메소드도 굳이 클래스를 만들고 객체를 생성할 필요가 없음.

정적 메소드는 정적 멤버만 사용할 수 있다. - 정적 메소드는 객체가 생성되지 않아도 사용할 수 있음. 따라서 객체가 생성된 후에야 생성되는 인스턴스 멤버를 사용하면 안 됨.

class Test {
	int a; //인스턴스 변수
    static int b; //정적 변수
    
    void sub1(){ a = 0; } // 가능
    static void sub2() { a = 0; } // 불가능 
}

=> static void sub2()는 정적 메소드인데, int a는 인스턴스 변수기 때문에 컴파일 오류.
참고로 main() 도 정적 메소드임.

정적 메소드의 예는 Math 클래스에 들어있는 각종 메소드들이다. 이들은 정적 메소드로 정의되는데, 실수의 제곱근을 구하는데 굳이 Math 클래스의 객체를 생성할 필요가 없기 때문이다. 따라서 Math.sqrt(); 이런 식으로 호출함.

0개의 댓글

관련 채용 정보