본문 바로가기
JAVA

[JAVA] Chapter 8. Class Variable & Class Method

by varcode 2023. 7. 10.

① static 변수
static 변수는 클래스가 처음 load 될 때 생성되며, 모든 인스턴스들이 공유하여 사용하게 된다. Instance의 멤버 변수와는 달리 Instance를 생성하지 않아도 사용 가능하며 클래스 이름으로 직접 접근이 가능하다. Static 변수는 같은 이름으로 하나만 생성할 수 있다.

 

class StaticTest {
    static int var = 0;
    public StaticTest() {
        System.out.println(var++);
    }
}

public class StaticVar1 {
    public static void main(String[] args) {
        StaticTest st1 = new StaticTest();
        StaticTest st2 = new StaticTest();
        StaticTest st3 = new StaticTest();
    }
}

위 코드의 결과는 무엇일까?
static
변수는 여러 개의 인스턴스에서 공유되는 변수로, 클래스 레벨에서 하나만 존재한다. 따라서 변수의 선언문이 실행될 때 메모리에 변수의 자리가 생기는데, static 변수는 하나만 만들어지기 때문에 두 번째 static int var 코드부터는 무시한다. 이에 따라 위 코드를 실행하면 1, 1, 1이 아닌 1, 2, 3이 출력된다.

 

Static 변수는 인스턴스 생성과 독립적으로 공유되기 때문에 클래스와 관계없이 사용할 수 있다는 특징이 있으며, 클래스 레벨에서 사용되는 값이나 객체를 저장하기 위해 많이  활용된다. 이러한 특징 때문에 Static 변수는 클래스 변수(Class Variable)라고도 불린다.

 

class StaticTest {
    static int rst = 1000;
    public StaticTest() {
        rst += 100;
    }
}

public class StaticVar2 {
    public static void main(String[] args) {
        int result = StaticTest.rst - 200;
        System.out.println(result);
    }
}

클래스를 사용할 때는 먼저 인스턴스를 생성해야 하지만, static 변수는 클래스의 인스턴스와 독립적으로 공유되므로, 인스턴스를 생성하지 않고도 사용할 수 있다. 이는 메모리에 자동으로 할당되기 때문이다.

Java에서 static 변수를 사용할 때는 클래스 이름을 통해 접근한다. eclipse와 같은 IDE에서는 static 변수를 이탤릭 체로 표시하여 구분하기 쉽게 한다.

위 코드에서는 StaticTest 클래스의 인스턴스를 생성하지 않고 StaticTest.rst를 사용하고 있기 때문에, 생성자가 호출되지 않는다. 따라서 결괏값은 1000에서 200을 뺀 800이 된다.

 

class StaticTest {
    static int rst = 1000;
    public StaticTest() {
        rst += 100;
    }
}

public class StaticVar3 {
    public static void main(String[] args) {
        StaticTest st = new StaticTest();
        System.out.println(st.rst);
        
        int result = StaticTest.rst - 200;
        System.out.println(result);
    }
}

위 코드는 static 변수를 사용할 때 지켜야 할 규칙을 위배한 예시이다. 예시에서는 클래스의 인스턴스를 생성한 뒤 인스턴스의 참조 변수를 통해 static 변수에 접근하는 방식을 사용하고 있다. 이러한 방식으로 static 변수에 접근하면 동료들이 rst를 인스턴스 변수로 착각할 가능성이 있다.

Java에서 static 변수를 사용할 때는 클래스 이름을 통해 접근해야 하며, static 변수의 이름은 대문자로 시작해야 한다. , 위 예시에서는 StaticTest.rst와 같이 클래스 이름을 통해 static 변수에 접근해야 한다.

 

 

 Static Method

static 변수가 Class Variable이라고 불리듯이, Static MethodClass Method라고 불린다. Static Method를 사용할 때는 굉장히 큰 제약 조건이 있는데, static 메서드의 중괄호 안에서는 static 변수와 static 메서드"" 사용할 수 있다는 점이다. 이는 인스턴스 변수와 인스턴스 메서드는 사용하지 못한다는 의미인데, 인스턴스 변수는 객체가 생성될 때마다  새로운 메모리 공간을 할당받기 때문에 static method에서는 사용할 수 없다.

Class를 생성할 때마다 인스턴스가 생성되기 때문에 해당 인스턴스에 접근할 때 특정 인스턴스임을 구분할 수 있는가, 없는가를 기준으로 이해하면 된다.

 

static 개념을 이해하고 나면, 다음과 같은 궁금증이 해결된다. class는 생성을 해야 사용할 수 있다고 했는데, main이 포함된 class는 생성된 적이 없는데 어떻게 호출되는가? main 함수를 살펴보면 앞에는 늘 static이 붙어 있었다. 메모리에 스스로 올라가기 때문에 호출할 수 있는 것이다.

 

 

※ System.out.println()

System.out을 살펴보면, out은 뒤에 소괄호 없으므로 변수이고 System은 대문자로 시작하므로 클래스이다. out 변수를 클래스 이름으로 접근하였으므로 outstatic 변수이다.

out.println()을 살펴보면, out을 통해 println() method에 접근하였으므로 out reference 변수이다. , out은 어떤 클래스 타입으로 선언된 static 변수이다. (PrintStream 타입으로 선언된 클래스이다.)

'JAVA' 카테고리의 다른 글

[JAVA] Chapter 10. Array  (0) 2023.07.12
[JAVA] Chapter 9. String  (0) 2023.07.11
[JAVA] Chapter 7. Class (3)  (0) 2023.07.09
[JAVA] Chapter 7. Class (2)  (0) 2023.07.08
[JAVA] Chapter 7. Class (1)  (0) 2023.07.07

댓글