프로그래밍/기타

Java의 static 변수

knxwledge 2025. 4. 11. 21:06

Static하지 않은 변수

Java에서 class 내 static하지 않은 변수나 메서들은 각각의 인스턴스와 관련이 있으며 인스턴스를 통해서만 액세스를 할 수 있다. 

 

예시로 다음과 같이 Fish라는 물고기 클래스를 정의하였다. 물고기한테는 이름 변수와 swim() 메서드가 있다.

class Fish{
    String name;
    public void swim(){
        System.out.println(name+" swims!");
    }
}

 

그 후 main에서 nemo라는 인스턴스를 생성하여 swim()을 호출하면 nemo swims!가 출력된다.

class Main {
    public static void main(String[] args) {
        Fish nemo = new Fish();   // 새로운 Fish nemo를 만든다
        nemo.name = "nemo";       // nemo의 이름을 nemo로 한다
        nemo.swim();              // nemo의 swim 메서드를 호출한다
    }
}
//출력결과: nemo swims!

 

그러나 swim은 static하지 않기 때문에 Fish 클래스 자체를 통해 호출할 수는 없다. 다음과 같은 코드는 오류를 낼 것이다.

class Main {
    public static void main(String[] args) {
        Fish.swim();
    }
}
// 출력결과: 에러

Static한 변수

Java에서 static한 변수들은 class 자체와 관련이 있으며 class를 통해 호출할 수 있다. 개별 인스턴스와는 독립적이다.

 

이제 Fish에 static 변수를 추가해 보자. 여태까지 만들어졌던 모든 물고기의 수를 세는 fishCount를 만들것이다.

//..
private static int fishNum = 0;
//...

 

클래스 밖에서 fishNum이 변형 된다면 물고기 수를 잘못 셀 수 있다. 때문에 private 변수로 만드는 것이 좋다. 그리고 다음과 같이 public한 getFishNum 메서드로 밖에서 fishNum을 읽을 수 있게 하면 된다.

//...
private static int fishNum = 0;
public static int getFishNum(){
    return fishNum;
}
//...

 

마지막으로 Fish() constructor를 통해서 Fish가 만들어질 때마다 fishNum을 1씩 증가시킨다.

//...
private static int fishNum = 0;

public static int getFishNum(){
    return fishNum;
}

public Fish(){
  fishNum ++;
}
//...

 

원 코드와 합쳐서 nemo를 만들기 전, nemo를 만든 후에 getFishNum을 한 번씩 실행해 보자.

class Fish{
    private static int fishNum = 0;
    
    public Fish(){
      fishNum ++;
    }
    
    public static int getFishNum(){
        return fishNum;
    }
    
    String name;
    public void swim(){
        System.out.println(name+" swims!");
    }
}

class Main {
    public static void main(String[] args) {
        System.out.println("fishNum: "+ Fish.getFishNum());  // nemo 생성 전
        Fish nemo = new Fish();
        nemo.name = "nemo";
        // nemo.swim();
        System.out.println("fishNum: "+ Fish.getFishNum());  // nemo 생성 후
    }
}

 

0과 1이 정상적으로 출력된다.

 

nemo 인스턴스에서 fishNum을 호출할 수도 있는데, 이 방법은 프로그래머를 헷갈리게 할 수 있으므로 피하는 것이 좋다.

class Main {
    public static void main(String[] args) {
        Fish nemo = new Fish();
        System.out.println("fishNum: "+ nemo.getFishNum());
    }
}
// 출력결과: 1