본문 바로가기
JAVA & Spring

[Java] static변수와 static메서드 총 정리(+그림&코드)

by 알기 쉬운 코딩 사전 2025. 1. 22.
반응형

✅  참고

static을 정확하게 이해하려면 자바 메모리 구조에 대한 이해가 필요합니다.
자바 메모리 구조에 대해 잘 모르신다면 🔗그림으로 아주 쉽게 정리한 자바 메모리 구조를 참고해 주세요.

 


 

static

Java에서 static해당 변수 혹은 메서드를 자바 메모리의 메모리 영역에 할당 시켜,
클래스 간에 서로 공유 가능하게 하기 위해 사용되는 키워드(예약어)입니다.

 


 

static 변수

변수에서 static이 필요한 이유

아래 코드는 Data1 클래스를 통해서 생성된 객체의 수를 세는 단순한 코드입니다.
 
인스턴스 내부 변수 count를 저장하며, 객체가 생성될 때 마다 생성자를 통해 count 값을 증가시킵니다.

public class Data1 {
    public String name;
    public int count;

    public Data1(String name) {
        this.name = name;
        count++;
    }
}

 
객체를 생성하고 카운트 값을 출력합니다.

public class DataCountMain1 {
    public static void main(String[] args) {
        Data1 data1 = new Data1("A");
        System.out.println("A count=" + data1.count);

        Data1 data2 = new Data1("B");
        System.out.println("B count=" + data2.count);

        Data1 data3 = new Data1("C");
        System.out.println("C count=" + data3.count);
    }
}

 
실행 결과

A count=1
B count=1
C count=1

생성자를 통해 count를 증가시켰지만, count의 값은 모두 1이 나왔습니다.
 
그러한 이유는 객체를 생성할 때 마다 Data1의 인스턴스는 힙 영역에 각각 만들어지기 때문입니다.
즉, 인스턴스가 각각 만들어졌기 때문에 count 멤버 변수를 서로 공유하지 못하는 문제가 발생합니다.

static 변수

아래 코드는 위의 코드와 동일합니다.
 
다만, count 변수 앞에 static 키워드를 사용하였습니다.

public class Data3 {
    public String name;
    public static int count; // static

    public Data3(String name) {
        this.name = name;
        count++;
    }
}

 
객체를 생성하고 카운트 값을 출력합니다.

public class DataCountMain3 {
    public static void main(String[] args) {
        Data3 data1 = new Data3("A");
        System.out.println("A count=" + Data3.count);

        Data3 data2 = new Data3("B");
        System.out.println("B count=" + Data3.count);

        Data3 data3 = new Data3("C");
        System.out.println("C count=" + Data3.count);
    }
}

 
실행 결과

A count=1
B count=2
C count=3

count의 값이 정상적으로 증가합니다.
 
그러한 이유는 static이 붙은 멤버 변수 count는 메서드 영역에서 관리합니다.
즉, 객체를 생성할때 마다 count는 메서드 영역에서 하나씩 증가하게 됩니다.

이를 통하여 count 변수를 객체간에 공유할 수 있게 되었습니다.
 


 

static 메서드

메서드에서 static이 필요한 이유

아래 코드는 문자열을 입력받아 앞 뒤에 *을 붙여서 반환하는 deco() 메서드입니다.

public class DecoUtil1 {
    public String deco(String str){
        String result = "*" + str + "*";
        return result;
    }
}

 
객체를 생성하고 해당 메서드를 통해 결과값을 받습니다.

public class DecoMain1 {
    public static void main(String[] args) {
        String s = "hello java";
        DecoUtil1 utils = new DecoUtil1();
        String deco = utils.deco(s);

        System.out.println("before: " + s);
        System.out.println("after: " + deco);
    }
}

 
실행 결과

before: hello java
after: *hello java*

 
deco() 메서드는 기능만 제공하는 메서드입니다.
하지만 기능을 사용하기 위해서는 DecoUtil1의 인스턴스를 먼저 생성해야 한다는 불편함이 있습니다.
 

static 메서드

아래 코드는 위의 코드와 동일합니다.
 
다만, deco() 메서드 앞에 static 키워드를 사용하였습니다.

public class DecoUtil2 {
    public static String deco(String str){
        String result = "*" + str + "*";
        return result;
    }
}

 
객체를 생성하지 않고 메서드를 통해 결과값을 받을 수 있습니다.

public class DecoMain2 {
    public static void main(String[] args) {
        String s = "hello java";
        String deco = DecoUtil2.deco(s);

        System.out.println("before: " + s);
        System.out.println("after: " + deco);
    }
}

 
실행 결과

before: hello java
after: *hello java*

실행 결과 역시 동일합니다.
 


 

static 메서드 사용법

static 메서드는 인스턴스의 기능을 사용할 수 없습니다.
 
인스턴스의 기능을 사용하려면 인스턴스의 참조값을 알아야 하는데,
정적 메서드는 자바 메모리의 메서드 영역에서 관리되며, 참조값 없이 호출하기 때문입니다.

  • static 메서드는 static만 사용할 수 있습니다.
  • 반대로 모든 곳에서 static을 호출할 수 있습니다.

 
 

반응형

댓글