Java에서 static은 프로그램이 빌드 될 때 메모리 영역에 할당되어 프로그램이 종료될 때까지 메모리 영역에 있는 것을 의미한다. 이해를 돕기 위하여 코드로 확인해 보자.
public class MyCalculator {
public static appName = "MyCalculator";
public static int add(int x, int y) {
return x + y;
}
public int min(int x, int y) {
return x - y;
}
}
MyCalculator.add(1, 2); // static 메소드 이므로 객체 생성 없이 사용 가능
MyCalculator.min(1, 2); // static 메소드가 아니므로 객체 생성후에 사용가능
MyCalculator cal = new MyCalculator();
cal.add(1, 2); // o 가능은 하지만 권장하지 않는 방법
cal.min(1, 2); // o
static 변수에는 public 및 final과 함께 사용되는 예제가 많은데 이유는 무엇일까? 일반적으로 Static은 상수의 값을 갖는 경우가 많으므로 public으로 선언하여 사용하는 이유 때문이다.
public class Person {
public static final String name = "MangKyu";
public static void printName() {
System.out.println(this.name);
}
}
Static Method는 객체의 생성 없이 호출이 가능하며, 객체에서는 호출이 불가능합니다.
일반적으로는 유틸리티 관련 함수들은 여러 번 사용되므로 static 메소드로 구현을 하는 것이 적합한데,
static 메소드를 사용하는 대표적인 Util Class로는 java.uitl.Math가 있습니다
public class Test {
private String name1 = "Mveloper";
private static String name2 = "Mveloper";
public static void printMax(int x, int y) {
System.out.println(Math.max(x, y));
}
public static void printName(){
// System.out.println(name1); 불가능한 호출
System.out.println(name2);
}
}
우리는 두 수의 최대값을 구하는 경우에 Math클래스를 사용하는데, static 메소드로 선언된 max 함수를 초기화 없이 사용합니다.
하지만 static 메소드에서는 static이 선언되지 않은 변수에 접근이 불가능한데,
메모리 할당과 연관지어 생각해보면 당연합니다. 우리가 Test.printName() 을 사용하려고 하는데,
name1은 new 연산을 통해 객체가 생성된 후에 메모리가 할당됩니다.
하지만 static 메소드는 객체의 생성 없이 접근하는 함수이므로, 할당되지 않은 메모리 영역에 접근을 하므로
문제가 발생하게 됩니다. 그러므로 static 변수에 접근하기 위한 메소드는 반드시 static 메소드가 되어야 합니다.
출처 : https://mi-nya.tistory.com/251 (망나니 개발자)