static 키워드는 클래스 단위로 관리 되는 요소인다. 인스턴스에 귀속되지 않고 클래스 자체에 귀속된다.
static 변수는 프로그램이 시작할때 메모리에 할당되고
프로그램이 종료될 때까지 유지된다.
클래스가 로드될때 메모리의 메소드 영역에 할당되기 때문이다.
하지만 남용해서 사용하게 된다면
객체지향 프로그래밍의 원칙과 상반되고(객체 보다는 기능 중심으로 설계가된다는 의미),
메모리 사용량 증가로 이어질 수 있다. 그래서사용할때 신중하게 결정해야한다.
static 변수는 클래스 레벨에서 선언되고, 모든 인스턴스에 의해 공유된다.
인스턴스화 없이 클래스 이름을 통해 직접 호출할수있다.
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
static으로 선언된 add 메소드는
MathUtils.add(5, 3)
인스턴스화 없이도 사용할 수 있다.
static 변수 ( 클래스 변수 ) : 보통 상수 또는 공용 자원 등에 사용
static 메서드 : 클래스 명으로 호출 가능
단. 내부에서 인스턴스 변수나 메서드 사용불가( 인스턴스가 없기 때문)
static 클래스 : 클래스 자체에 스태틱을 붙일 수는 없지만, 중첩 클래스에서는 사용 가능하다
class Outer {
static class Inner {
void sayHi() {
System.out.println("Hi");
}
}
}
static 키워드는 유용하지만, 사용은 신중하게 해야한다.
static에 대해서 찾아보게된 계기 :
키오스크를 만드는 과정에서 햄버거와 음료, 디저트를 선택을 해서
선택된 음식들을 출력하게 만들려고 했는데
햄버거를 클릭하고 난뒤에 다른 음식을 선택하게 되면 햄버거와 같이 붙어서 출력되는 문제가 있어서 그것을 해결하고자
출력을 다하면 menuItems를 지우는 방식으로 붙어서 나오는 문제를 해결을 했었다.
menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
menuItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
for (MenuItem burger : menuItems) {
System.out.println("메뉴 : " + burger.name);
System.out.println("가격 : " + burger.price);
System.out.println("설명 : " + burger.explanation);
}
menuItems.clear();
그런데 그냥 출력만 하는 과정에서는 큰 문제가 없었는데
이제 출력된 메뉴중에서 한 가지의 음식을 선택하려고 할때
매번 menuItems를 초기화하니 분류과정에서 매번 값이 나오지 않는 결과가 있었다.
그래서 리스트를 static으로 설정을 하고 난 뒤에 menuItems.clear()를 지우니까
붙어서 나오던 결과가 해결이 되었다.