[JAVA] static에 대해 알아보자

henu·2024년 12월 16일

static 변수

특정 클래스에서 고용으로 함께 사용할 수 있는 변수를 만들 수 있다면 편하게 사용할 수 있을 것이다.
static 키워드를 사용하면 공용으로 함께 사용하는 변수를 만들 수 있다.

public class Data {
	public String name;
    public static int count;
    
    public Data(String name) {
    	this.name = name;
        count++;
    }
}
  • static int count 부분을 보면 변수타입(int) 앞에 static 키워드가 붙어있다.
  • 이렇게 멤버 변수에 static을 붙이게 되면 static 변수, 정적 변수 또는 클래스 변수라고 한다.
public class Main {
	Data data1 = new Data("A");
    System.out.println("A count = " + Data.count);
	Data data2 = new Data("B");
    System.out.println("B count = " + Data.count);
    Data data3 = new Data("C");
    System.out.println("C count = " + Data.count);
}

결과

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

  • static이 붙은 멤버 변수는 메서드 영역에서 관리한다.
    - static이 붙은 멤버 변수 count는 인스턴스 영역에 생성되지 않는다. 대신에 메서드 영역에서 이 변수를 관리한다.
  • Data("A") 인스턴스를 생성하면 생성자가 호출된다.
  • 생성자에는 count++코드가 있다. count는 static이 붙은 정적 변수이기 때문에 인스턴스 영역이 아닌 메서드 영역에 있는 count의 값이 하나 증가된다.

  • Data("B") 인스턴스를 생성하면 생성자가 호출된다.
  • count++코드가 있고 static이 붙은 정적변수이기 때문에 count의 변수의 값이 하나 증가한다.

이 과정을 한번 더 반복해 count 변수의 값은 3이 된다.

static 메서드

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

메서드 앞에 static이 붙어있다. 이렇게 하면 정적 메서드를 만들 수 있다. 이 정적 메서드는 정적 변수처럼 인스턴스 생성 없이 클래스 명을 통해서 바로 호출할 수 있다.

public class Main {
	public static void main(String[] args) {
    	String s = "hello java";
        String deco = DecoUtil.deco(s);
        System.out.println("before: " + s);
        System.out.println("after: " + deco);
    }
}

실행결과

before: hello java
after: *hello java*
  • 인스턴스 메서드 : static이 붙지 않은 멤버 메서드
  • 클래스 메서드 : static이 붙은 멤버 메서드
    - 클래스 메서드, 정적 메서드, static 메서드 등으로 부른다.

static 메서드는 static 변수와 마찬가지로 클래스를 통해 바로 접근할 수 있고, 인스턴스를 통해서도 접근할 수 있다.

import static을 통해서 클래스명을 생략하고 메서드를 사용할 수 있다.

정적 메서드에서는 인스턴스 메서드 또는 변수가 생성되기 전에 생성되기 때문에 정적 변수 또는 정적 메서드만 사용할 수 있다. (파라미터로 주입하면 사용할 수 있다.)

profile
주니어 백엔드 개발자입니다

0개의 댓글