static
이라는 키워드를 사용하면 static 변수와 static 메서드를 만들 수 있는데 다른말로 정적 필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 한다. 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
static 키워드를 통해 생성된 정적 멤버들은 heap 영역이 아닌 static 영역에 할당된다. 객체 생성시에 할당된 Heap 영역의 메모리는 Garbage Collector를 통해 수시로 관리받는 반면, static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재해 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다. static을 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 된다.
static 변수는 메모리에 한번 할당되면 프로그램이 종료될 때 해제되는 변수로, 메모리에 한번 할당되면 객체를 생성하지 않고도 여러 객체가 해당 메모리를 공유하게 된다.
static 타입 변수명 = 초기값;
static 변수 사용여부
static 변수를 사용할지 판단 기준은 공용으로 사용되는지 아닌지에 따라 필드나 메서드를 생성 시 인스턴스로 생성할 것인지 정적으로 생성할 것인지로 구분하면 된다.
객체의 생성 없이 호출이 가능하며, 호출 시에는 클래스이름.메서드이름()
으로 호출한다. static 메서드 내에서는 인스턴스 변수를 사용할 수 없다. 보통 유틸리티성 메서드를 작성할 때 많이 사용된다.
static 반환타입 함수이름(매개변수목록) { ... }
static 메서드 사용여부
인스턴스변수를 사용하지 않을 때 static 메서드를 사용할 수 있고 인스턴스 변수를 사용하는 경우는 static 키워드를 붙이면 안된다.
💡 왜 static 메서드는 인스턴스 변수를 사용하지 못할까?
인스턴스 변수는 new 연산을 통해 객체 생성 후 메모리에 할당이 된다. 반면 static 메서드는 객체 생성 없이 접근하는 함수이다. 그렇기 때문에 static 메서드에서 인스턴스 변수를 접근하면 할당되지 않은 메모리 영역에 접근한다는 문제가 발생한다.
💡 main 메소드가 public static인 이유
static인 이유 : 인스턴스 생성과 관계없이 제일 먼저 호출되는 메소드이다.
public인 이유 : main 메소드의 호출 명령은 외부로부터 시작되는 명령이다.
[출처]
자바의 정석 - https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp